From 224b426d70832b89cfebbbcbc939126ed91aa933 Mon Sep 17 00:00:00 2001 From: YAMAMOTO Takashi Date: Tue, 29 Jul 2025 11:33:28 +0900 Subject: [PATCH 001/103] doc/build_wasm_app.md: restore the recommendation of exact version match (#4518) the intention of the original text was to recommend to use the exactly same version (eg. 2.4.1) regardless of AOT_CURRENT_VERSION. --- doc/build_wasm_app.md | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/doc/build_wasm_app.md b/doc/build_wasm_app.md index c717c98e58..3c4b519b64 100644 --- a/doc/build_wasm_app.md +++ b/doc/build_wasm_app.md @@ -382,9 +382,11 @@ a non-compatible`AOT_CURRENT_VERSION`. We try our best to maintain our runtime ABI for AoT-compiled modules compatible among WAMR versions with compatible `AOT_CURRENT_VERSION` so that combinations of older wamrc and newer runtime usually work. -However, there might be minor incompatibilities time to time. -For productions, we recommend to use compatible versions of -wamrc and the runtime. + +However, there might be minor incompatibilities from time to time. For +example, we usually avoid bumping the version when making a change which +affects only a small fraction of users. For productions, we recommend +using exactly same versions of wamrc and the runtime. | WAMR version | AOT_CURRENT_VERSION | Compatible AOT version | | | ------------ | ------------------- | ---------------------- | ---------------------- | From f34d28cfbc379b4a27d946fd4e29a19115a271c1 Mon Sep 17 00:00:00 2001 From: YAMAMOTO Takashi Date: Tue, 29 Jul 2025 12:12:27 +0900 Subject: [PATCH 002/103] lib-socket: implement gai_strerror (#4508) cf. https://pubs.opengroup.org/onlinepubs/9799919799/functions/gai_strerror.html --- .../lib-socket/inc/wasi_socket_ext.h | 3 +++ .../lib-socket/src/wasi/wasi_socket_ext.c | 22 +++++++++++++++++++ 2 files changed, 25 insertions(+) diff --git a/core/iwasm/libraries/lib-socket/inc/wasi_socket_ext.h b/core/iwasm/libraries/lib-socket/inc/wasi_socket_ext.h index 98ccc78c11..2bad1ebed9 100644 --- a/core/iwasm/libraries/lib-socket/inc/wasi_socket_ext.h +++ b/core/iwasm/libraries/lib-socket/inc/wasi_socket_ext.h @@ -219,6 +219,9 @@ getaddrinfo(const char *node, const char *service, const struct addrinfo *hints, void freeaddrinfo(struct addrinfo *res); + +const char * +gai_strerror(int code); #endif /** diff --git a/core/iwasm/libraries/lib-socket/src/wasi/wasi_socket_ext.c b/core/iwasm/libraries/lib-socket/src/wasi/wasi_socket_ext.c index f016bdebca..8f80e0bbbc 100644 --- a/core/iwasm/libraries/lib-socket/src/wasi/wasi_socket_ext.c +++ b/core/iwasm/libraries/lib-socket/src/wasi/wasi_socket_ext.c @@ -590,6 +590,28 @@ freeaddrinfo(struct addrinfo *res) free(res); } +const char * +gai_strerror(int code) +{ + switch (code) { +#define ERR(a) \ + case a: \ + return #a + ERR(EAI_AGAIN); + ERR(EAI_BADFLAGS); + ERR(EAI_FAIL); + ERR(EAI_FAMILY); + ERR(EAI_MEMORY); + ERR(EAI_NONAME); + ERR(EAI_OVERFLOW); + ERR(EAI_SERVICE); + ERR(EAI_SOCKTYPE); + ERR(EAI_SYSTEM); +#undef ERR + } + return "Unknown error"; +} + static struct timeval time_us_to_timeval(uint64_t time_us) { From b322e297c64d62340d6284ef963390debf2500ae Mon Sep 17 00:00:00 2001 From: TianlongLiang <111852609+TianlongLiang@users.noreply.github.com> Date: Tue, 29 Jul 2025 05:13:23 +0200 Subject: [PATCH 003/103] Add CLI option for iwasm to create and attach shared heap to wasm app (#4499) --- core/iwasm/common/wasm_memory.c | 7 ++++++ product-mini/platforms/posix/main.c | 37 +++++++++++++++++++++++++++++ 2 files changed, 44 insertions(+) diff --git a/core/iwasm/common/wasm_memory.c b/core/iwasm/common/wasm_memory.c index 59d478c96f..04e3b9976f 100644 --- a/core/iwasm/common/wasm_memory.c +++ b/core/iwasm/common/wasm_memory.c @@ -199,6 +199,8 @@ wasm_runtime_create_shared_heap(SharedHeapInitArgs *init_args) heap->heap_handle = NULL; heap->base_addr = init_args->pre_allocated_addr; + LOG_VERBOSE("Create preallocated shared heap %p with size %u", + heap->base_addr, size); } else { if (!(heap->heap_handle = @@ -225,6 +227,8 @@ wasm_runtime_create_shared_heap(SharedHeapInitArgs *init_args) LOG_WARNING("init share heap failed"); goto fail4; } + LOG_VERBOSE("Create pool shared heap %p with size %u", heap->base_addr, + size); } os_mutex_lock(&shared_heap_list_lock); @@ -509,6 +513,8 @@ wasm_runtime_attach_shared_heap_internal(WASMModuleInstanceCommon *module_inst, os_mutex_lock(&shared_heap_list_lock); shared_heap->attached_count++; os_mutex_unlock(&shared_heap_list_lock); + LOG_VERBOSE("Shared heap %p is attached to module instance %p", shared_heap, + module_inst); return true; } @@ -570,6 +576,7 @@ wasm_runtime_detach_shared_heap_internal(WASMModuleInstanceCommon *module_inst) e->shared_heap_base_addr_adj = NULL; } #endif /* end of WASM_ENABLE_AOT != 0 */ + LOG_VERBOSE("Shared heap is detached from module instance %p", module_inst); } void diff --git a/product-mini/platforms/posix/main.c b/product-mini/platforms/posix/main.c index f95b0d2d66..342eef0fd8 100644 --- a/product-mini/platforms/posix/main.c +++ b/product-mini/platforms/posix/main.c @@ -57,6 +57,10 @@ print_help(void) #else printf(" --heap-size=n Set maximum heap size in bytes, default is 16 KB when libc wasi is diabled\n"); #endif +#if WASM_ENABLE_SHARED_HEAP != 0 + printf(" --shared-heap-size=n Create shared heap of n bytes and attach to the wasm app.\n"); + printf(" The size n will be adjusted to a minumum number aligned to page size\n"); +#endif #if WASM_ENABLE_FAST_JIT != 0 printf(" --jit-codecache-size=n Set fast jit maximum code cache size in bytes,\n"); printf(" default is %u KB\n", FAST_JIT_DEFAULT_CODE_CACHE_SIZE / 1024); @@ -578,6 +582,11 @@ main(int argc, char *argv[]) #else uint32 heap_size = 16 * 1024; #endif +#if WASM_ENABLE_SHARED_HEAP != 0 + SharedHeapInitArgs heap_init_args; + uint32 shared_heap_size = 0; + void *shared_heap = NULL; +#endif #if WASM_ENABLE_FAST_JIT != 0 uint32 jit_code_cache_size = FAST_JIT_DEFAULT_CODE_CACHE_SIZE; #endif @@ -685,6 +694,13 @@ main(int argc, char *argv[]) return print_help(); heap_size = atoi(argv[0] + 12); } +#if WASM_ENABLE_SHARED_HEAP != 0 + else if (!strncmp(argv[0], "--shared-heap-size=", 19)) { + if (argv[0][19] == '\0') + return print_help(); + shared_heap_size = atoi(argv[0] + 19); + } +#endif #if WASM_ENABLE_FAST_JIT != 0 else if (!strncmp(argv[0], "--jit-codecache-size=", 21)) { if (argv[0][21] == '\0') @@ -1007,6 +1023,24 @@ main(int argc, char *argv[]) } #endif +#if WASM_ENABLE_SHARED_HEAP != 0 + if (shared_heap_size > 0) { + memset(&heap_init_args, 0, sizeof(heap_init_args)); + heap_init_args.size = shared_heap_size; + shared_heap = wasm_runtime_create_shared_heap(&heap_init_args); + if (!shared_heap) { + printf("Create preallocated shared heap failed\n"); + goto fail6; + } + + /* attach module instance 2 to the shared heap */ + if (!wasm_runtime_attach_shared_heap(wasm_module_inst, shared_heap)) { + printf("Attach shared heap failed.\n"); + goto fail6; + } + } +#endif + ret = 0; const char *exception = NULL; if (is_repl_mode) { @@ -1050,6 +1084,9 @@ main(int argc, char *argv[]) } #endif +#if WASM_ENABLE_SHARED_HEAP != 0 +fail6: +#endif #if WASM_ENABLE_THREAD_MGR != 0 fail5: #endif From 2fe36f45162050550c83b9cfa50281e756566e3e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 30 Jul 2025 10:25:21 +0800 Subject: [PATCH 004/103] build(deps): Bump github/codeql-action from 3.29.3 to 3.29.4 (#4519) Bumps [github/codeql-action](https://github.com/github/codeql-action) from 3.29.3 to 3.29.4. - [Release notes](https://github.com/github/codeql-action/releases) - [Commits](https://github.com/github/codeql-action/compare/v3.29.3...v3.29.4) --- updated-dependencies: - dependency-name: github/codeql-action dependency-version: 3.29.4 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/codeql.yml | 6 +++--- .github/workflows/supply_chain.yml | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml index 5325d4c2ef..fea92c9f6e 100644 --- a/.github/workflows/codeql.yml +++ b/.github/workflows/codeql.yml @@ -53,7 +53,7 @@ jobs: # Initializes the CodeQL tools for scanning. - name: Initialize CodeQL - uses: github/codeql-action/init@v3.29.3 + uses: github/codeql-action/init@v3.29.4 with: languages: ${{ matrix.language }} @@ -70,7 +70,7 @@ jobs: - run: | ./.github/scripts/codeql_buildscript.sh - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@v3.29.3 + uses: github/codeql-action/analyze@v3.29.4 with: category: "/language:${{matrix.language}}" upload: false @@ -99,7 +99,7 @@ jobs: output: ${{ steps.step1.outputs.sarif-output }}/cpp.sarif - name: Upload CodeQL results to code scanning - uses: github/codeql-action/upload-sarif@v3.29.3 + uses: github/codeql-action/upload-sarif@v3.29.4 with: sarif_file: ${{ steps.step1.outputs.sarif-output }} category: "/language:${{matrix.language}}" diff --git a/.github/workflows/supply_chain.yml b/.github/workflows/supply_chain.yml index 9b2c3995f4..57e59d0ddf 100644 --- a/.github/workflows/supply_chain.yml +++ b/.github/workflows/supply_chain.yml @@ -60,6 +60,6 @@ jobs: # Upload the results to GitHub's code scanning dashboard. - name: "Upload to code-scanning" - uses: github/codeql-action/upload-sarif@7710ed11e398ea99c7f7004c2b2e0f580458db42 + uses: github/codeql-action/upload-sarif@701df0e49d84a24bd8f0d01f80c0dbf69ab07674 with: sarif_file: results.sarif From 2685f2cae0141361a780fbf7826a00b4d6284cc8 Mon Sep 17 00:00:00 2001 From: Marcin Kolny Date: Wed, 30 Jul 2025 04:25:52 +0200 Subject: [PATCH 005/103] Use venv to install llvm dependencies and run build script (#4514) Installing pip packages system-wide is no longer recommended, therefore we create virtual environment for setting up the build environment for LLVM. --- wamr-compiler/build_llvm.sh | 14 +++++++++++++- wamr-compiler/build_llvm_arc.sh | 4 ++-- wamr-compiler/build_llvm_xtensa.sh | 4 ++-- 3 files changed, 17 insertions(+), 5 deletions(-) diff --git a/wamr-compiler/build_llvm.sh b/wamr-compiler/build_llvm.sh index c3ec54b61b..75285b52cf 100755 --- a/wamr-compiler/build_llvm.sh +++ b/wamr-compiler/build_llvm.sh @@ -3,5 +3,17 @@ # Copyright (C) 2020 Intel Corporation. All rights reserved. # SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -/usr/bin/env python3 -m pip install --user -r ../build-scripts/requirements.txt +TEMP_DIR=$(mktemp -d) + +cleanup() { + local exit_code=$? + rm -rf "$TEMP_DIR" + exit $exit_code +} + +trap cleanup EXIT INT TERM + +/usr/bin/env python3 -m venv --clear "$TEMP_DIR" +source "$TEMP_DIR/bin/activate" +/usr/bin/env python3 -m pip install -r ../build-scripts/requirements.txt /usr/bin/env python3 ../build-scripts/build_llvm.py "$@" diff --git a/wamr-compiler/build_llvm_arc.sh b/wamr-compiler/build_llvm_arc.sh index d148e11ecc..bc10216e1a 100755 --- a/wamr-compiler/build_llvm_arc.sh +++ b/wamr-compiler/build_llvm_arc.sh @@ -3,5 +3,5 @@ # Copyright (C) 2020 Intel Corporation. All rights reserved. # SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -/usr/bin/env python3 -m pip install --user -r ../build-scripts/requirements.txt -/usr/bin/env python3 ../build-scripts/build_llvm.py --platform arc "$@" +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +$SCRIPT_DIR/build_llvm.sh --platform arc "$@" diff --git a/wamr-compiler/build_llvm_xtensa.sh b/wamr-compiler/build_llvm_xtensa.sh index 183ea379fd..29559ce35e 100755 --- a/wamr-compiler/build_llvm_xtensa.sh +++ b/wamr-compiler/build_llvm_xtensa.sh @@ -3,5 +3,5 @@ # Copyright (C) 2020 Intel Corporation. All rights reserved. # SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -/usr/bin/env python3 -m pip install --user -r ../build-scripts/requirements.txt -/usr/bin/env python3 ../build-scripts/build_llvm.py --platform xtensa "$@" +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +$SCRIPT_DIR/build_llvm.sh --platform xtensa "$@" From 6c6447fadbed34ae3a26484be640a027c2814682 Mon Sep 17 00:00:00 2001 From: Liu Jia Date: Wed, 30 Jul 2025 10:26:19 +0800 Subject: [PATCH 006/103] Add regression test CI (#4512) The entire CI test run takes approximately 3 minutes. The test run fails if there is at least one failed case (failed > 0). --- .../compilation_on_android_ubuntu.yml | 41 +++++++++++++++++++ tests/regression/ba-issues/run.py | 6 +++ 2 files changed, 47 insertions(+) diff --git a/.github/workflows/compilation_on_android_ubuntu.yml b/.github/workflows/compilation_on_android_ubuntu.yml index 828773ae0a..358a0d93f2 100644 --- a/.github/workflows/compilation_on_android_ubuntu.yml +++ b/.github/workflows/compilation_on_android_ubuntu.yml @@ -371,6 +371,47 @@ jobs: ctest working-directory: tests/unit + build_regression_tests: + needs: + [build_llvm_libraries_on_ubuntu_2204] + runs-on: ${{ matrix.os }} + strategy: + matrix: + os: [ubuntu-22.04] + include: + - os: ubuntu-22.04 + llvm_cache_key: ${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }} + + steps: + - name: checkout + uses: actions/checkout@v4 + + - name: Get LLVM libraries + id: retrieve_llvm_libs + uses: actions/cache@v4 + with: + path: | + ./core/deps/llvm/build/bin + ./core/deps/llvm/build/include + ./core/deps/llvm/build/lib + ./core/deps/llvm/build/libexec + ./core/deps/llvm/build/share + key: ${{ matrix.llvm_cache_key }} + + - name: Quit if cache miss + if: (steps.retrieve_llvm_libs.outputs.cache-hit != 'true') + run: echo "::error::can not get prebuilt llvm libraries" && exit 1 + + - name: Build wamrc and iwasm + run: | + ./build_wamr.sh + working-directory: tests/regression/ba-issues + + - name: Run regression tests + run: | + python run.py + working-directory: tests/regression/ba-issues + build_samples_wasm_c_api: needs: [ diff --git a/tests/regression/ba-issues/run.py b/tests/regression/ba-issues/run.py index 5a57bfcf6f..d50bf9b14e 100755 --- a/tests/regression/ba-issues/run.py +++ b/tests/regression/ba-issues/run.py @@ -11,6 +11,7 @@ import glob import re import argparse +import sys from typing import Dict, Optional, List @@ -275,6 +276,11 @@ def process_and_run_test_cases( else: print(f" Issues not found in folder: {format_issue_ids_should_test}") + if failed > 0: + # Exit with error code if there are failed test for CI + print("Some tests failed, see log file for details.") + sys.exit(1) + def main(): parser = argparse.ArgumentParser(description="Run BA issue tests.") From c6afa131a4bb5a5894f129215a1d9165bfc35096 Mon Sep 17 00:00:00 2001 From: ChenWen <63690793+cwespressif@users.noreply.github.com> Date: Wed, 30 Jul 2025 10:26:41 +0800 Subject: [PATCH 007/103] feat(core): Support pthread using SPIRAM as stack (#4509) Signed-off-by: chenwen@espressif.com --- core/shared/platform/esp-idf/espidf_thread.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/core/shared/platform/esp-idf/espidf_thread.c b/core/shared/platform/esp-idf/espidf_thread.c index 768d823a8b..cb68df8bdf 100644 --- a/core/shared/platform/esp-idf/espidf_thread.c +++ b/core/shared/platform/esp-idf/espidf_thread.c @@ -110,6 +110,13 @@ os_thread_create_with_prio(korp_tid *tid, thread_start_routine_t start, targ->start = start; targ->arg = arg; +#ifdef CONFIG_FREERTOS_TASK_CREATE_ALLOW_EXT_MEM + esp_pthread_cfg_t default_config = esp_pthread_get_default_config(); + + default_config.stack_alloc_caps = MALLOC_CAP_8BIT | MALLOC_CAP_SPIRAM; + ESP_ERROR_CHECK(esp_pthread_set_cfg(&default_config)); +#endif + if (pthread_create(tid, &tattr, os_thread_wrapper, targ) != 0) { pthread_attr_destroy(&tattr); os_free(targ); From a0de8c7b7d3cbd3734190688de4e74ab956284f1 Mon Sep 17 00:00:00 2001 From: YAMAMOTO Takashi Date: Wed, 30 Jul 2025 11:27:20 +0900 Subject: [PATCH 008/103] wasi-nn: fix buffer overruns in load_by_name/load_by_name_with_config (#4491) also, ensure NUL terminations here to simplify backend implementations. (note that, although names with '\0' in the middle are usually valid in wasm, wamr doesn't support them in general. we might revisit this later.) also, add a missing address validation in load_by_name_with_config. cf. https://github.com/bytecodealliance/wasm-micro-runtime/issues/4487 --- core/iwasm/libraries/wasi-nn/src/wasi_nn.c | 93 +++++++++++++++------- 1 file changed, 64 insertions(+), 29 deletions(-) diff --git a/core/iwasm/libraries/wasi-nn/src/wasi_nn.c b/core/iwasm/libraries/wasi-nn/src/wasi_nn.c index fbd6e33f4b..7921ec9539 100644 --- a/core/iwasm/libraries/wasi-nn/src/wasi_nn.c +++ b/core/iwasm/libraries/wasi-nn/src/wasi_nn.c @@ -507,10 +507,35 @@ wasi_nn_load(wasm_exec_env_t exec_env, graph_builder_array_wasm *builder, return res; } +static wasi_nn_error +copyin_and_nul_terminate(wasm_module_inst_t inst, char *name, uint32_t name_len, + char **resultp) +{ + char *nul_terminated_name; + if (!wasm_runtime_validate_native_addr(inst, name, name_len)) { + return invalid_argument; + } + nul_terminated_name = wasm_runtime_malloc(name_len + 1); + if (nul_terminated_name == NULL) { + return runtime_error; + } + bh_memcpy_s(nul_terminated_name, name_len + 1, name, name_len); + nul_terminated_name[name_len] = '\0'; /* ensure NUL termination */ + if (strlen(nul_terminated_name) != name_len) { + /* reject names containing '\0' for now */ + wasm_runtime_free(nul_terminated_name); + return invalid_argument; + } + *resultp = nul_terminated_name; + return success; +} + wasi_nn_error wasi_nn_load_by_name(wasm_exec_env_t exec_env, char *name, uint32_t name_len, graph *g) { + WASINNContext *wasi_nn_ctx = NULL; + char *nul_terminated_name = NULL; wasi_nn_error res; wasm_module_inst_t instance = wasm_runtime_get_module_inst(exec_env); @@ -518,25 +543,21 @@ wasi_nn_load_by_name(wasm_exec_env_t exec_env, char *name, uint32_t name_len, return runtime_error; } - if (!wasm_runtime_validate_native_addr(instance, name, name_len)) { - NN_ERR_PRINTF("name is invalid"); - return invalid_argument; - } - if (!wasm_runtime_validate_native_addr(instance, g, (uint64)sizeof(graph))) { NN_ERR_PRINTF("graph is invalid"); return invalid_argument; } - if (name_len == 0 || name[name_len] != '\0') { - NN_ERR_PRINTF("Invalid filename"); - return invalid_argument; + res = copyin_and_nul_terminate(instance, name, name_len, + &nul_terminated_name); + if (res != success) { + goto fail; } - NN_DBG_PRINTF("[WASI NN] LOAD_BY_NAME %s...", name); + NN_DBG_PRINTF("[WASI NN] LOAD_BY_NAME %s...", nul_terminated_name); - WASINNContext *wasi_nn_ctx = lock_ctx(instance); + wasi_nn_ctx = lock_ctx(instance); if (wasi_nn_ctx == NULL) { res = busy; goto fail; @@ -547,14 +568,20 @@ wasi_nn_load_by_name(wasm_exec_env_t exec_env, char *name, uint32_t name_len, goto fail; call_wasi_nn_func(wasi_nn_ctx->backend, load_by_name, res, - wasi_nn_ctx->backend_ctx, name, name_len, g); + wasi_nn_ctx->backend_ctx, nul_terminated_name, name_len, + g); if (res != success) goto fail; wasi_nn_ctx->is_model_loaded = true; res = success; fail: - unlock_ctx(wasi_nn_ctx); + if (nul_terminated_name != NULL) { + wasm_runtime_free(nul_terminated_name); + } + if (wasi_nn_ctx != NULL) { + unlock_ctx(wasi_nn_ctx); + } return res; } @@ -563,6 +590,9 @@ wasi_nn_load_by_name_with_config(wasm_exec_env_t exec_env, char *name, int32_t name_len, char *config, int32_t config_len, graph *g) { + WASINNContext *wasi_nn_ctx = NULL; + char *nul_terminated_name = NULL; + char *nul_terminated_config = NULL; wasi_nn_error res; wasm_module_inst_t instance = wasm_runtime_get_module_inst(exec_env); @@ -570,30 +600,27 @@ wasi_nn_load_by_name_with_config(wasm_exec_env_t exec_env, char *name, return runtime_error; } - if (!wasm_runtime_validate_native_addr(instance, name, name_len)) { - NN_ERR_PRINTF("name is invalid"); - return invalid_argument; - } - if (!wasm_runtime_validate_native_addr(instance, g, (uint64)sizeof(graph))) { NN_ERR_PRINTF("graph is invalid"); return invalid_argument; } - if (name_len == 0 || name[name_len] != '\0') { - NN_ERR_PRINTF("Invalid filename"); - return invalid_argument; + res = copyin_and_nul_terminate(instance, name, name_len, + &nul_terminated_name); + if (res != success) { + goto fail; } - - if (!config || config_len == 0 || config[config_len] != '\0') { - NN_ERR_PRINTF("Invalid config"); - return invalid_argument; + res = copyin_and_nul_terminate(instance, config, config_len, + &nul_terminated_config); + if (res != success) { + goto fail; } - NN_DBG_PRINTF("[WASI NN] LOAD_BY_NAME_WITH_CONFIG %s %s...", name, config); + NN_DBG_PRINTF("[WASI NN] LOAD_BY_NAME_WITH_CONFIG %s %s...", + nul_terminated_name, nul_terminated_config); - WASINNContext *wasi_nn_ctx = lock_ctx(instance); + wasi_nn_ctx = lock_ctx(instance); if (wasi_nn_ctx == NULL) { res = busy; goto fail; @@ -605,15 +632,23 @@ wasi_nn_load_by_name_with_config(wasm_exec_env_t exec_env, char *name, ; call_wasi_nn_func(wasi_nn_ctx->backend, load_by_name_with_config, res, - wasi_nn_ctx->backend_ctx, name, name_len, config, - config_len, g); + wasi_nn_ctx->backend_ctx, nul_terminated_name, name_len, + nul_terminated_config, config_len, g); if (res != success) goto fail; wasi_nn_ctx->is_model_loaded = true; res = success; fail: - unlock_ctx(wasi_nn_ctx); + if (nul_terminated_name != NULL) { + wasm_runtime_free(nul_terminated_name); + } + if (nul_terminated_config != NULL) { + wasm_runtime_free(nul_terminated_config); + } + if (wasi_nn_ctx != NULL) { + unlock_ctx(wasi_nn_ctx); + } return res; } From aad186626074e488d16495087b99803d0b20244f Mon Sep 17 00:00:00 2001 From: Zhenwei Jin <109658203+kylo5aby@users.noreply.github.com> Date: Thu, 31 Jul 2025 16:19:08 +0800 Subject: [PATCH 009/103] add validation for recursive type count in loader (#4522) --- core/iwasm/interpreter/wasm_loader.c | 36 +++++++++++++--------------- 1 file changed, 17 insertions(+), 19 deletions(-) diff --git a/core/iwasm/interpreter/wasm_loader.c b/core/iwasm/interpreter/wasm_loader.c index 3f8c68db64..bca5fcbbf5 100644 --- a/core/iwasm/interpreter/wasm_loader.c +++ b/core/iwasm/interpreter/wasm_loader.c @@ -400,8 +400,7 @@ check_array_type(const WASMModule *module, uint32 type_index, char *error_buf, error_buf_size)) { return false; } - if (module->types[type_index] == NULL - || module->types[type_index]->type_flag != WASM_TYPE_ARRAY) { + if (module->types[type_index]->type_flag != WASM_TYPE_ARRAY) { set_error_buf(error_buf, error_buf_size, "unknown array type"); return false; } @@ -424,8 +423,7 @@ check_function_type(const WASMModule *module, uint32 type_index, } #if WASM_ENABLE_GC != 0 - if (module->types[type_index] == NULL - || module->types[type_index]->type_flag != WASM_TYPE_FUNC) { + if (module->types[type_index]->type_flag != WASM_TYPE_FUNC) { set_error_buf(error_buf, error_buf_size, "unknown function type"); return false; } @@ -1257,9 +1255,8 @@ load_init_expr(WASMModule *module, const uint8 **p_buf, const uint8 *buf_end, error_buf_size)) { goto fail; } - if (module->types[type_idx] == NULL - || module->types[type_idx]->type_flag - != WASM_TYPE_STRUCT) { + if (module->types[type_idx]->type_flag + != WASM_TYPE_STRUCT) { set_error_buf(error_buf, error_buf_size, "unknown struct type"); goto fail; @@ -2499,6 +2496,13 @@ load_type_section(const uint8 *buf, const uint8 *buf_end, WASMModule *module, #endif /* end of WASM_ENABLE_GC == 0 */ } + for (i = 0; i < module->type_count; i++) { + if (module->types[i] == NULL) { + set_error_buf_v(error_buf, error_buf_size, "unknown type %d", i); + return false; + } + } + if (p != p_end) { set_error_buf(error_buf, error_buf_size, "section size mismatch"); return false; @@ -12685,9 +12689,7 @@ wasm_loader_prepare_bytecode(WASMModule *module, WASMFunction *func, error_buf, error_buf_size)) { goto fail; } - if (module->types[type_idx1] == NULL - || module->types[type_idx1]->type_flag - != WASM_TYPE_FUNC) { + if (module->types[type_idx1]->type_flag != WASM_TYPE_FUNC) { set_error_buf(error_buf, error_buf_size, "unknown function type"); goto fail; @@ -12704,9 +12706,7 @@ wasm_loader_prepare_bytecode(WASMModule *module, WASMFunction *func, error_buf, error_buf_size)) { goto fail; } - if (module->types[type_idx] == NULL - || module->types[type_idx]->type_flag - != WASM_TYPE_FUNC) { + if (module->types[type_idx]->type_flag != WASM_TYPE_FUNC) { set_error_buf(error_buf, error_buf_size, "unknown function type"); goto fail; @@ -14542,9 +14542,8 @@ wasm_loader_prepare_bytecode(WASMModule *module, WASMFunction *func, error_buf_size)) { goto fail; } - if (module->types[type_idx] == NULL - || module->types[type_idx]->type_flag - != WASM_TYPE_STRUCT) { + if (module->types[type_idx]->type_flag + != WASM_TYPE_STRUCT) { set_error_buf(error_buf, error_buf_size, "unknown struct type"); goto fail; @@ -14630,9 +14629,8 @@ wasm_loader_prepare_bytecode(WASMModule *module, WASMFunction *func, error_buf_size)) { goto fail; } - if (module->types[type_idx] == NULL - || module->types[type_idx]->type_flag - != WASM_TYPE_STRUCT) { + if (module->types[type_idx]->type_flag + != WASM_TYPE_STRUCT) { set_error_buf(error_buf, error_buf_size, "unknown struct type"); goto fail; From 33eff933c0102fedb675dbd5173879bbcb8fe639 Mon Sep 17 00:00:00 2001 From: Zhenwei Jin <109658203+kylo5aby@users.noreply.github.com> Date: Fri, 1 Aug 2025 08:45:57 +0800 Subject: [PATCH 010/103] add validation for rec indices in aot loader (#4520) --- core/iwasm/aot/aot_loader.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/core/iwasm/aot/aot_loader.c b/core/iwasm/aot/aot_loader.c index 771ef87ff3..d53f7c52da 100644 --- a/core/iwasm/aot/aot_loader.c +++ b/core/iwasm/aot/aot_loader.c @@ -1805,7 +1805,12 @@ load_types(const uint8 **p_buf, const uint8 *buf_end, AOTModule *module, read_uint32(buf, buf_end, parent_type_idx); read_uint16(buf, buf_end, rec_count); read_uint16(buf, buf_end, rec_idx); - +#if WASM_ENABLE_AOT_VALIDATOR != 0 + if (rec_idx > i) { + set_error_buf(error_buf, error_buf_size, "invalid rec_idx"); + goto fail; + } +#endif if (type_flag == WASM_TYPE_FUNC) { AOTFuncType *func_type; From 378320b886e160b99757e558761c75ab085ebf47 Mon Sep 17 00:00:00 2001 From: Zhenwei Jin <109658203+kylo5aby@users.noreply.github.com> Date: Fri, 1 Aug 2025 08:58:26 +0800 Subject: [PATCH 011/103] loader: add type index checking (#4521) --- core/iwasm/aot/aot_loader.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/core/iwasm/aot/aot_loader.c b/core/iwasm/aot/aot_loader.c index d53f7c52da..b0f1556653 100644 --- a/core/iwasm/aot/aot_loader.c +++ b/core/iwasm/aot/aot_loader.c @@ -1786,7 +1786,8 @@ load_types(const uint8 **p_buf, const uint8 *buf_end, AOTModule *module, read_uint32(buf, buf_end, j); #if WASM_ENABLE_AOT_VALIDATOR != 0 - if (j >= module->type_count) { + /* an equivalence type should be before the type it refers to */ + if (j > i) { set_error_buf(error_buf, error_buf_size, "invalid type index"); goto fail; } From 272a41dc80a85e328abbf6046f669396fb775da1 Mon Sep 17 00:00:00 2001 From: Jaco Kroon Date: Fri, 1 Aug 2025 08:30:39 +0200 Subject: [PATCH 012/103] Avoid executable stack by marking that it's not required. (#4418) Also refer to: https://github.com/fluent/fluent-bit/issues/10513 Signed-off-by: Jaco Kroon --- core/iwasm/common/arch/fneh.txt | 3 +++ core/iwasm/common/arch/invokeNative_aarch64.s | 3 +++ core/iwasm/common/arch/invokeNative_aarch64_simd.s | 3 +++ core/iwasm/common/arch/invokeNative_arc.s | 3 +++ core/iwasm/common/arch/invokeNative_arm.s | 3 +++ core/iwasm/common/arch/invokeNative_arm_vfp.s | 3 +++ core/iwasm/common/arch/invokeNative_em64.s | 3 +++ core/iwasm/common/arch/invokeNative_em64_simd.s | 3 +++ core/iwasm/common/arch/invokeNative_ia32.s | 3 +++ core/iwasm/common/arch/invokeNative_mips.s | 3 +++ core/iwasm/common/arch/invokeNative_osx_universal.s | 2 +- core/iwasm/common/arch/invokeNative_thumb.s | 3 +++ core/iwasm/common/arch/invokeNative_thumb_vfp.s | 3 +++ core/iwasm/common/arch/invokeNative_xtensa.s | 3 +++ 14 files changed, 40 insertions(+), 1 deletion(-) create mode 100644 core/iwasm/common/arch/fneh.txt diff --git a/core/iwasm/common/arch/fneh.txt b/core/iwasm/common/arch/fneh.txt new file mode 100644 index 0000000000..965af94f2f --- /dev/null +++ b/core/iwasm/common/arch/fneh.txt @@ -0,0 +1,3 @@ +#if defined(__linux__) && defined(__ELF__) +.section .note.GNU-stack,"",%progbits +#endif diff --git a/core/iwasm/common/arch/invokeNative_aarch64.s b/core/iwasm/common/arch/invokeNative_aarch64.s index f48a429c50..ea5d9c7490 100644 --- a/core/iwasm/common/arch/invokeNative_aarch64.s +++ b/core/iwasm/common/arch/invokeNative_aarch64.s @@ -79,3 +79,6 @@ return: add sp, sp, #0x30 /* restore sp */ ret +#if defined(__linux__) && defined(__ELF__) +.section .note.GNU-stack,"",%progbits +#endif diff --git a/core/iwasm/common/arch/invokeNative_aarch64_simd.s b/core/iwasm/common/arch/invokeNative_aarch64_simd.s index f940c3403e..e1c7207624 100644 --- a/core/iwasm/common/arch/invokeNative_aarch64_simd.s +++ b/core/iwasm/common/arch/invokeNative_aarch64_simd.s @@ -77,3 +77,6 @@ return: add sp, sp, #0x30 /* restore sp */ ret +#if defined(__linux__) && defined(__ELF__) +.section .note.GNU-stack,"",%progbits +#endif diff --git a/core/iwasm/common/arch/invokeNative_arc.s b/core/iwasm/common/arch/invokeNative_arc.s index e448eea650..e277dda03a 100644 --- a/core/iwasm/common/arch/invokeNative_arc.s +++ b/core/iwasm/common/arch/invokeNative_arc.s @@ -67,3 +67,6 @@ call_func: j_s [blink] /* ret */ nop_s +#if defined(__linux__) && defined(__ELF__) +.section .note.GNU-stack,"",%progbits +#endif diff --git a/core/iwasm/common/arch/invokeNative_arm.s b/core/iwasm/common/arch/invokeNative_arm.s index bfe8e3b092..afcd51449a 100644 --- a/core/iwasm/common/arch/invokeNative_arm.s +++ b/core/iwasm/common/arch/invokeNative_arm.s @@ -73,3 +73,6 @@ return: add sp, sp, #4 ldmfd sp!, {r4, r5, r6, r7, lr} bx lr +#if defined(__linux__) && defined(__ELF__) +.section .note.GNU-stack,"",%progbits +#endif diff --git a/core/iwasm/common/arch/invokeNative_arm_vfp.s b/core/iwasm/common/arch/invokeNative_arm_vfp.s index 19bc5d67cf..52d2a72588 100644 --- a/core/iwasm/common/arch/invokeNative_arm_vfp.s +++ b/core/iwasm/common/arch/invokeNative_arm_vfp.s @@ -84,3 +84,6 @@ return: ldmfd sp!, {r4, r5, r6, r7, lr} bx lr +#if defined(__linux__) && defined(__ELF__) +.section .note.GNU-stack,"",%progbits +#endif diff --git a/core/iwasm/common/arch/invokeNative_em64.s b/core/iwasm/common/arch/invokeNative_em64.s index 739e84e4ce..fa34c2eeec 100644 --- a/core/iwasm/common/arch/invokeNative_em64.s +++ b/core/iwasm/common/arch/invokeNative_em64.s @@ -62,3 +62,6 @@ push_args_end: leave ret +#if defined(__linux__) && defined(__ELF__) +.section .note.GNU-stack,"",%progbits +#endif diff --git a/core/iwasm/common/arch/invokeNative_em64_simd.s b/core/iwasm/common/arch/invokeNative_em64_simd.s index 0043ac9413..6c8d3febbc 100644 --- a/core/iwasm/common/arch/invokeNative_em64_simd.s +++ b/core/iwasm/common/arch/invokeNative_em64_simd.s @@ -62,3 +62,6 @@ push_args_end: leave ret +#if defined(__linux__) && defined(__ELF__) +.section .note.GNU-stack,"",%progbits +#endif diff --git a/core/iwasm/common/arch/invokeNative_ia32.s b/core/iwasm/common/arch/invokeNative_ia32.s index de1c1a5e18..845cd93bf0 100644 --- a/core/iwasm/common/arch/invokeNative_ia32.s +++ b/core/iwasm/common/arch/invokeNative_ia32.s @@ -35,3 +35,6 @@ skip_push_args: leave ret +#if defined(__linux__) && defined(__ELF__) +.section .note.GNU-stack,"",%progbits +#endif diff --git a/core/iwasm/common/arch/invokeNative_mips.s b/core/iwasm/common/arch/invokeNative_mips.s index 645f4f2ec4..d6e48114ea 100644 --- a/core/iwasm/common/arch/invokeNative_mips.s +++ b/core/iwasm/common/arch/invokeNative_mips.s @@ -72,3 +72,6 @@ done: j $31 .end invokeNative +#if defined(__linux__) && defined(__ELF__) +.section .note.GNU-stack,"",%progbits +#endif diff --git a/core/iwasm/common/arch/invokeNative_osx_universal.s b/core/iwasm/common/arch/invokeNative_osx_universal.s index e2ca654fdf..fadaae5646 100644 --- a/core/iwasm/common/arch/invokeNative_osx_universal.s +++ b/core/iwasm/common/arch/invokeNative_osx_universal.s @@ -15,4 +15,4 @@ #else #include "invokeNative_em64_simd.s" #endif -#endif \ No newline at end of file +#endif diff --git a/core/iwasm/common/arch/invokeNative_thumb.s b/core/iwasm/common/arch/invokeNative_thumb.s index 3669fe77ed..8087c63b8e 100644 --- a/core/iwasm/common/arch/invokeNative_thumb.s +++ b/core/iwasm/common/arch/invokeNative_thumb.s @@ -89,3 +89,6 @@ return: pop {r4, r5, r6, r7} mov lr, r3 bx lr +#if defined(__linux__) && defined(__ELF__) +.section .note.GNU-stack,"",%progbits +#endif diff --git a/core/iwasm/common/arch/invokeNative_thumb_vfp.s b/core/iwasm/common/arch/invokeNative_thumb_vfp.s index 3f12b91d3f..1bad1a6a88 100644 --- a/core/iwasm/common/arch/invokeNative_thumb_vfp.s +++ b/core/iwasm/common/arch/invokeNative_thumb_vfp.s @@ -98,3 +98,6 @@ return: mov lr, r3 bx lr +#if defined(__linux__) && defined(__ELF__) +.section .note.GNU-stack,"",%progbits +#endif diff --git a/core/iwasm/common/arch/invokeNative_xtensa.s b/core/iwasm/common/arch/invokeNative_xtensa.s index ce03f12c1c..9bc094d3ca 100644 --- a/core/iwasm/common/arch/invokeNative_xtensa.s +++ b/core/iwasm/common/arch/invokeNative_xtensa.s @@ -72,3 +72,6 @@ call_func: return: retw.n +#if defined(__linux__) && defined(__ELF__) +.section .note.GNU-stack,"",%progbits +#endif From 29d465b44e247b26b5522b8c5976e8798ba8618c Mon Sep 17 00:00:00 2001 From: YAMAMOTO Takashi Date: Fri, 1 Aug 2025 15:31:02 +0900 Subject: [PATCH 013/103] wasi_nn_tensorflowlite.cpp: make this compatible with wasmedge (#4517) for wasi_ephemeral_nn, * implement u8 input * stop dealing with quantization. * wasi-nn doesn't have a concept of quantization or pre/post-processing. i can't think of any ways to make the backend perform zero-point/scale processing without risking to break other applications. * there seems to be applications which just use u8 inputs/outputs for a quantized model. (see [1] for an example.) for certain kinds of inputs/outputs, it usually just works. this commit keeps the legacy wasi_nn logic intact for now. tested with [1] with [2] applied. WAMR with this patch: ``` Read graph weights, size in bytes: 3561598 [wasi_nn.c:297 WARNING] load_by_name_with_config() not found [wasi_nn_tensorflowlite.cpp:272 WARNING] Default encoding is CPU. Loaded graph into wasi-nn with ID: Graph#0 Read input tensor, size in bytes: 150528 1.) [166](198)Aix galericulata 2.) [34](1)Gallus gallus domesticus 3.) [158](1)Coccothraustes coccothraustes 4.) [778](1)Sitta europaea 5.) [819](1)Anas platyrhynchos ``` wasmedge: ``` Read graph weights, size in bytes: 3561598 Loaded graph into wasi-nn with ID: Graph#0 Read input tensor, size in bytes: 150528 1.) [166](198)Aix galericulata 2.) [34](1)Gallus gallus domesticus 3.) [158](1)Coccothraustes coccothraustes 4.) [778](1)Sitta europaea 5.) [819](1)Anas platyrhynchos ``` and "Aix galericulata" seems like a reasonable classification of the image to my eyes. [1] https://github.com/second-state/WasmEdge-WASINN-examples/tree/67f174bab59d98c1b52f7367ec0928701dc998f9/tflite-birds_v1-image [2] https://github.com/second-state/WasmEdge-WASINN-examples/pull/204 Related: https://github.com/bytecodealliance/wasm-micro-runtime/issues/3555 https://github.com/bytecodealliance/wasm-micro-runtime/issues/2611 --- .../wasi-nn/src/wasi_nn_tensorflowlite.cpp | 72 +++++++++++-------- 1 file changed, 44 insertions(+), 28 deletions(-) diff --git a/core/iwasm/libraries/wasi-nn/src/wasi_nn_tensorflowlite.cpp b/core/iwasm/libraries/wasi-nn/src/wasi_nn_tensorflowlite.cpp index 819bd52aff..9ac54e6644 100644 --- a/core/iwasm/libraries/wasi-nn/src/wasi_nn_tensorflowlite.cpp +++ b/core/iwasm/libraries/wasi-nn/src/wasi_nn_tensorflowlite.cpp @@ -9,6 +9,7 @@ #include "wasi_nn_backend.h" #include "wasm_export.h" +#include #include #include #include @@ -279,29 +280,53 @@ set_input(void *tflite_ctx, graph_execution_context ctx, uint32_t index, tensor *input_tensor) { TFLiteContext *tfl_ctx = (TFLiteContext *)tflite_ctx; + TfLiteType tfl_type; - if (input_tensor->type != fp32) { - NN_ERR_PRINTF("unsupported input tensor type %u", input_tensor->type); - return runtime_error; + switch (input_tensor->type) { + case fp32: + tfl_type = TfLiteType::kTfLiteFloat32; + break; +#if WASM_ENABLE_WASI_EPHEMERAL_NN != 0 + case u8: + tfl_type = TfLiteType::kTfLiteUInt8; + break; +#endif + default: + NN_ERR_PRINTF("unsupported input tensor type %u", + input_tensor->type); + return runtime_error; } wasi_nn_error res; if (success != (res = is_valid_graph_execution_context(tfl_ctx, ctx))) return res; - uint32_t num_tensors = - tfl_ctx->interpreters[ctx].interpreter->inputs().size(); + auto interpreter = tfl_ctx->interpreters[ctx].interpreter.get(); + + uint32_t num_tensors = interpreter->inputs().size(); NN_DBG_PRINTF("Number of tensors (%d)", num_tensors); if (index + 1 > num_tensors) { return runtime_error; } - auto tensor = tfl_ctx->interpreters[ctx].interpreter->input_tensor(index); + auto tensor = interpreter->input_tensor(index); if (tensor == NULL) { NN_ERR_PRINTF("Missing memory"); return too_large; } +#if WASM_ENABLE_WASI_EPHEMERAL_NN != 0 + if (TfLiteTensorType(tensor) != tfl_type) { + NN_ERR_PRINTF("Type mismatch"); + return runtime_error; + } + + if (TfLiteTensorCopyFromBuffer(tensor, input_tensor->data.buf, + input_tensor->data.size) + != kTfLiteOk) { + return runtime_error; + } +#else uint32_t model_tensor_size = 1; for (int i = 0; i < tensor->dims->size; ++i) model_tensor_size *= (uint32_t)tensor->dims->data[i]; @@ -346,6 +371,7 @@ set_input(void *tflite_ctx, graph_execution_context ctx, uint32_t index, it[i] = (uint8_t)(input_tensor_f[i] / scale + zero_point); } } +#endif return success; } @@ -388,14 +414,19 @@ get_output(void *tflite_ctx, graph_execution_context ctx, uint32_t index, return too_large; } - if (tensor->quantization.type == kTfLiteNoQuantization) { - NN_DBG_PRINTF("No quantization information"); #if WASM_ENABLE_WASI_EPHEMERAL_NN != 0 - if (output_tensor->size < tensor->bytes) { - NN_ERR_PRINTF("Insufficient memory to copy tensor %d", index); - return too_large; - } + size_t sz = TfLiteTensorByteSize(tensor); + if (output_tensor->size < sz) { + NN_ERR_PRINTF("Insufficient memory to copy tensor %d", index); + return too_large; + } + if (TfLiteTensorCopyToBuffer(tensor, output_tensor->buf, sz) != kTfLiteOk) { + return runtime_error; + } + *output_tensor_size = sz; #else + if (tensor->quantization.type == kTfLiteNoQuantization) { + NN_DBG_PRINTF("No quantization information"); /* * for now, maintain the bug-to-bug compatibility with the old abi, * where the size here is the number of fp32, not bytes. @@ -404,18 +435,13 @@ get_output(void *tflite_ctx, graph_execution_context ctx, uint32_t index, NN_ERR_PRINTF("Insufficient memory to copy tensor %d", index); return too_large; } -#endif bh_memcpy_s(output_tensor->buf, output_tensor->size, tensor->data.data, tensor->bytes); -#if WASM_ENABLE_WASI_EPHEMERAL_NN != 0 - *output_tensor_size = tensor->bytes; -#else /* * for now, maintain the bug-to-bug compatibility with the old abi, * where the size here is the number of fp32, not bytes. */ *output_tensor_size = tensor->bytes / sizeof(float); -#endif } else { // TODO: Assuming uint8 quantized networks. TfLiteAffineQuantization *quant_info = @@ -429,12 +455,6 @@ get_output(void *tflite_ctx, graph_execution_context ctx, uint32_t index, for (int i = 0; i < (int)tensor->dims->size; ++i) model_tensor_size *= (uint32_t)tensor->dims->data[i]; -#if WASM_ENABLE_WASI_EPHEMERAL_NN != 0 - if (output_tensor->size / sizeof(float) < model_tensor_size) { - NN_ERR_PRINTF("Insufficient memory to copy tensor %d", index); - return too_large; - } -#else /* * for now, maintain the bug-to-bug compatibility with the old abi, * where the size here is the number of fp32, not bytes. @@ -443,7 +463,6 @@ get_output(void *tflite_ctx, graph_execution_context ctx, uint32_t index, NN_ERR_PRINTF("Insufficient memory to copy tensor %d", index); return too_large; } -#endif uint8_t *ot = tfl_ctx->interpreters[ctx] .interpreter->typed_output_tensor(index); @@ -458,16 +477,13 @@ get_output(void *tflite_ctx, graph_execution_context ctx, uint32_t index, output_tensor_f[i] = (ot[i] - zero_point) * scale; } -#if WASM_ENABLE_WASI_EPHEMERAL_NN != 0 - *output_tensor_size = model_tensor_size * sizeof(float); -#else /* * for now, maintain the bug-to-bug compatibility with the old abi, * where the size here is the number of fp32, not bytes. */ *output_tensor_size = model_tensor_size; -#endif } +#endif return success; } From e40b05a5c6a3e5831714d6ff61dae8f6dd9bf426 Mon Sep 17 00:00:00 2001 From: "liang.he" Date: Fri, 1 Aug 2025 14:31:36 +0800 Subject: [PATCH 014/103] Add smoke tests for iwasm and wamrc binaries to validate build output (#4455) --- .github/workflows/build_iwasm_release.yml | 130 +++++++++++++--------- .github/workflows/build_wamrc.yml | 24 ++++ 2 files changed, 101 insertions(+), 53 deletions(-) diff --git a/.github/workflows/build_iwasm_release.yml b/.github/workflows/build_iwasm_release.yml index 6acd90fa64..d1bdd685d2 100644 --- a/.github/workflows/build_iwasm_release.yml +++ b/.github/workflows/build_iwasm_release.yml @@ -32,60 +32,60 @@ on: required: false env: - DEFAULT_BUILD_OPTIONS: + DEFAULT_BUILD_OPTIONS: "-DWAMR_BUILD_AOT=1 -DWAMR_BUILD_INTERP=1 -DWAMR_BUILD_FAST_JIT=1 -DWAMR_BUILD_JIT=1 \ - -DWAMR_BUILD_CUSTOM_NAME_SECTION=0 \ - -DWAMR_BUILD_DEBUG_INTERP=0 \ - -DWAMR_BUILD_DEBUG_AOT=0 \ - -DWAMR_BUILD_DUMP_CALL_STACK=0 \ - -DWAMR_BUILD_LIBC_UVWASI=0 \ - -DWAMR_BUILD_LIBC_EMCC=0 \ - -DWAMR_BUILD_LIB_RATS=0 \ - -DWAMR_BUILD_LOAD_CUSTOM_SECTION=0 \ - -DWAMR_BUILD_MEMORY_PROFILING=0 \ - -DWAMR_BUILD_MINI_LOADER=0 \ - -DWAMR_BUILD_MULTI_MODULE=0 \ - -DWAMR_BUILD_PERF_PROFILING=0 \ - -DWAMR_BUILD_SPEC_TEST=0 \ - -DWAMR_BUILD_BULK_MEMORY=1 \ - -DWAMR_BUILD_LIB_PTHREAD=1 \ - -DWAMR_BUILD_LIB_PTHREAD_SEMAPHORE=1 \ - -DWAMR_BUILD_LIB_WASI_THREADS=1 \ - -DWAMR_BUILD_LIBC_BUILTIN=1 \ - -DWAMR_BUILD_LIBC_WASI=1 \ - -DWAMR_BUILD_REF_TYPES=1 \ - -DWAMR_BUILD_SIMD=1 \ - -DWAMR_BUILD_SHARED_MEMORY=1 \ - -DWAMR_BUILD_TAIL_CALL=1 \ - -DWAMR_BUILD_THREAD_MGR=1" + -DWAMR_BUILD_CUSTOM_NAME_SECTION=0 \ + -DWAMR_BUILD_DEBUG_INTERP=0 \ + -DWAMR_BUILD_DEBUG_AOT=0 \ + -DWAMR_BUILD_DUMP_CALL_STACK=0 \ + -DWAMR_BUILD_LIBC_UVWASI=0 \ + -DWAMR_BUILD_LIBC_EMCC=0 \ + -DWAMR_BUILD_LIB_RATS=0 \ + -DWAMR_BUILD_LOAD_CUSTOM_SECTION=0 \ + -DWAMR_BUILD_MEMORY_PROFILING=0 \ + -DWAMR_BUILD_MINI_LOADER=0 \ + -DWAMR_BUILD_MULTI_MODULE=0 \ + -DWAMR_BUILD_PERF_PROFILING=0 \ + -DWAMR_BUILD_SPEC_TEST=0 \ + -DWAMR_BUILD_BULK_MEMORY=1 \ + -DWAMR_BUILD_LIB_PTHREAD=1 \ + -DWAMR_BUILD_LIB_PTHREAD_SEMAPHORE=1 \ + -DWAMR_BUILD_LIB_WASI_THREADS=1 \ + -DWAMR_BUILD_LIBC_BUILTIN=1 \ + -DWAMR_BUILD_LIBC_WASI=1 \ + -DWAMR_BUILD_REF_TYPES=1 \ + -DWAMR_BUILD_SIMD=1 \ + -DWAMR_BUILD_SHARED_MEMORY=1 \ + -DWAMR_BUILD_TAIL_CALL=1 \ + -DWAMR_BUILD_THREAD_MGR=1" GC_EH_BUILD_OPTIONS: "-DWAMR_BUILD_AOT=1 -DWAMR_BUILD_INTERP=1 -DWAMR_BUILD_FAST_INTERP=0 -DWAMR_BUILD_FAST_JIT=0 -DWAMR_BUILD_JIT=0 \ - -DWAMR_BUILD_CUSTOM_NAME_SECTION=0 \ - -DWAMR_BUILD_DEBUG_INTERP=0 \ - -DWAMR_BUILD_DEBUG_AOT=0 \ - -DWAMR_BUILD_DUMP_CALL_STACK=0 \ - -DWAMR_BUILD_LIBC_UVWASI=0 \ - -DWAMR_BUILD_LIBC_EMCC=0 \ - -DWAMR_BUILD_LIB_RATS=0 \ - -DWAMR_BUILD_LOAD_CUSTOM_SECTION=0 \ - -DWAMR_BUILD_MEMORY_PROFILING=0 \ - -DWAMR_BUILD_MINI_LOADER=0 \ - -DWAMR_BUILD_MULTI_MODULE=0 \ - -DWAMR_BUILD_PERF_PROFILING=0 \ - -DWAMR_BUILD_SPEC_TEST=0 \ - -DWAMR_BUILD_BULK_MEMORY=1 \ - -DWAMR_BUILD_LIB_PTHREAD=1 \ - -DWAMR_BUILD_LIB_PTHREAD_SEMAPHORE=1 \ - -DWAMR_BUILD_LIB_WASI_THREADS=1 \ - -DWAMR_BUILD_LIBC_BUILTIN=1 \ - -DWAMR_BUILD_LIBC_WASI=1 \ - -DWAMR_BUILD_REF_TYPES=1 \ - -DWAMR_BUILD_SIMD=1 \ - -DWAMR_BUILD_SHARED_MEMORY=1 \ - -DWAMR_BUILD_TAIL_CALL=1 \ - -DWAMR_BUILD_THREAD_MGR=1 \ - -DWAMR_BUILD_EXCE_HANDLING=1 \ - -DWAMR_BUILD_GC=1" + -DWAMR_BUILD_CUSTOM_NAME_SECTION=0 \ + -DWAMR_BUILD_DEBUG_INTERP=0 \ + -DWAMR_BUILD_DEBUG_AOT=0 \ + -DWAMR_BUILD_DUMP_CALL_STACK=0 \ + -DWAMR_BUILD_LIBC_UVWASI=0 \ + -DWAMR_BUILD_LIBC_EMCC=0 \ + -DWAMR_BUILD_LIB_RATS=0 \ + -DWAMR_BUILD_LOAD_CUSTOM_SECTION=0 \ + -DWAMR_BUILD_MEMORY_PROFILING=0 \ + -DWAMR_BUILD_MINI_LOADER=0 \ + -DWAMR_BUILD_MULTI_MODULE=0 \ + -DWAMR_BUILD_PERF_PROFILING=0 \ + -DWAMR_BUILD_SPEC_TEST=0 \ + -DWAMR_BUILD_BULK_MEMORY=1 \ + -DWAMR_BUILD_LIB_PTHREAD=1 \ + -DWAMR_BUILD_LIB_PTHREAD_SEMAPHORE=1 \ + -DWAMR_BUILD_LIB_WASI_THREADS=1 \ + -DWAMR_BUILD_LIBC_BUILTIN=1 \ + -DWAMR_BUILD_LIBC_WASI=1 \ + -DWAMR_BUILD_REF_TYPES=1 \ + -DWAMR_BUILD_SIMD=1 \ + -DWAMR_BUILD_SHARED_MEMORY=1 \ + -DWAMR_BUILD_TAIL_CALL=1 \ + -DWAMR_BUILD_THREAD_MGR=1 \ + -DWAMR_BUILD_EXCE_HANDLING=1 \ + -DWAMR_BUILD_GC=1" permissions: contents: read @@ -97,9 +97,9 @@ jobs: matrix: include: - build_options: $DEFAULT_BUILD_OPTIONS - suffix: '' + suffix: "" - build_options: $GC_EH_BUILD_OPTIONS - suffix: '-gc-eh' + suffix: "-gc-eh" permissions: contents: write # for uploading release artifacts @@ -126,6 +126,30 @@ jobs: cmake --build build --config Release --parallel 4 working-directory: ${{ inputs.cwd }} + - name: smoke test on non-Windows + if: ${{ !startsWith(inputs.runner, 'windows') }} + shell: bash + run: | + if [[ ! -f build/iwasm ]]; then + echo "iwasm binary is not found in the expected location." + exit 1 + fi + + build/iwasm --version + working-directory: ${{ inputs.cwd }} + + - name: smoke test on Windows + if: ${{ startsWith(inputs.runner, 'windows') }} + shell: bash + run: | + if [[ ! -f build/Release/iwasm ]]; then + echo "iwasm binary is not found in the expected location." + exit 1 + fi + + build/Release/iwasm --version + working-directory: ${{ inputs.cwd }} + - name: Compress the binary on Windows if: inputs.runner == 'windows-latest' run: | diff --git a/.github/workflows/build_wamrc.yml b/.github/workflows/build_wamrc.yml index 07e3c7cdb0..df257723f0 100644 --- a/.github/workflows/build_wamrc.yml +++ b/.github/workflows/build_wamrc.yml @@ -62,6 +62,30 @@ jobs: cmake --build build --config Release --parallel 4 working-directory: wamr-compiler + - name: smoke test on non-windows + if: ${{ !startsWith(inputs.runner, 'windows') }} + shell: bash + run: | + if [[ ! -f build/wamrc ]]; then + echo "wamrc binary is not found in the expected location." + exit 1 + fi + + build/wamrc --version + working-directory: wamr-compiler + + - name: smoke test on Windows + if: ${{ startsWith(inputs.runner, 'windows') }} + shell: bash + run: | + if [[ ! -f build/Release/wamrc ]]; then + echo "wamrc binary is not found in the expected location." + exit 1 + fi + + build/Release/wamrc --version + working-directory: wamr-compiler + - name: Compress the binary on Windows if: inputs.runner == 'windows-latest' && inputs.release run: | From 5d15f8fa2dd3039e27cf4292b76266c51902bbd8 Mon Sep 17 00:00:00 2001 From: "liang.he" Date: Fri, 1 Aug 2025 14:44:26 +0800 Subject: [PATCH 015/103] Update Dockerfile to install minimal Zephyr SDK (#4515) Reduce the time consumption for `docker build`. --- product-mini/platforms/zephyr/simple/Dockerfile | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/product-mini/platforms/zephyr/simple/Dockerfile b/product-mini/platforms/zephyr/simple/Dockerfile index 6449c9862e..73171cfea7 100644 --- a/product-mini/platforms/zephyr/simple/Dockerfile +++ b/product-mini/platforms/zephyr/simple/Dockerfile @@ -27,15 +27,16 @@ ARG ZEPHYR_SDK_VERSION=0.16.9 # In west_lite.yml, the Zephyr version is set to v3.7.0 #ARG ZEPHYR_VERSION=3.7.0 -# Install the Zephyr Software Development Kit (SDK) +# Install the Zephyr Software Development Kit (SDK) minimal version WORKDIR /root/zephyrproject/zephyr-sdk # hadolint ignore=DL4006 -RUN wget --progress=dot:giga https://github.com/zephyrproject-rtos/sdk-ng/releases/download/v${ZEPHYR_SDK_VERSION}/zephyr-sdk-${ZEPHYR_SDK_VERSION}_linux-x86_64.tar.xz \ +RUN wget --progress=dot:giga https://github.com/zephyrproject-rtos/sdk-ng/releases/download/v${ZEPHYR_SDK_VERSION}/zephyr-sdk-${ZEPHYR_SDK_VERSION}_linux-x86_64_minimal.tar.xz \ && wget --progress=dot:giga -O - https://github.com/zephyrproject-rtos/sdk-ng/releases/download/v${ZEPHYR_SDK_VERSION}/sha256.sum | shasum --check --ignore-missing \ - && tar --strip-components=1 -xf zephyr-sdk-${ZEPHYR_SDK_VERSION}_linux-x86_64.tar.xz && rm zephyr-sdk-${ZEPHYR_SDK_VERSION}_linux-x86_64.tar.xz + && tar --strip-components=1 -xf zephyr-sdk-${ZEPHYR_SDK_VERSION}_linux-x86_64_minimal.tar.xz && rm zephyr-sdk-${ZEPHYR_SDK_VERSION}_linux-x86_64_minimal.tar.xz # hadolint ignore=DL4006 -# Install host tools and Register Zephyr SDK CMake package -RUN ./setup.sh -h -c +# Install arc tools, host tools and Register Zephyr SDK CMake package +# If you want to use other toolchains, please change the -t option +RUN ./setup.sh -t arc-zephyr-elf -h -c # Install west # hadolint ignore=DL3013,DL3059 From b00ff11ff13d66f04333df8d10cb4a925cc31e3b Mon Sep 17 00:00:00 2001 From: linear0211 <144136043+linear0211@users.noreply.github.com> Date: Mon, 4 Aug 2025 11:47:54 +0900 Subject: [PATCH 016/103] Fix parsing of multiple IPs in --addr-pool option (#4526) --- product-mini/platforms/common/libc_wasi.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/product-mini/platforms/common/libc_wasi.c b/product-mini/platforms/common/libc_wasi.c index 51255f7ac4..eb2e8c27f3 100644 --- a/product-mini/platforms/common/libc_wasi.c +++ b/product-mini/platforms/common/libc_wasi.c @@ -141,7 +141,7 @@ libc_wasi_parse(char *arg, libc_wasi_parse_context_t *ctx) } ctx->addr_pool[ctx->addr_pool_size++] = token; - token = strtok(NULL, ";"); + token = strtok(NULL, ","); } } else if (!strncmp(arg, "--allow-resolve=", 16)) { From 390e78030e53d2d2302ec24a26c847ea400693ad Mon Sep 17 00:00:00 2001 From: "liang.he" Date: Mon, 4 Aug 2025 10:48:02 +0800 Subject: [PATCH 017/103] Add inputs for optional WAMR releases in the release process workflow (#4486) --- .github/workflows/release_process.yml | 72 ++++++++++++++++++--------- 1 file changed, 48 insertions(+), 24 deletions(-) diff --git a/.github/workflows/release_process.yml b/.github/workflows/release_process.yml index bb99681dcb..298d0004a4 100644 --- a/.github/workflows/release_process.yml +++ b/.github/workflows/release_process.yml @@ -11,6 +11,26 @@ on: type: boolean required: false default: false + release_wamr_sdk: + description: "If the WAMR SDK in the release" + type: boolean + required: false + default: false + release_wamr_lldb: + description: "If the WAMR LLDB in the release" + type: boolean + required: false + default: false + release_wamr_ide_vscode_ext: + description: "If the WAMR VSCode extension in the release" + type: boolean + required: false + default: false + release_wamr_wasi_ext: + description: "If the WAMR WASI extensions in the release" + type: boolean + required: false + default: true # Cancel any in-flight jobs for the same PR/branch so there's only one active # at a time @@ -93,7 +113,7 @@ jobs: release_wamrc_on_ubuntu_2204: permissions: contents: write # upload release artifact - needs: [create_tag, create_release, build_llvm_libraries_on_ubuntu_2204 ] + needs: [create_tag, create_release, build_llvm_libraries_on_ubuntu_2204] uses: ./.github/workflows/build_wamrc.yml with: llvm_cache_key: ${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }} @@ -170,6 +190,7 @@ jobs: permissions: contents: write # upload release artifact needs: [create_tag, create_release] + if: ${{ inputs.release_wamr_sdk }} uses: ./.github/workflows/build_wamr_sdk.yml with: config_file: wamr_config_ubuntu_release.cmake @@ -183,6 +204,7 @@ jobs: permissions: contents: write # upload release artifact needs: [create_tag, create_release] + if: ${{ inputs.release_wamr_sdk }} uses: ./.github/workflows/build_wamr_sdk.yml with: config_file: wamr_config_macos_release.cmake @@ -192,30 +214,29 @@ jobs: wasi_sdk_url: https://github.com/WebAssembly/wasi-sdk/releases/download/wasi-sdk-19/wasi-sdk-19.0-macos.tar.gz wamr_app_framework_url: https://github.com/bytecodealliance/wamr-app-framework.git - # Let's disable it for now and reopen it when the actual requirement arises. - # Please ensure all dependencies have been updated before reopening. + # vscode extension cross-platform + release_wamr_ide_vscode_ext: + permissions: + contents: write # upload release artifact + needs: [create_tag, create_release] + if: ${{ inputs.release_wamr_ide_vscode_ext}} + uses: ./.github/workflows/build_wamr_vscode_ext.yml + secrets: inherit + with: + upload_url: ${{ needs.create_release.outputs.upload_url }} + ver_num: ${{ needs.create_tag.outputs.new_ver }} + # - # # vscode extension cross-platform - # release_wamr_ide_vscode_ext: - # permissions: - # contents: write # upload release artifact - # needs: [create_tag, create_release] - # uses: ./.github/workflows/build_wamr_vscode_ext.yml - # secrets: inherit - # with: - # upload_url: ${{ needs.create_release.outputs.upload_url }} - # ver_num: ${{ needs.create_tag.outputs.new_ver }} - - # # - # # vscode extension docker images package - # release_wamr_ide_docker_images_package: - # permissions: - # contents: write # upload release artifact - # needs: [create_tag, create_release] - # uses: ./.github/workflows/build_docker_images.yml - # with: - # upload_url: ${{ needs.create_release.outputs.upload_url }} - # ver_num: ${{ needs.create_tag.outputs.new_ver }} + # vscode extension docker images package + release_wamr_ide_docker_images_package: + permissions: + contents: write # upload release artifact + needs: [create_tag, create_release] + if: ${{ inputs.release_wamr_ide_vscode_ext}} + uses: ./.github/workflows/build_docker_images.yml + with: + upload_url: ${{ needs.create_release.outputs.upload_url }} + ver_num: ${{ needs.create_tag.outputs.new_ver }} # # WAMR_LLDB @@ -223,6 +244,7 @@ jobs: permissions: contents: write # upload release artifact needs: [create_tag, create_release] + if: ${{ inputs.release_wamr_lldb }} uses: ./.github/workflows/build_wamr_lldb.yml with: runner: ubuntu-22.04 @@ -233,6 +255,7 @@ jobs: permissions: contents: write # upload release artifact needs: [create_tag, create_release] + if: ${{ inputs.release_wamr_lldb }} uses: ./.github/workflows/build_wamr_lldb.yml with: runner: macos-13 @@ -244,6 +267,7 @@ jobs: permissions: contents: write # upload release artifact needs: [create_tag, create_release] + if: ${{ inputs.release_wamr_wasi_ext }} uses: ./.github/workflows/build_wamr_wasi_extensions.yml with: upload_url: ${{ needs.create_release.outputs.upload_url }} From e1ba1dde10cbbb6303f0754e693eaf4dc064eeea Mon Sep 17 00:00:00 2001 From: Zhenwei Jin <109658203+kylo5aby@users.noreply.github.com> Date: Mon, 4 Aug 2025 15:16:18 +0800 Subject: [PATCH 018/103] enhance WAMR_BUILD_SANITIZER to support multiple sanitizers (#4489) --- build-scripts/config_common.cmake | 70 ++++++++++++++++++++--------- tests/wamr-test-suites/test_wamr.sh | 27 +++-------- 2 files changed, 56 insertions(+), 41 deletions(-) diff --git a/build-scripts/config_common.cmake b/build-scripts/config_common.cmake index 8cdce4a017..c2121e424a 100644 --- a/build-scripts/config_common.cmake +++ b/build-scripts/config_common.cmake @@ -141,28 +141,58 @@ include (${WAMR_ROOT_DIR}/build-scripts/package.cmake) if (NOT DEFINED WAMR_BUILD_SANITIZER) set(WAMR_BUILD_SANITIZER $ENV{WAMR_BUILD_SANITIZER}) -endif () +endif() -if (NOT DEFINED WAMR_BUILD_SANITIZER) - set(WAMR_BUILD_SANITIZER "") -elseif (WAMR_BUILD_SANITIZER STREQUAL "ubsan") - set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -g -O0 -fno-omit-frame-pointer -fsanitize=undefined -fno-sanitize-recover=all -fno-sanitize=alignment" ) - set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -fsanitize=undefined") -elseif (WAMR_BUILD_SANITIZER STREQUAL "asan") - if (NOT WAMR_BUILD_JIT EQUAL 1) - set (ASAN_OPTIONS "verbosity=2 debug=true ") - set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -g -O0 -fno-omit-frame-pointer -fsanitize=address -fno-sanitize-recover=all" ) - set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -fsanitize=address") +if (NOT WAMR_BUILD_SANITIZER STREQUAL "") + set(SUPPORTED_SANITIZERS "ubsan;asan;tsan;posan") + string(REPLACE "," ";" SANITIZER_LIST "${WAMR_BUILD_SANITIZER}") + + # Check uncompabile sanitizers + if("tsan" IN_LIST SANITIZER_LIST AND "asan" IN_LIST SANITIZER_LIST) + message(FATAL_ERROR "ThreadSanitizer (tsan) and AddressSanitizer (asan) cannot be used together!") endif() -elseif (WAMR_BUILD_SANITIZER STREQUAL "tsan") - set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -g -O0 -fno-omit-frame-pointer -fsanitize=thread -fno-sanitize-recover=all" ) - set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -fsanitize=thread") -elseif (WAMR_BUILD_SANITIZER STREQUAL "posan") - set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -g -O0 -fno-omit-frame-pointer -fsanitize=pointer-overflow -fno-sanitize-recover=all" ) - set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -fsanitize=pointer-overflow") -elseif (NOT (WAMR_BUILD_SANITIZER STREQUAL "") ) - message(SEND_ERROR "Unsupported sanitizer: ${WAMR_BUILD_SANITIZER}") -endif() + + # Check every sanitizer in the list + set(INVALID_SANITIZERS "") + list(REMOVE_DUPLICATES SANITIZER_LIST) + set(SANITIZER_FLAGS) + set(NO_SANITIZER_FLAGS) + foreach(sanitizer ${SANITIZER_LIST}) + string(STRIP "${sanitizer}" sanitizer) + if(NOT sanitizer IN_LIST SUPPORTED_SANITIZERS) + list(APPEND INVALID_SANITIZERS "${sanitizer}") + elseif(sanitizer STREQUAL "ubsan") + list(APPEND SANITIZER_FLAGS "undefined") + list(APPEND NO_SANITIZER_FLAGS "alignment") + elseif(sanitizer STREQUAL "asan") + if (NOT WAMR_BUILD_JIT EQUAL 1) + set(ENV{ASAN_OPTIONS} "verbosity=2 debug=true") + list(APPEND SANITIZER_FLAGS "address") + else() + message(WARNING "AddressSanitizer is not supported in LLVM JIT mode, skip it") + endif() + elseif(sanitizer STREQUAL "tsan") + list(APPEND SANITIZER_FLAGS "thread") + elseif(sanitizer STREQUAL "posan") + list(APPEND SANITIZER_FLAGS "pointer-overflow") + endif() + endforeach() + + if(INVALID_SANITIZERS) + message(FATAL_ERROR "Unsupported sanitizers: ${INVALID_SANITIZERS}") + endif() + # common flags for all sanitizers + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -g -O0 -fno-omit-frame-pointer -fno-sanitize-recover=all") + if(SANITIZER_FLAGS) + string(REPLACE ";" "," SANITIZER_FLAGS_STR "${SANITIZER_FLAGS}") + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fsanitize=${SANITIZER_FLAGS_STR}") + set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -fsanitize=${SANITIZER_FLAGS_STR}") + endif() + if(NO_SANITIZER_FLAGS) + string(REPLACE ";" "," NO_SANITIZER_FLAGS_STR "${NO_SANITIZER_FLAGS}") + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fno-sanitize=${NO_SANITIZER_FLAGS_STR}") + endif() +endif () if (WAMR_BUILD_LINUX_PERF EQUAL 1) if (NOT WAMR_BUILD_JIT AND NOT WAMR_BUILD_AOT) diff --git a/tests/wamr-test-suites/test_wamr.sh b/tests/wamr-test-suites/test_wamr.sh index 6f498653f0..1edf363bcb 100755 --- a/tests/wamr-test-suites/test_wamr.sh +++ b/tests/wamr-test-suites/test_wamr.sh @@ -39,7 +39,9 @@ function help() echo "-F set the firmware path used by qemu" echo "-C enable code coverage collect" echo "-j set the platform to test" - echo "-T set sanitizer to use in tests(ubsan|tsan|asan|posan)" + echo "-T set the sanitizer(s) used during testing. It can be either a comma-separated list + (e.g., ubsan, asan) or a single option + (e.g., ubsan, tsan, asan, posan)." echo "-A use the specified wamrc command instead of building it" echo "-N enable extended const expression feature" echo "-r [requirement name] [N [N ...]] specify a requirement name followed by one or more" @@ -1066,26 +1068,9 @@ function trigger() EXTRA_COMPILE_FLAGS+=" -DWAMR_BUILD_TAIL_CALL=1" fi - echo "SANITIZER IS" $WAMR_BUILD_SANITIZER - - if [[ "$WAMR_BUILD_SANITIZER" == "ubsan" ]]; then - echo "Setting run with ubsan" - EXTRA_COMPILE_FLAGS+=" -DWAMR_BUILD_SANITIZER=ubsan" - fi - - if [[ "$WAMR_BUILD_SANITIZER" == "asan" ]]; then - echo "Setting run with asan" - EXTRA_COMPILE_FLAGS+=" -DWAMR_BUILD_SANITIZER=asan" - fi - - if [[ "$WAMR_BUILD_SANITIZER" == "tsan" ]]; then - echo "Setting run with tsan" - EXTRA_COMPILE_FLAGS+=" -DWAMR_BUILD_SANITIZER=tsan" - fi - - if [[ "$WAMR_BUILD_SANITIZER" == "posan" ]]; then - echo "Setting run with posan" - EXTRA_COMPILE_FLAGS+=" -DWAMR_BUILD_SANITIZER=posan" + if [[ -n "$WAMR_BUILD_SANITIZER" ]]; then + echo "Setting run with sanitizer(s): $WAMR_BUILD_SANITIZER" + EXTRA_COMPILE_FLAGS+=" -DWAMR_BUILD_SANITIZER=$WAMR_BUILD_SANITIZER" fi # Make sure we're using the builtin WASI libc implementation From f5b7418f89e2bd46cf22572ecb6ae4bed1fbe8ea Mon Sep 17 00:00:00 2001 From: Zhenwei Jin <109658203+kylo5aby@users.noreply.github.com> Date: Mon, 4 Aug 2025 15:28:44 +0800 Subject: [PATCH 019/103] force wamrc debug build using release version of dependent libs on Windows (#4496) --- build-scripts/config_common.cmake | 6 ++++++ wamr-compiler/CMakeLists.txt | 5 +++++ 2 files changed, 11 insertions(+) diff --git a/build-scripts/config_common.cmake b/build-scripts/config_common.cmake index c2121e424a..d89c3a285e 100644 --- a/build-scripts/config_common.cmake +++ b/build-scripts/config_common.cmake @@ -99,6 +99,12 @@ if (WAMR_BUILD_JIT EQUAL 1) # Enable Lazy JIT by default set (WAMR_BUILD_LAZY_JIT 1) endif () + + # In Debug mode, always use release builds of pre-built dependency libraries + if (WAMR_BUILD_PLATFORM STREQUAL "windows" AND MSVC) + add_compile_options($<$:/MD>) + endif() + if (NOT DEFINED LLVM_DIR) set (LLVM_SRC_ROOT "${WAMR_ROOT_DIR}/core/deps/llvm") set (LLVM_BUILD_ROOT "${LLVM_SRC_ROOT}/build") diff --git a/wamr-compiler/CMakeLists.txt b/wamr-compiler/CMakeLists.txt index 8ee61cab4d..00940c62d2 100644 --- a/wamr-compiler/CMakeLists.txt +++ b/wamr-compiler/CMakeLists.txt @@ -159,6 +159,11 @@ if (WAMR_BUILD_DEBUG_AOT EQUAL 1) endif() # Enable LLVM +# In Debug mode, always use release builds of pre-built dependency libraries +if (WAMR_BUILD_PLATFORM STREQUAL "windows" AND MSVC) + add_compile_options($<$:/MD>) +endif() + if (NOT WAMR_BUILD_WITH_CUSTOM_LLVM) set (LLVM_SRC_ROOT "${PROJECT_SOURCE_DIR}/../core/deps/llvm") if (NOT EXISTS "${LLVM_SRC_ROOT}/build") From 5b63f3526de4074b65ddace50908b3a447001269 Mon Sep 17 00:00:00 2001 From: YAMAMOTO Takashi Date: Tue, 5 Aug 2025 09:39:35 +0900 Subject: [PATCH 020/103] core/iwasm/libraries/lib-socket/test/nslookup.c: use gai_strerror (#4532) --- core/iwasm/libraries/lib-socket/test/nslookup.c | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/core/iwasm/libraries/lib-socket/test/nslookup.c b/core/iwasm/libraries/lib-socket/test/nslookup.c index 8e64d06be3..2e42ef8458 100644 --- a/core/iwasm/libraries/lib-socket/test/nslookup.c +++ b/core/iwasm/libraries/lib-socket/test/nslookup.c @@ -4,6 +4,7 @@ */ #include +#include #include #include #include @@ -28,6 +29,15 @@ test_nslookup(int af) hints.ai_family = af; hints.ai_socktype = SOCK_STREAM; int ret = getaddrinfo(url, 0, &hints, &res); + if (ret != 0) { + if (ret == EAI_SYSTEM) { + fprintf(stderr, "getaddrinfo failed: %s (%s)\n", gai_strerror(ret), + strerror(errno)); + } + else { + fprintf(stderr, "getaddrinfo failed: %s\n", gai_strerror(ret)); + } + } assert(ret == 0); struct addrinfo *address = res; while (address) { From 6b51c61f5e50573f672916a7df953a2704b823f4 Mon Sep 17 00:00:00 2001 From: YAMAMOTO Takashi Date: Wed, 6 Aug 2025 11:40:56 +0900 Subject: [PATCH 021/103] wasi-nn: fix set_input memory address validation for the legacy abi (#4534) cf. https://github.com/bytecodealliance/wasm-micro-runtime/issues/3223 --- .../libraries/wasi-nn/src/utils/wasi_nn_app_native.c | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/core/iwasm/libraries/wasi-nn/src/utils/wasi_nn_app_native.c b/core/iwasm/libraries/wasi-nn/src/utils/wasi_nn_app_native.c index 4d56fed93e..b44f45aac0 100644 --- a/core/iwasm/libraries/wasi-nn/src/utils/wasi_nn_app_native.c +++ b/core/iwasm/libraries/wasi-nn/src/utils/wasi_nn_app_native.c @@ -108,9 +108,18 @@ tensor_data_app_native(wasm_module_inst_t instance, uint32_t total_elements, #define data_size total_elements #endif + uint64 data_size_in_bytes = data_size; +#if WASM_ENABLE_WASI_EPHEMERAL_NN == 0 + data_size_in_bytes *= sizeof(float); + if (data_size_in_bytes / sizeof(float) != data_size) { + /* overflow */ + return invalid_argument; + } +#endif + if (!wasm_runtime_validate_app_addr(instance, (uint64)input_tensor_wasm->data_offset, - (uint64)data_size)) { + data_size_in_bytes)) { NN_ERR_PRINTF("input_tensor_wasm->data_offset is invalid"); return invalid_argument; } From f90cc086ad0926b73c21ad935a6937443f715a27 Mon Sep 17 00:00:00 2001 From: YAMAMOTO Takashi Date: Mon, 11 Aug 2025 16:05:44 +0900 Subject: [PATCH 022/103] nn-cli: fix get_output index (#4543) --- wamr-wasi-extensions/samples/nn-cli/main.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wamr-wasi-extensions/samples/nn-cli/main.c b/wamr-wasi-extensions/samples/nn-cli/main.c index f85d647568..ca0a893ef1 100644 --- a/wamr-wasi-extensions/samples/nn-cli/main.c +++ b/wamr-wasi-extensions/samples/nn-cli/main.c @@ -406,7 +406,7 @@ get_output(char *options) exit(1); } nnret = - wasi_ephemeral_nn_get_output(c, 0, resultbuf, resultbufsz, &resultsz); + wasi_ephemeral_nn_get_output(c, idx, resultbuf, resultbufsz, &resultsz); if (nnret == wasi_ephemeral_nn_error_too_large) { resultbufsz *= 2; goto retry; From 082e558d66bb41e73470b5537593b7e3227b93c5 Mon Sep 17 00:00:00 2001 From: YAMAMOTO Takashi Date: Mon, 11 Aug 2025 16:06:00 +0900 Subject: [PATCH 023/103] wamr-compiler/build_llvm.sh: use dot instead of source (#4541) note that dot is in posix and more portable than source. --- wamr-compiler/build_llvm.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wamr-compiler/build_llvm.sh b/wamr-compiler/build_llvm.sh index 75285b52cf..c9e2dd910f 100755 --- a/wamr-compiler/build_llvm.sh +++ b/wamr-compiler/build_llvm.sh @@ -14,6 +14,6 @@ cleanup() { trap cleanup EXIT INT TERM /usr/bin/env python3 -m venv --clear "$TEMP_DIR" -source "$TEMP_DIR/bin/activate" +. "$TEMP_DIR/bin/activate" /usr/bin/env python3 -m pip install -r ../build-scripts/requirements.txt /usr/bin/env python3 ../build-scripts/build_llvm.py "$@" From c0a32b317df67878ad6c1939eb055e263642562c Mon Sep 17 00:00:00 2001 From: YAMAMOTO Takashi Date: Mon, 11 Aug 2025 16:06:17 +0900 Subject: [PATCH 024/103] wamr-compiler: add --llvm-version option (#4540) llvm is one of the most important component of wamrc. otoh, i often forget which version of llvm i linked to my wamrc binary. this option would help people with a dim memory like me. ```shell spacetanuki% ./wamrc --llvm-version LLVM 19.1.2 spacetanuki% ``` --- wamr-compiler/main.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/wamr-compiler/main.c b/wamr-compiler/main.c index 62b0dfb90f..2ca9a175db 100644 --- a/wamr-compiler/main.c +++ b/wamr-compiler/main.c @@ -9,6 +9,7 @@ #include "wasm_export.h" #include "aot_export.h" +#include #include #if BH_HAS_DLFCN @@ -218,6 +219,7 @@ print_help() printf(" WARNING: enable this feature will largely increase code size\n"); printf(" -v=n Set log verbose level (0 to 5, default is 2), larger with more log\n"); printf(" --version Show version information\n"); + printf(" --llvm-version Show LLVM version information\n"); printf("Examples: wamrc -o test.aot test.wasm\n"); printf(" wamrc --target=i386 -o test.aot test.wasm\n"); printf(" wamrc --target=i386 --format=object -o test.o test.wasm\n"); @@ -676,6 +678,12 @@ main(int argc, char *argv[]) printf("wamrc %u.%u.%u\n", major, minor, patch); return 0; } + else if (!strcmp(argv[0], "--llvm-version")) { + unsigned major, minor, patch; + LLVMGetVersion(&major, &minor, &patch); + printf("LLVM %u.%u.%u\n", major, minor, patch); + return 0; + } else PRINT_HELP_AND_EXIT(); } From 0baff8001d39504bc24df77c21cd6a3edef392a8 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 11 Aug 2025 15:06:34 +0800 Subject: [PATCH 025/103] build(deps): Bump github/codeql-action from 3.29.4 to 3.29.5 (#4538) Bumps [github/codeql-action](https://github.com/github/codeql-action) from 3.29.4 to 3.29.5. - [Release notes](https://github.com/github/codeql-action/releases) - [Commits](https://github.com/github/codeql-action/compare/v3.29.4...v3.29.5) --- updated-dependencies: - dependency-name: github/codeql-action dependency-version: 3.29.5 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/codeql.yml | 6 +++--- .github/workflows/supply_chain.yml | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml index fea92c9f6e..e984836a0e 100644 --- a/.github/workflows/codeql.yml +++ b/.github/workflows/codeql.yml @@ -53,7 +53,7 @@ jobs: # Initializes the CodeQL tools for scanning. - name: Initialize CodeQL - uses: github/codeql-action/init@v3.29.4 + uses: github/codeql-action/init@v3.29.5 with: languages: ${{ matrix.language }} @@ -70,7 +70,7 @@ jobs: - run: | ./.github/scripts/codeql_buildscript.sh - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@v3.29.4 + uses: github/codeql-action/analyze@v3.29.5 with: category: "/language:${{matrix.language}}" upload: false @@ -99,7 +99,7 @@ jobs: output: ${{ steps.step1.outputs.sarif-output }}/cpp.sarif - name: Upload CodeQL results to code scanning - uses: github/codeql-action/upload-sarif@v3.29.4 + uses: github/codeql-action/upload-sarif@v3.29.5 with: sarif_file: ${{ steps.step1.outputs.sarif-output }} category: "/language:${{matrix.language}}" diff --git a/.github/workflows/supply_chain.yml b/.github/workflows/supply_chain.yml index 57e59d0ddf..e5ea04acd6 100644 --- a/.github/workflows/supply_chain.yml +++ b/.github/workflows/supply_chain.yml @@ -60,6 +60,6 @@ jobs: # Upload the results to GitHub's code scanning dashboard. - name: "Upload to code-scanning" - uses: github/codeql-action/upload-sarif@701df0e49d84a24bd8f0d01f80c0dbf69ab07674 + uses: github/codeql-action/upload-sarif@7273f08caa1dcf2c2837f362f1982de0ab4dc344 with: sarif_file: results.sarif From 2d05aece1a307aa6d18121e0a2344e7b355736b5 Mon Sep 17 00:00:00 2001 From: Zhenwei Jin <109658203+kylo5aby@users.noreply.github.com> Date: Mon, 11 Aug 2025 15:07:15 +0800 Subject: [PATCH 026/103] add validation for struct field type (#4536) --- core/iwasm/aot/aot_loader.c | 9 ++++++++- core/iwasm/common/wasm_loader_common.c | 14 ++++++++++++++ core/iwasm/common/wasm_loader_common.h | 6 ++++++ core/iwasm/interpreter/wasm_loader.c | 4 ++++ 4 files changed, 32 insertions(+), 1 deletion(-) diff --git a/core/iwasm/aot/aot_loader.c b/core/iwasm/aot/aot_loader.c index b0f1556653..388d9ffdff 100644 --- a/core/iwasm/aot/aot_loader.c +++ b/core/iwasm/aot/aot_loader.c @@ -1787,7 +1787,7 @@ load_types(const uint8 **p_buf, const uint8 *buf_end, AOTModule *module, read_uint32(buf, buf_end, j); #if WASM_ENABLE_AOT_VALIDATOR != 0 /* an equivalence type should be before the type it refers to */ - if (j > i) { + if (j >= i) { set_error_buf(error_buf, error_buf_size, "invalid type index"); goto fail; } @@ -1964,6 +1964,13 @@ load_types(const uint8 **p_buf, const uint8 *buf_end, AOTModule *module, read_uint8(buf, buf_end, struct_type->fields[j].field_flags); read_uint8(buf, buf_end, field_type); +#if WASM_ENABLE_AOT_VALIDATOR != 0 + if (!is_valid_field_type(field_type)) { + set_error_buf(error_buf, error_buf_size, + "invalid field type"); + goto fail; + } +#endif struct_type->fields[j].field_type = field_type; struct_type->fields[j].field_size = field_size = (uint8)wasm_reftype_size(field_type); diff --git a/core/iwasm/common/wasm_loader_common.c b/core/iwasm/common/wasm_loader_common.c index 4243e9198b..397144e8e2 100644 --- a/core/iwasm/common/wasm_loader_common.c +++ b/core/iwasm/common/wasm_loader_common.c @@ -179,6 +179,20 @@ is_valid_func_type(const WASMFuncType *func_type) return true; } +bool +is_valid_packed_type(uint8 packed_type) +{ + return packed_type == PACKED_TYPE_I8 || packed_type == PACKED_TYPE_I16; +} + +bool +is_valid_field_type(uint8 field_type) +{ + if (is_valid_value_type(field_type) || is_valid_packed_type(field_type)) + return true; + return false; +} + /* * Indices are represented as a u32. */ diff --git a/core/iwasm/common/wasm_loader_common.h b/core/iwasm/common/wasm_loader_common.h index d5394bf99f..1c4c393468 100644 --- a/core/iwasm/common/wasm_loader_common.h +++ b/core/iwasm/common/wasm_loader_common.h @@ -38,6 +38,12 @@ is_valid_value_type_for_interpreter(uint8 value_tpye); bool is_valid_func_type(const WASMFuncType *func_type); +bool +is_valid_packed_type(uint8 packed_type); + +bool +is_valid_field_type(uint8 field_type); + bool is_indices_overflow(uint32 import, uint32 other, char *error_buf, uint32 error_buf_size); diff --git a/core/iwasm/interpreter/wasm_loader.c b/core/iwasm/interpreter/wasm_loader.c index bca5fcbbf5..6139167f62 100644 --- a/core/iwasm/interpreter/wasm_loader.c +++ b/core/iwasm/interpreter/wasm_loader.c @@ -1961,6 +1961,10 @@ resolve_struct_type(const uint8 **p_buf, const uint8 *buf_end, error_buf_size)) { goto fail; } + if (!is_valid_field_type(ref_type.ref_type)) { + set_error_buf(error_buf, error_buf_size, "invalid field type"); + goto fail; + } type->fields[i].field_type = ref_type.ref_type; if (need_ref_type_map) { type->ref_type_maps[j].index = i; From a4f30771868608b54f921545c56d9c78ac0e54a1 Mon Sep 17 00:00:00 2001 From: "liang.he" Date: Mon, 11 Aug 2025 15:09:13 +0800 Subject: [PATCH 027/103] docs: add templates for advanced disclosure and security release emails in runbook (#4529) --- doc/security_issue_runbook.md | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/doc/security_issue_runbook.md b/doc/security_issue_runbook.md index 1706b42c18..8b0bc7970b 100644 --- a/doc/security_issue_runbook.md +++ b/doc/security_issue_runbook.md @@ -25,6 +25,16 @@ For information on what types of issues are considered security vulnerabilities - Request CVE: Use the Big Green Button on the advisory to request a CVE number from GitHub staff. - Advanced Disclosure Email: Decide on a disclosure date, typically within a week, and send an email to sec-announce@bytecodealliance.org about the upcoming security release. Other ways are also available to communicate the disclosure date. +``` markdown +> A template for the advanced disclosure email + +The Wamr project would like to announce a forthcoming security release. + +The release will be made available on approximately YYYY-MM-DD. Additionally, an advisory will be made available on the same date at https://github.com/advisories. + +The highest severity issue fixed in this release is classified as XXX based on the CVSS classification scheme. +``` + ## Step 5: Preparing and Testing Patch Releases - Prepare PRs for Patch Releases: Create pull requests in the private fork for each version being patched. Ensure each PR is ready to apply cleanly and includes release notes for each release branch. @@ -38,6 +48,16 @@ For information on what types of issues are considered security vulnerabilities - Publish GitHub Advisories: Delete the private forks and use the Big Green Button to publish the advisory. - Send Security Release Email: Send a follow-up email to sec-announce@bytecodealliance.org describing the security release. Other communication channels can also be used to inform users about the security release. +```markdown +> A template for the security release email + +[Updated YYYY-MM-DD] Security release available. + +WAMR release version X.Y.Z is now available. The binary release can be found on GitHub at https://github.com/bytecodealliance/wasm-micro-runtime/releases/tag/WAMR-Y.Y.Z. This release addresses the following security issues rated XXX: https://the link of the advisory + +We’ll be conducting a full review of our security practices to ensure ample notification is provided for future security releases. +``` + By following these steps, you can effectively manage and resolve security issues for your open source project, ensuring timely communication and collaboration while maintaining the integrity and security of your software. ## References From d95b0e3d46da8e88f484f236cb4222f5a6dc5926 Mon Sep 17 00:00:00 2001 From: TianlongLiang <111852609+TianlongLiang@users.noreply.github.com> Date: Mon, 11 Aug 2025 09:09:33 +0200 Subject: [PATCH 028/103] add new relocation type (#4500) --- core/iwasm/aot/aot_loader.c | 12 +++++++++--- core/iwasm/aot/arch/aot_reloc_x86_64.c | 18 +++++++++++------- 2 files changed, 20 insertions(+), 10 deletions(-) diff --git a/core/iwasm/aot/aot_loader.c b/core/iwasm/aot/aot_loader.c index 388d9ffdff..5fdd34ed1a 100644 --- a/core/iwasm/aot/aot_loader.c +++ b/core/iwasm/aot/aot_loader.c @@ -3173,7 +3173,9 @@ str2uint64(const char *buf, uint64 *p_res) return true; } -#define R_X86_64_GOTPCREL 9 /* 32 bit signed PC relative offset to GOT */ +#define R_X86_64_GOTPCREL 9 /* 32 bit signed PC relative offset to GOT */ +#define R_X86_64_GOTPCRELX 41 /* relaxable GOTPCREL */ +#define R_X86_64_REX_GOTPCRELX 42 /* relaxable GOTPCREL with REX prefix */ static bool is_text_section(const char *section_name) @@ -3236,7 +3238,9 @@ do_text_relocation(AOTModule *module, AOTRelocationGroup *group, } #if (defined(BUILD_TARGET_X86_64) || defined(BUILD_TARGET_AMD_64)) \ && !defined(BH_PLATFORM_WINDOWS) - if (relocation->relocation_type == R_X86_64_GOTPCREL) { + if (relocation->relocation_type == R_X86_64_GOTPCREL + || relocation->relocation_type == R_X86_64_GOTPCRELX + || relocation->relocation_type == R_X86_64_REX_GOTPCRELX) { GOTItem *got_item = module->got_item_list; uint32 got_item_idx = 0; @@ -3743,7 +3747,9 @@ load_relocation_section(const uint8 *buf, const uint8 *buf_end, bh_memcpy_s(symbol_name_buf, (uint32)sizeof(symbol_name_buf), symbol_name, symbol_name_len); - if (relocation.relocation_type == R_X86_64_GOTPCREL + if ((relocation.relocation_type == R_X86_64_GOTPCREL + || relocation.relocation_type == R_X86_64_GOTPCRELX + || relocation.relocation_type == R_X86_64_REX_GOTPCRELX) && !strncmp(symbol_name_buf, AOT_FUNC_PREFIX, strlen(AOT_FUNC_PREFIX))) { uint32 func_idx = diff --git a/core/iwasm/aot/arch/aot_reloc_x86_64.c b/core/iwasm/aot/arch/aot_reloc_x86_64.c index fe18d79c63..2f36c4c3bc 100644 --- a/core/iwasm/aot/arch/aot_reloc_x86_64.c +++ b/core/iwasm/aot/arch/aot_reloc_x86_64.c @@ -6,13 +6,15 @@ #include "aot_reloc.h" #if !defined(BH_PLATFORM_WINDOWS) -#define R_X86_64_64 1 /* Direct 64 bit */ -#define R_X86_64_PC32 2 /* PC relative 32 bit signed */ -#define R_X86_64_PLT32 4 /* 32 bit PLT address */ -#define R_X86_64_GOTPCREL 9 /* 32 bit signed PC relative offset to GOT */ -#define R_X86_64_32 10 /* Direct 32 bit zero extended */ -#define R_X86_64_32S 11 /* Direct 32 bit sign extended */ -#define R_X86_64_PC64 24 /* PC relative 64 bit */ +#define R_X86_64_64 1 /* Direct 64 bit */ +#define R_X86_64_PC32 2 /* PC relative 32 bit signed */ +#define R_X86_64_PLT32 4 /* 32 bit PLT address */ +#define R_X86_64_GOTPCREL 9 /* 32 bit signed PC relative offset to GOT */ +#define R_X86_64_32 10 /* Direct 32 bit zero extended */ +#define R_X86_64_32S 11 /* Direct 32 bit sign extended */ +#define R_X86_64_PC64 24 /* PC relative 64 bit */ +#define R_X86_64_GOTPCRELX 41 /* relaxable GOTPCREL */ +#define R_X86_64_REX_GOTPCRELX 42 /* relaxable GOTPCREL with REX prefix */ #else #ifndef IMAGE_REL_AMD64_ADDR64 #define IMAGE_REL_AMD64_ADDR64 1 /* The 64-bit VA of the relocation target */ @@ -152,6 +154,8 @@ apply_relocation(AOTModule *module, uint8 *target_section_addr, #if !defined(BH_PLATFORM_WINDOWS) case R_X86_64_PC32: case R_X86_64_GOTPCREL: /* GOT + G has been calculated as symbol_addr */ + case R_X86_64_GOTPCRELX: + case R_X86_64_REX_GOTPCRELX: { intptr_t target_addr = (intptr_t) /* S + A - P */ ((uintptr_t)symbol_addr + reloc_addend From f916eaa197f3c291583e07f62b1e3c0bb5f532b6 Mon Sep 17 00:00:00 2001 From: Zhenwei Jin <109658203+kylo5aby@users.noreply.github.com> Date: Wed, 13 Aug 2025 08:14:12 +0800 Subject: [PATCH 029/103] fix a sanitizer undefined issue (#4553) Signed-off-by: zhenweijin --- build-scripts/config_common.cmake | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build-scripts/config_common.cmake b/build-scripts/config_common.cmake index d89c3a285e..61e2473b16 100644 --- a/build-scripts/config_common.cmake +++ b/build-scripts/config_common.cmake @@ -146,7 +146,7 @@ include (${WAMR_ROOT_DIR}/build-scripts/package.cmake) # Sanitizers if (NOT DEFINED WAMR_BUILD_SANITIZER) - set(WAMR_BUILD_SANITIZER $ENV{WAMR_BUILD_SANITIZER}) + set(WAMR_BUILD_SANITIZER "$ENV{WAMR_BUILD_SANITIZER}") endif() if (NOT WAMR_BUILD_SANITIZER STREQUAL "") From bbf571e5af3672632993b2d055f7cc08635b4cbc Mon Sep 17 00:00:00 2001 From: YAMAMOTO Takashi Date: Wed, 13 Aug 2025 09:14:58 +0900 Subject: [PATCH 030/103] wasi_socket_ext.c: fix a typo in a comment (#4552) --- core/iwasm/libraries/lib-socket/src/wasi/wasi_socket_ext.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/iwasm/libraries/lib-socket/src/wasi/wasi_socket_ext.c b/core/iwasm/libraries/lib-socket/src/wasi/wasi_socket_ext.c index 8f80e0bbbc..2a4b4a7214 100644 --- a/core/iwasm/libraries/lib-socket/src/wasi/wasi_socket_ext.c +++ b/core/iwasm/libraries/lib-socket/src/wasi/wasi_socket_ext.c @@ -18,7 +18,7 @@ * * wasi-libc's errno is a TLS variable, exposed directly via * errno.h. if we use it here, LLVM may lower it differently, - * depending on enabled features like atomcs and bulk-memory. + * depending on enabled features like atomics and bulk-memory. * we tweak the way to access errno here in order to make us * compatible with both of threaded and non-threaded applications. * __errno_location() should be reasonably stable because From c9bfdbe4c4a6b8c8f81b8026430c465183ccfb01 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 13 Aug 2025 08:15:22 +0800 Subject: [PATCH 031/103] build(deps): Bump github/codeql-action from 3.29.5 to 3.29.8 (#4551) Bumps [github/codeql-action](https://github.com/github/codeql-action) from 3.29.5 to 3.29.8. - [Release notes](https://github.com/github/codeql-action/releases) - [Commits](https://github.com/github/codeql-action/compare/v3.29.5...v3.29.8) --- updated-dependencies: - dependency-name: github/codeql-action dependency-version: 3.29.8 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/codeql.yml | 6 +++--- .github/workflows/supply_chain.yml | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml index e984836a0e..0ba7586373 100644 --- a/.github/workflows/codeql.yml +++ b/.github/workflows/codeql.yml @@ -53,7 +53,7 @@ jobs: # Initializes the CodeQL tools for scanning. - name: Initialize CodeQL - uses: github/codeql-action/init@v3.29.5 + uses: github/codeql-action/init@v3.29.8 with: languages: ${{ matrix.language }} @@ -70,7 +70,7 @@ jobs: - run: | ./.github/scripts/codeql_buildscript.sh - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@v3.29.5 + uses: github/codeql-action/analyze@v3.29.8 with: category: "/language:${{matrix.language}}" upload: false @@ -99,7 +99,7 @@ jobs: output: ${{ steps.step1.outputs.sarif-output }}/cpp.sarif - name: Upload CodeQL results to code scanning - uses: github/codeql-action/upload-sarif@v3.29.5 + uses: github/codeql-action/upload-sarif@v3.29.8 with: sarif_file: ${{ steps.step1.outputs.sarif-output }} category: "/language:${{matrix.language}}" diff --git a/.github/workflows/supply_chain.yml b/.github/workflows/supply_chain.yml index e5ea04acd6..643788b631 100644 --- a/.github/workflows/supply_chain.yml +++ b/.github/workflows/supply_chain.yml @@ -60,6 +60,6 @@ jobs: # Upload the results to GitHub's code scanning dashboard. - name: "Upload to code-scanning" - uses: github/codeql-action/upload-sarif@7273f08caa1dcf2c2837f362f1982de0ab4dc344 + uses: github/codeql-action/upload-sarif@4474150eef8c855ab74a7f19f3ae525e469d2de6 with: sarif_file: results.sarif From feecaf602e68124f9916ecdd6218d50ce917f6a4 Mon Sep 17 00:00:00 2001 From: Zhenwei Jin <109658203+kylo5aby@users.noreply.github.com> Date: Wed, 13 Aug 2025 08:17:42 +0800 Subject: [PATCH 032/103] add bounds checking to prevent ref_type_map_count (#4548) Signed-off-by: zhenweijin --- core/iwasm/interpreter/wasm_loader.c | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/core/iwasm/interpreter/wasm_loader.c b/core/iwasm/interpreter/wasm_loader.c index 6139167f62..e89e91e0d2 100644 --- a/core/iwasm/interpreter/wasm_loader.c +++ b/core/iwasm/interpreter/wasm_loader.c @@ -1799,6 +1799,11 @@ resolve_func_type(const uint8 **p_buf, const uint8 *buf_end, WASMModule *module, return false; } if (ref_type_map_count > 0) { + if (ref_type_map_count > UINT16_MAX) { + set_error_buf(error_buf, error_buf_size, + "ref type count too large"); + return false; + } total_size = sizeof(WASMRefTypeMap) * (uint64)ref_type_map_count; if (!(type->ref_type_maps = loader_malloc(total_size, error_buf, error_buf_size))) { @@ -1938,6 +1943,11 @@ resolve_struct_type(const uint8 **p_buf, const uint8 *buf_end, return false; } if (ref_type_map_count > 0) { + if (ref_type_map_count > UINT16_MAX) { + set_error_buf(error_buf, error_buf_size, + "ref type count too large"); + return false; + } total_size = sizeof(WASMRefTypeMap) * (uint64)ref_type_map_count; if (!(type->ref_type_maps = loader_malloc(total_size, error_buf, error_buf_size))) { @@ -3957,6 +3967,11 @@ load_function_section(const uint8 *buf, const uint8 *buf_end, } #if WASM_ENABLE_GC != 0 if (ref_type_map_count > 0) { + if (ref_type_map_count > UINT16_MAX) { + set_error_buf(error_buf, error_buf_size, + "ref type count too large"); + return false; + } total_size = sizeof(WASMRefTypeMap) * (uint64)ref_type_map_count; if (!(func->local_ref_type_maps = loader_malloc( From cbb6d033375a07966ec218863e6c18cb55574e3e Mon Sep 17 00:00:00 2001 From: Liu Jia Date: Wed, 13 Aug 2025 11:05:06 +0800 Subject: [PATCH 033/103] add validtion for parent_type_idx (#4550) --- core/iwasm/aot/aot_loader.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/core/iwasm/aot/aot_loader.c b/core/iwasm/aot/aot_loader.c index 5fdd34ed1a..b36d5aa3ad 100644 --- a/core/iwasm/aot/aot_loader.c +++ b/core/iwasm/aot/aot_loader.c @@ -1811,6 +1811,12 @@ load_types(const uint8 **p_buf, const uint8 *buf_end, AOTModule *module, set_error_buf(error_buf, error_buf_size, "invalid rec_idx"); goto fail; } + if (parent_type_idx >= i) { + set_error_buf( + error_buf, error_buf_size, + "parent type index must be smaller than current type index"); + goto fail; + } #endif if (type_flag == WASM_TYPE_FUNC) { AOTFuncType *func_type; From 14ced7c86ca144101fd5637dada360f79ab53039 Mon Sep 17 00:00:00 2001 From: dongsheng28849455 <68947925+dongsheng28849455@users.noreply.github.com> Date: Fri, 15 Aug 2025 09:48:37 +0800 Subject: [PATCH 034/103] Add onnxruntime as wasi-nn backend (#4485) * Add onnxruntime as wasi-nn backend * remove global context * put checks under the lock * tensor type will not support legacy wasi-nn abi * Manually set the imported target with name space --- build-scripts/config_common.cmake | 7 +- core/iwasm/libraries/wasi-nn/README.md | 3 +- .../wasi-nn/cmake/Findonnxruntime.cmake | 86 ++ .../libraries/wasi-nn/cmake/wasi_nn.cmake | 21 + core/iwasm/libraries/wasi-nn/src/wasi_nn.c | 14 + .../libraries/wasi-nn/src/wasi_nn_onnx.cpp | 795 ++++++++++++++++++ 6 files changed, 924 insertions(+), 2 deletions(-) create mode 100644 core/iwasm/libraries/wasi-nn/cmake/Findonnxruntime.cmake create mode 100644 core/iwasm/libraries/wasi-nn/src/wasi_nn_onnx.cpp diff --git a/build-scripts/config_common.cmake b/build-scripts/config_common.cmake index 61e2473b16..a6d27afaee 100644 --- a/build-scripts/config_common.cmake +++ b/build-scripts/config_common.cmake @@ -546,7 +546,8 @@ if (WAMR_BUILD_WASI_NN EQUAL 1) # Variant backends if (NOT WAMR_BUILD_WASI_NN_TFLITE EQUAL 1 AND NOT WAMR_BUILD_WASI_NN_OPENVINO EQUAL 1 AND - NOT WAMR_BUILD_WASI_NN_LLAMACPP EQUAL 1) + NOT WAMR_BUILD_WASI_NN_LLAMACPP EQUAL 1 AND + NOT WAMR_BUILD_WASI_NN_ONNX EQUAL 1) message (FATAL_ERROR " Need to select a backend for WASI-NN") endif () @@ -562,6 +563,10 @@ if (WAMR_BUILD_WASI_NN EQUAL 1) message (" WASI-NN: backend llamacpp enabled") add_definitions (-DWASM_ENABLE_WASI_NN_LLAMACPP) endif () + if (WAMR_BUILD_WASI_NN_ONNX EQUAL 1) + message (" WASI-NN: backend onnx enabled") + add_definitions (-DWASM_ENABLE_WASI_NN_ONNX) + endif () # Variant devices if (WAMR_BUILD_WASI_NN_ENABLE_GPU EQUAL 1) message (" WASI-NN: GPU enabled") diff --git a/core/iwasm/libraries/wasi-nn/README.md b/core/iwasm/libraries/wasi-nn/README.md index 2e926a0327..e16891a1ba 100644 --- a/core/iwasm/libraries/wasi-nn/README.md +++ b/core/iwasm/libraries/wasi-nn/README.md @@ -26,6 +26,7 @@ $ cmake -DWAMR_BUILD_WASI_NN=1 ... - `WAMR_BUILD_WASI_NN_TFLITE`. This option designates TensorFlow Lite as the backend. - `WAMR_BUILD_WASI_NN_OPENVINO`. This option designates OpenVINO as the backend. - `WAMR_BUILD_WASI_NN_LLAMACPP`. This option designates Llama.cpp as the backend. +- `WAMR_BUILD_WASI_NN_ONNX`. This option designates ONNX Runtime as the backend. ### Wasm @@ -151,7 +152,7 @@ docker run \ Supported: -- Graph encoding: `tensorflowlite`, `openvino` and `ggml` +- Graph encoding: `tensorflowlite`, `openvino`, `ggml` and `onnx` - Execution target: `cpu` for all. `gpu` and `tpu` for `tensorflowlite`. - Tensor type: `fp32`. diff --git a/core/iwasm/libraries/wasi-nn/cmake/Findonnxruntime.cmake b/core/iwasm/libraries/wasi-nn/cmake/Findonnxruntime.cmake new file mode 100644 index 0000000000..db8f287e36 --- /dev/null +++ b/core/iwasm/libraries/wasi-nn/cmake/Findonnxruntime.cmake @@ -0,0 +1,86 @@ +# Copyright 2025 Sony Semiconductor Solutions Corporation. +# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception + +# Find ONNX Runtime library +# +# This module defines the following variables: +# +# :: +# +# onnxruntime_FOUND - True if onnxruntime is found +# onnxruntime_INCLUDE_DIRS - Include directories for onnxruntime +# onnxruntime_LIBRARIES - List of libraries for onnxruntime +# onnxruntime_VERSION - Version of onnxruntime +# +# :: +# +# Example usage: +# +# find_package(onnxruntime) +# if(onnxruntime_FOUND) +# target_link_libraries(app onnxruntime) +# endif() + +# First try to find ONNX Runtime using the CMake config file +# FIXME: This is a temporary workaround for ONNX Runtime's broken CMake config on Linux. +# See https://github.com/microsoft/onnxruntime/issues/25279 +# Once the upstream issue is fixed, this conditional can be safely removed. +if(NOT CMAKE_SYSTEM_NAME STREQUAL "Linux") + find_package(onnxruntime CONFIG QUIET) + if(onnxruntime_FOUND) + return() + endif() +endif() + +# If not found via CMake config, try to find manually +find_path(onnxruntime_INCLUDE_DIR + NAMES onnxruntime_c_api.h + PATHS + /usr/include + /usr/local/include + /opt/onnxruntime/include + $ENV{ONNXRUNTIME_ROOT}/include + ${CMAKE_CURRENT_LIST_DIR}/../../../../.. +) + +find_library(onnxruntime_LIBRARY + NAMES onnxruntime + PATHS + /usr/lib + /usr/local/lib + /opt/onnxruntime/lib + $ENV{ONNXRUNTIME_ROOT}/lib + ${CMAKE_CURRENT_LIST_DIR}/../../../../.. +) + +# Try to determine version from header file +if(onnxruntime_INCLUDE_DIR) + file(STRINGS "${onnxruntime_INCLUDE_DIR}/onnxruntime_c_api.h" onnxruntime_version_str + REGEX "^#define[\t ]+ORT_API_VERSION[\t ]+[0-9]+") + + if(onnxruntime_version_str) + string(REGEX REPLACE "^#define[\t ]+ORT_API_VERSION[\t ]+([0-9]+)" "\\1" + onnxruntime_VERSION "${onnxruntime_version_str}") + endif() +endif() + +include(FindPackageHandleStandardArgs) +find_package_handle_standard_args(onnxruntime + REQUIRED_VARS onnxruntime_LIBRARY onnxruntime_INCLUDE_DIR + VERSION_VAR onnxruntime_VERSION +) + +if(onnxruntime_FOUND) + set(onnxruntime_LIBRARIES ${onnxruntime_LIBRARY}) + set(onnxruntime_INCLUDE_DIRS ${onnxruntime_INCLUDE_DIR}) + + if(NOT TARGET onnxruntime::onnxruntime) + add_library(onnxruntime::onnxruntime UNKNOWN IMPORTED) + set_target_properties(onnxruntime::onnxruntime PROPERTIES + IMPORTED_LOCATION "${onnxruntime_LIBRARY}" + INTERFACE_INCLUDE_DIRECTORIES "${onnxruntime_INCLUDE_DIRS}" + ) + endif() +endif() + +mark_as_advanced(onnxruntime_INCLUDE_DIR onnxruntime_LIBRARY) diff --git a/core/iwasm/libraries/wasi-nn/cmake/wasi_nn.cmake b/core/iwasm/libraries/wasi-nn/cmake/wasi_nn.cmake index b771b1c402..56a7b44e4a 100644 --- a/core/iwasm/libraries/wasi-nn/cmake/wasi_nn.cmake +++ b/core/iwasm/libraries/wasi-nn/cmake/wasi_nn.cmake @@ -109,3 +109,24 @@ if(WAMR_BUILD_WASI_NN_LLAMACPP EQUAL 1) install(TARGETS wasi_nn_llamacpp DESTINATION lib) endif() + +# - onnx +if(WAMR_BUILD_WASI_NN_ONNX EQUAL 1) + find_package(onnxruntime REQUIRED) + enable_language(CXX) + + add_library( + wasi_nn_onnx + SHARED + ${WASI_NN_ROOT}/src/wasi_nn_onnx.cpp + ) + + target_link_libraries( + wasi_nn_onnx + PUBLIC + vmlib + onnxruntime::onnxruntime + ) + + install(TARGETS wasi_nn_onnx DESTINATION lib) +endif() diff --git a/core/iwasm/libraries/wasi-nn/src/wasi_nn.c b/core/iwasm/libraries/wasi-nn/src/wasi_nn.c index 7921ec9539..787c3a432d 100644 --- a/core/iwasm/libraries/wasi-nn/src/wasi_nn.c +++ b/core/iwasm/libraries/wasi-nn/src/wasi_nn.c @@ -33,6 +33,7 @@ #define TFLITE_BACKEND_LIB "libwasi_nn_tflite" LIB_EXTENTION #define OPENVINO_BACKEND_LIB "libwasi_nn_openvino" LIB_EXTENTION #define LLAMACPP_BACKEND_LIB "libwasi_nn_llamacpp" LIB_EXTENTION +#define ONNX_BACKEND_LIB "libwasi_nn_onnx" LIB_EXTENTION /* Global variables */ static korp_mutex wasi_nn_lock; @@ -240,6 +241,17 @@ choose_a_backend() return openvino; } +#ifndef NDEBUG + NN_WARN_PRINTF("%s", dlerror()); +#endif + + handle = dlopen(ONNX_BACKEND_LIB, RTLD_LAZY); + if (handle) { + NN_INFO_PRINTF("Using onnx backend"); + dlclose(handle); + return onnx; + } + #ifndef NDEBUG NN_WARN_PRINTF("%s", dlerror()); #endif @@ -363,6 +375,8 @@ graph_encoding_to_backend_lib_name(graph_encoding encoding) return TFLITE_BACKEND_LIB; case ggml: return LLAMACPP_BACKEND_LIB; + case onnx: + return ONNX_BACKEND_LIB; default: return NULL; } diff --git a/core/iwasm/libraries/wasi-nn/src/wasi_nn_onnx.cpp b/core/iwasm/libraries/wasi-nn/src/wasi_nn_onnx.cpp new file mode 100644 index 0000000000..44d8d66135 --- /dev/null +++ b/core/iwasm/libraries/wasi-nn/src/wasi_nn_onnx.cpp @@ -0,0 +1,795 @@ +/* + * Copyright 2025 Sony Semiconductor Solutions Corporation. + * SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception + */ + +#include +#include +#include +#include +#include +#include +#include "bh_platform.h" +#include "wasi_nn_backend.h" +#include "utils/logger.h" +#include "onnxruntime_c_api.h" + +#if WASM_ENABLE_WASI_EPHEMERAL_NN == 0 +#error This backend doesn't support legacy "wasi_nn" abi. Please enable WASM_ENABLE_WASI_EPHEMERAL_NN. +#endif + +/* Maximum number of graphs and execution contexts */ +#define MAX_GRAPHS 4 +#define MAX_CONTEXTS 4 + +/* Graph structure */ +typedef struct { + OrtSession *session; + bool is_initialized; +} OnnxRuntimeGraph; + +/* Execution context structure */ +typedef struct { + OrtMemoryInfo *memory_info; + std::vector input_names; + std::vector output_names; + std::unordered_map inputs; + std::unordered_map outputs; + OnnxRuntimeGraph *graph; + bool is_initialized; +} OnnxRuntimeExecCtx; + +/* ONNX Runtime context structure */ +typedef struct { + OrtEnv *env; + OrtSessionOptions *session_options; + OrtAllocator *allocator; + const OrtApi *ort_api; + std::mutex mutex; + bool is_initialized; + OnnxRuntimeGraph graphs[MAX_GRAPHS]; + OnnxRuntimeExecCtx exec_ctxs[MAX_CONTEXTS]; +} OnnxRuntimeContext; + +static wasi_nn_error +convert_ort_error_to_wasi_nn_error(const OnnxRuntimeContext *ctx, + OrtStatus *status) +{ + if (status == nullptr) { + return success; + } + + wasi_nn_error err; + OrtErrorCode code = ctx->ort_api->GetErrorCode(status); + const char *msg = ctx->ort_api->GetErrorMessage(status); + + NN_ERR_PRINTF("ONNX Runtime error: %s", msg); + + switch (code) { + case ORT_INVALID_ARGUMENT: + err = invalid_argument; + break; + case ORT_RUNTIME_EXCEPTION: + err = runtime_error; + break; + case ORT_NOT_IMPLEMENTED: + err = unsupported_operation; + break; + case ORT_INVALID_PROTOBUF: + err = invalid_encoding; + break; + case ORT_MODEL_LOADED: + err = too_large; + break; + case ORT_INVALID_GRAPH: + err = invalid_encoding; + break; + default: + err = runtime_error; + break; + } + + ctx->ort_api->ReleaseStatus(status); + return err; +} + +static bool +convert_wasi_nn_type_to_ort_type(tensor_type type, + ONNXTensorElementDataType *ort_type) +{ + switch (type) { + case fp32: + *ort_type = ONNX_TENSOR_ELEMENT_DATA_TYPE_FLOAT; + break; + case fp16: + *ort_type = ONNX_TENSOR_ELEMENT_DATA_TYPE_FLOAT16; + break; + case fp64: + *ort_type = ONNX_TENSOR_ELEMENT_DATA_TYPE_DOUBLE; + break; + case u8: + *ort_type = ONNX_TENSOR_ELEMENT_DATA_TYPE_UINT8; + break; + case i32: + *ort_type = ONNX_TENSOR_ELEMENT_DATA_TYPE_INT32; + break; + case i64: + *ort_type = ONNX_TENSOR_ELEMENT_DATA_TYPE_INT64; + break; + default: + NN_WARN_PRINTF("Unsupported wasi-nn tensor type: %d", type); + return false; + } + return true; +} + +/* Backend API implementation */ + +extern "C" { + +__attribute__((visibility("default"))) wasi_nn_error +init_backend(void **onnx_ctx) +{ + wasi_nn_error err = success; + OrtStatus *status = nullptr; + OnnxRuntimeContext *ctx = nullptr; + ctx = new OnnxRuntimeContext(); + ctx->ort_api = OrtGetApiBase()->GetApi(ORT_API_VERSION); + if (!ctx->ort_api) { + NN_ERR_PRINTF("Failed to get ONNX Runtime API"); + err = runtime_error; + goto fail; + } + + NN_INFO_PRINTF("Creating ONNX Runtime environment..."); + status = ctx->ort_api->CreateEnv(ORT_LOGGING_LEVEL_VERBOSE, "wasi-nn", + &ctx->env); + if (status != nullptr) { + const char *error_message = ctx->ort_api->GetErrorMessage(status); + err = convert_ort_error_to_wasi_nn_error(ctx, status); + NN_ERR_PRINTF("Failed to create ONNX Runtime environment: %s", + error_message); + goto fail; + } + NN_INFO_PRINTF("ONNX Runtime environment created successfully"); + + status = ctx->ort_api->CreateSessionOptions(&ctx->session_options); + if (status != nullptr) { + err = convert_ort_error_to_wasi_nn_error(ctx, status); + ctx->ort_api->ReleaseEnv(ctx->env); + NN_ERR_PRINTF("Failed to create ONNX Runtime session options"); + goto fail; + } + + status = ctx->ort_api->SetSessionGraphOptimizationLevel( + ctx->session_options, ORT_ENABLE_BASIC); + if (status != nullptr) { + err = convert_ort_error_to_wasi_nn_error(ctx, status); + ctx->ort_api->ReleaseSessionOptions(ctx->session_options); + ctx->ort_api->ReleaseEnv(ctx->env); + NN_ERR_PRINTF("Failed to set graph optimization level"); + goto fail; + } + + status = ctx->ort_api->GetAllocatorWithDefaultOptions(&ctx->allocator); + if (status != nullptr) { + err = convert_ort_error_to_wasi_nn_error(ctx, status); + ctx->ort_api->ReleaseSessionOptions(ctx->session_options); + ctx->ort_api->ReleaseEnv(ctx->env); + NN_ERR_PRINTF("Failed to get default allocator"); + goto fail; + } + + for (int i = 0; i < MAX_GRAPHS; i++) { + ctx->graphs[i].is_initialized = false; + ctx->graphs[i].session = nullptr; + } + + for (int i = 0; i < MAX_CONTEXTS; i++) { + ctx->exec_ctxs[i].is_initialized = false; + ctx->exec_ctxs[i].memory_info = nullptr; + ctx->exec_ctxs[i].graph = nullptr; + ctx->exec_ctxs[i].input_names.clear(); + ctx->exec_ctxs[i].output_names.clear(); + ctx->exec_ctxs[i].inputs.clear(); + ctx->exec_ctxs[i].outputs.clear(); + } + + ctx->is_initialized = true; + *onnx_ctx = ctx; + + NN_INFO_PRINTF("ONNX Runtime backend initialized"); + return success; + +fail: + delete (ctx); + return err; +} + +__attribute__((visibility("default"))) wasi_nn_error +deinit_backend(void *onnx_ctx) +{ + OnnxRuntimeContext *ctx = (OnnxRuntimeContext *)onnx_ctx; + std::lock_guard lock(ctx->mutex); + + if (!ctx->is_initialized) { + return success; + } + + for (int i = 0; i < MAX_GRAPHS; i++) { + if (ctx->graphs[i].is_initialized) { + ctx->ort_api->ReleaseSession(ctx->graphs[i].session); + ctx->graphs[i].is_initialized = false; + } + } + + for (int i = 0; i < MAX_CONTEXTS; i++) { + if (ctx->exec_ctxs[i].is_initialized) { + for (auto &input : ctx->exec_ctxs[i].inputs) { + ctx->ort_api->ReleaseValue(input.second); + } + for (auto &output : ctx->exec_ctxs[i].outputs) { + ctx->ort_api->ReleaseValue(output.second); + } + + for (auto name : ctx->exec_ctxs[i].input_names) { + free((void *)name); + } + ctx->exec_ctxs[i].input_names.clear(); + + for (auto name : ctx->exec_ctxs[i].output_names) { + free((void *)name); + } + ctx->exec_ctxs[i].output_names.clear(); + + ctx->ort_api->ReleaseMemoryInfo(ctx->exec_ctxs[i].memory_info); + ctx->exec_ctxs[i].is_initialized = false; + } + } + + ctx->ort_api->ReleaseSessionOptions(ctx->session_options); + ctx->ort_api->ReleaseEnv(ctx->env); + ctx->is_initialized = false; + + delete (ctx); + + NN_INFO_PRINTF("ONNX Runtime backend deinitialized"); + return success; +} + +__attribute__((visibility("default"))) wasi_nn_error +load(void *onnx_ctx, graph_builder_array *builder, graph_encoding encoding, + execution_target target, graph *g) +{ + if (!onnx_ctx) { + return runtime_error; + } + + if (encoding != onnx) { + NN_ERR_PRINTF("Unsupported encoding: %d", encoding); + return invalid_encoding; + } + + if (target != cpu) { + NN_ERR_PRINTF("Only CPU target is supported"); + return unsupported_operation; + } + + OnnxRuntimeContext *ctx = (OnnxRuntimeContext *)onnx_ctx; + std::lock_guard lock(ctx->mutex); + + int graph_index = -1; + for (int i = 0; i < MAX_GRAPHS; i++) { + if (!ctx->graphs[i].is_initialized) { + graph_index = i; + break; + } + } + + if (graph_index == -1) { + NN_ERR_PRINTF("Maximum number of graphs reached"); + return runtime_error; + } + + if (builder->size == 0 || builder->buf == NULL) { + NN_ERR_PRINTF("No model data provided"); + return invalid_argument; + } + + NN_INFO_PRINTF("[ONNX Runtime] Loading model of size %zu bytes...", + builder->buf[0].size); + + if (builder->buf[0].size > 16) { + NN_INFO_PRINTF( + "Model header bytes: %02x %02x %02x %02x %02x %02x %02x %02x", + ((uint8_t *)builder->buf[0].buf)[0], + ((uint8_t *)builder->buf[0].buf)[1], + ((uint8_t *)builder->buf[0].buf)[2], + ((uint8_t *)builder->buf[0].buf)[3], + ((uint8_t *)builder->buf[0].buf)[4], + ((uint8_t *)builder->buf[0].buf)[5], + ((uint8_t *)builder->buf[0].buf)[6], + ((uint8_t *)builder->buf[0].buf)[7]); + } + + OrtStatus *status = ctx->ort_api->CreateSessionFromArray( + ctx->env, builder->buf[0].buf, builder->buf[0].size, + ctx->session_options, &ctx->graphs[graph_index].session); + + if (status != nullptr) { + const char *error_message = ctx->ort_api->GetErrorMessage(status); + wasi_nn_error err = convert_ort_error_to_wasi_nn_error(ctx, status); + NN_ERR_PRINTF("Failed to create ONNX Runtime session: %s", + error_message); + return err; + } + + NN_INFO_PRINTF("ONNX Runtime session created successfully"); + + ctx->graphs[graph_index].is_initialized = true; + *g = graph_index; + + NN_INFO_PRINTF("ONNX model loaded as graph %d", graph_index); + return success; +} + +__attribute__((visibility("default"))) wasi_nn_error +load_by_name(void *onnx_ctx, const char *name, uint32_t filename_len, graph *g) +{ + if (!onnx_ctx) { + return runtime_error; + } + + OnnxRuntimeContext *ctx = (OnnxRuntimeContext *)onnx_ctx; + std::lock_guard lock(ctx->mutex); + + int graph_index = -1; + for (int i = 0; i < MAX_GRAPHS; i++) { + if (!ctx->graphs[i].is_initialized) { + graph_index = i; + break; + } + } + + if (graph_index == -1) { + NN_ERR_PRINTF("Maximum number of graphs reached"); + return runtime_error; + } + + OrtStatus *status = + ctx->ort_api->CreateSession(ctx->env, name, ctx->session_options, + &ctx->graphs[graph_index].session); + + if (status != nullptr) { + wasi_nn_error err = convert_ort_error_to_wasi_nn_error(ctx, status); + NN_ERR_PRINTF("Failed to create ONNX Runtime session from file: %s", + name); + return err; + } + + ctx->graphs[graph_index].is_initialized = true; + *g = graph_index; + + NN_INFO_PRINTF("ONNX model loaded from file %s as graph %d", name, + graph_index); + return success; +} + +__attribute__((visibility("default"))) wasi_nn_error +init_execution_context(void *onnx_ctx, graph g, graph_execution_context *ctx) +{ + OnnxRuntimeContext *ort_ctx = (OnnxRuntimeContext *)onnx_ctx; + if (!onnx_ctx) { + return runtime_error; + } + + std::lock_guard lock(ort_ctx->mutex); + + if (g >= MAX_GRAPHS || !ort_ctx->graphs[g].is_initialized) { + NN_ERR_PRINTF("Invalid graph handle: %d", g); + return invalid_argument; + } + + int ctx_index = -1; + for (int i = 0; i < MAX_CONTEXTS; i++) { + if (!ort_ctx->exec_ctxs[i].is_initialized) { + ctx_index = i; + break; + } + } + + if (ctx_index == -1) { + NN_ERR_PRINTF("Maximum number of execution contexts reached"); + return runtime_error; + } + + OnnxRuntimeExecCtx *exec_ctx = &ort_ctx->exec_ctxs[ctx_index]; + exec_ctx->graph = &ort_ctx->graphs[g]; + + OrtStatus *status = ort_ctx->ort_api->CreateCpuMemoryInfo( + OrtArenaAllocator, OrtMemTypeDefault, &exec_ctx->memory_info); + if (status != nullptr) { + wasi_nn_error err = convert_ort_error_to_wasi_nn_error(ort_ctx, status); + NN_ERR_PRINTF("Failed to create CPU memory info"); + return err; + } + + size_t num_input_nodes; + status = ort_ctx->ort_api->SessionGetInputCount(exec_ctx->graph->session, + &num_input_nodes); + if (status != nullptr) { + wasi_nn_error err = convert_ort_error_to_wasi_nn_error(ort_ctx, status); + ort_ctx->ort_api->ReleaseMemoryInfo(exec_ctx->memory_info); + NN_ERR_PRINTF("Failed to get input count"); + return err; + } + + for (size_t i = 0; i < num_input_nodes; i++) { + char *input_name; + status = ort_ctx->ort_api->SessionGetInputName( + exec_ctx->graph->session, i, ort_ctx->allocator, &input_name); + if (status != nullptr) { + wasi_nn_error err = + convert_ort_error_to_wasi_nn_error(ort_ctx, status); + ort_ctx->ort_api->ReleaseMemoryInfo(exec_ctx->memory_info); + NN_ERR_PRINTF("Failed to get input name"); + return err; + } + exec_ctx->input_names.push_back(input_name); + } + + size_t num_output_nodes; + status = ort_ctx->ort_api->SessionGetOutputCount(exec_ctx->graph->session, + &num_output_nodes); + if (status != nullptr) { + wasi_nn_error err = convert_ort_error_to_wasi_nn_error(ort_ctx, status); + ort_ctx->ort_api->ReleaseMemoryInfo(exec_ctx->memory_info); + for (const char *name : exec_ctx->input_names) { + ort_ctx->allocator->Free(ort_ctx->allocator, (void *)name); + } + NN_ERR_PRINTF("Failed to get output count"); + return err; + } + + for (size_t i = 0; i < num_output_nodes; i++) { + char *output_name; + status = ort_ctx->ort_api->SessionGetOutputName( + exec_ctx->graph->session, i, ort_ctx->allocator, &output_name); + if (status != nullptr) { + wasi_nn_error err = + convert_ort_error_to_wasi_nn_error(ort_ctx, status); + ort_ctx->ort_api->ReleaseMemoryInfo(exec_ctx->memory_info); + for (const char *name : exec_ctx->input_names) { + ort_ctx->allocator->Free(ort_ctx->allocator, (void *)name); + } + NN_ERR_PRINTF("Failed to get output name"); + return err; + } + exec_ctx->output_names.push_back(output_name); + } + + exec_ctx->is_initialized = true; + *ctx = ctx_index; + + NN_INFO_PRINTF("Execution context %d initialized for graph %d", ctx_index, + g); + return success; +} + +__attribute__((visibility("default"))) wasi_nn_error +set_input(void *onnx_ctx, graph_execution_context ctx, uint32_t index, + tensor *input_tensor) +{ + OnnxRuntimeContext *ort_ctx = (OnnxRuntimeContext *)onnx_ctx; + if (!onnx_ctx) { + return runtime_error; + } + + std::lock_guard lock(ort_ctx->mutex); + + if (ctx >= MAX_CONTEXTS || !ort_ctx->exec_ctxs[ctx].is_initialized) { + NN_ERR_PRINTF("Invalid execution context handle: %d", ctx); + return invalid_argument; + } + + if (index >= ort_ctx->exec_ctxs[ctx].input_names.size()) { + NN_ERR_PRINTF("Invalid input index: %d (max: %zu)", index, + ort_ctx->exec_ctxs[ctx].input_names.size() - 1); + return invalid_argument; + } + + OnnxRuntimeExecCtx *exec_ctx = &ort_ctx->exec_ctxs[ctx]; + + OrtTypeInfo *type_info = nullptr; + OrtStatus *status = ort_ctx->ort_api->SessionGetInputTypeInfo( + exec_ctx->graph->session, index, &type_info); + if (status != nullptr) { + ort_ctx->ort_api->ReleaseTypeInfo(type_info); + return runtime_error; + } + + const OrtTensorTypeAndShapeInfo *tensor_info; + status = + ort_ctx->ort_api->CastTypeInfoToTensorInfo(type_info, &tensor_info); + if (status != nullptr) { + ort_ctx->ort_api->ReleaseTypeInfo(type_info); + return runtime_error; + } + + size_t num_model_dims; + status = ort_ctx->ort_api->GetDimensionsCount(tensor_info, &num_model_dims); + std::vector model_dims(num_model_dims); + status = ort_ctx->ort_api->GetDimensions(tensor_info, model_dims.data(), + num_model_dims); + + void *input_tensor_data = input_tensor->data.buf; + void *input_tensor_scaled_data = NULL; + ort_ctx->ort_api->ReleaseTypeInfo(type_info); + size_t num_dims = input_tensor->dimensions->size; + int64_t *ort_dims = (int64_t *)malloc(num_dims * sizeof(int64_t)); + if (!ort_dims) { + NN_ERR_PRINTF("Failed to allocate memory for tensor dimensions"); + return runtime_error; + } + + for (size_t i = 0; i < num_dims; i++) { + ort_dims[i] = input_tensor->dimensions->buf[i]; + } + + ONNXTensorElementDataType ort_type; + if (!convert_wasi_nn_type_to_ort_type( + static_cast(input_tensor->type), &ort_type)) { + NN_ERR_PRINTF("Failed to convert tensor type"); + return runtime_error; + } + + OrtValue *input_value = nullptr; + size_t total_elements = 1; + for (size_t i = 0; i < num_dims; i++) { + total_elements *= input_tensor->dimensions->buf[i]; + } + + status = ort_ctx->ort_api->CreateTensorWithDataAsOrtValue( + exec_ctx->memory_info, input_tensor->data.buf, input_tensor->data.size, + ort_dims, num_dims, ort_type, &input_value); + + free(ort_dims); + + if (status != nullptr) { + wasi_nn_error err = convert_ort_error_to_wasi_nn_error(ort_ctx, status); + NN_ERR_PRINTF("Failed to create input tensor"); + return err; + } + + if (exec_ctx->inputs.count(index) > 0) { + ort_ctx->ort_api->ReleaseValue(exec_ctx->inputs[index]); + } + exec_ctx->inputs[index] = input_value; + + NN_INFO_PRINTF("Input tensor set for context %d, index %d", ctx, index); + return success; +} + +__attribute__((visibility("default"))) wasi_nn_error +compute(void *onnx_ctx, graph_execution_context ctx) +{ + OnnxRuntimeContext *ort_ctx = (OnnxRuntimeContext *)onnx_ctx; + if (!onnx_ctx) { + return runtime_error; + } + + std::lock_guard lock(ort_ctx->mutex); + + if (ctx >= MAX_CONTEXTS || !ort_ctx->exec_ctxs[ctx].is_initialized) { + NN_ERR_PRINTF("Invalid execution context handle: %d", ctx); + return invalid_argument; + } + + OnnxRuntimeExecCtx *exec_ctx = &ort_ctx->exec_ctxs[ctx]; + + std::vector input_values; + std::vector input_names; + + for (size_t i = 0; i < exec_ctx->input_names.size(); i++) { + if (exec_ctx->inputs.count(i) == 0) { + NN_ERR_PRINTF("Input tensor not set for index %zu", i); + return invalid_argument; + } + input_values.push_back(exec_ctx->inputs[i]); + input_names.push_back(exec_ctx->input_names[i]); + } + + for (auto &output : exec_ctx->outputs) { + ort_ctx->ort_api->ReleaseValue(output.second); + } + exec_ctx->outputs.clear(); + + std::vector output_values(exec_ctx->output_names.size()); + + OrtStatus *status = ort_ctx->ort_api->Run( + exec_ctx->graph->session, nullptr, input_names.data(), + input_values.data(), input_values.size(), exec_ctx->output_names.data(), + exec_ctx->output_names.size(), output_values.data()); + + for (size_t i = 0; i < output_values.size(); i++) { + exec_ctx->outputs[i] = output_values[i]; + } + + if (status != nullptr) { + wasi_nn_error err = convert_ort_error_to_wasi_nn_error(ort_ctx, status); + NN_ERR_PRINTF("Failed to run inference"); + return err; + } + + NN_INFO_PRINTF("Inference computed for context %d", ctx); + return success; +} + +__attribute__((visibility("default"))) wasi_nn_error +get_output(void *onnx_ctx, graph_execution_context ctx, uint32_t index, + tensor_data *out_buffer, uint32_t *out_buffer_size) +{ + OnnxRuntimeContext *ort_ctx = (OnnxRuntimeContext *)onnx_ctx; + if (!onnx_ctx) { + return runtime_error; + } + + std::lock_guard lock(ort_ctx->mutex); + + if (ctx >= MAX_CONTEXTS || !ort_ctx->exec_ctxs[ctx].is_initialized) { + NN_ERR_PRINTF("Invalid execution context handle: %d", ctx); + return invalid_argument; + } + + if (index >= ort_ctx->exec_ctxs[ctx].output_names.size()) { + NN_ERR_PRINTF("Invalid output index: %d (max: %zu)", index, + ort_ctx->exec_ctxs[ctx].output_names.size() - 1); + return invalid_argument; + } + + OnnxRuntimeExecCtx *exec_ctx = &ort_ctx->exec_ctxs[ctx]; + + OrtValue *output_value = exec_ctx->outputs[index]; + if (!output_value) { + NN_ERR_PRINTF("Output tensor not available for index %d", index); + return runtime_error; + } + + OrtTensorTypeAndShapeInfo *tensor_info; + OrtStatus *status = + ort_ctx->ort_api->GetTensorTypeAndShape(output_value, &tensor_info); + if (status != nullptr) { + wasi_nn_error err = convert_ort_error_to_wasi_nn_error(ort_ctx, status); + NN_ERR_PRINTF("Failed to get tensor type and shape"); + return err; + } + + ONNXTensorElementDataType element_type; + status = ort_ctx->ort_api->GetTensorElementType(tensor_info, &element_type); + if (status != nullptr) { + wasi_nn_error err = convert_ort_error_to_wasi_nn_error(ort_ctx, status); + ort_ctx->ort_api->ReleaseTensorTypeAndShapeInfo(tensor_info); + NN_ERR_PRINTF("Failed to get tensor element type"); + return err; + } + + size_t num_dims; + status = ort_ctx->ort_api->GetDimensionsCount(tensor_info, &num_dims); + if (status != nullptr) { + wasi_nn_error err = convert_ort_error_to_wasi_nn_error(ort_ctx, status); + ort_ctx->ort_api->ReleaseTensorTypeAndShapeInfo(tensor_info); + NN_ERR_PRINTF("Failed to get tensor dimensions count"); + return err; + } + + int64_t *dims = (int64_t *)malloc(num_dims * sizeof(int64_t)); + if (!dims) { + ort_ctx->ort_api->ReleaseTensorTypeAndShapeInfo(tensor_info); + NN_ERR_PRINTF("Failed to allocate memory for tensor dimensions"); + return runtime_error; + } + + status = ort_ctx->ort_api->GetDimensions(tensor_info, dims, num_dims); + if (status != nullptr) { + wasi_nn_error err = convert_ort_error_to_wasi_nn_error(ort_ctx, status); + free(dims); + ort_ctx->ort_api->ReleaseTensorTypeAndShapeInfo(tensor_info); + NN_ERR_PRINTF("Failed to get tensor dimensions"); + return err; + } + + size_t tensor_size; + status = + ort_ctx->ort_api->GetTensorShapeElementCount(tensor_info, &tensor_size); + if (status != nullptr) { + wasi_nn_error err = convert_ort_error_to_wasi_nn_error(ort_ctx, status); + free(dims); + ort_ctx->ort_api->ReleaseTensorTypeAndShapeInfo(tensor_info); + NN_ERR_PRINTF("Failed to get tensor element count"); + return err; + } + + NN_INFO_PRINTF("Output tensor dimensions: "); + for (size_t i = 0; i < num_dims; i++) { + NN_INFO_PRINTF(" dim[%zu] = %lld", i, dims[i]); + } + NN_INFO_PRINTF("Total elements: %zu", tensor_size); + + ort_ctx->ort_api->ReleaseTensorTypeAndShapeInfo(tensor_info); + free(dims); + + if (tensor_size == 0) { + NN_ERR_PRINTF("Tensor is empty (zero elements)"); + return runtime_error; + } + + void *tensor_data = nullptr; + status = ort_ctx->ort_api->GetTensorMutableData(output_value, &tensor_data); + if (status != nullptr) { + wasi_nn_error err = convert_ort_error_to_wasi_nn_error(ort_ctx, status); + NN_ERR_PRINTF("Failed to get tensor data"); + return err; + } + + if (tensor_data == nullptr) { + NN_ERR_PRINTF("Tensor data pointer is null"); + return runtime_error; + } + + size_t element_size; + switch (element_type) { + case ONNX_TENSOR_ELEMENT_DATA_TYPE_FLOAT: + element_size = sizeof(float); + break; + case ONNX_TENSOR_ELEMENT_DATA_TYPE_FLOAT16: + element_size = sizeof(uint16_t); + break; + case ONNX_TENSOR_ELEMENT_DATA_TYPE_DOUBLE: + element_size = sizeof(double); + break; + case ONNX_TENSOR_ELEMENT_DATA_TYPE_INT32: + element_size = sizeof(int32_t); + break; + case ONNX_TENSOR_ELEMENT_DATA_TYPE_INT64: + element_size = sizeof(int64_t); + break; + case ONNX_TENSOR_ELEMENT_DATA_TYPE_UINT8: + element_size = sizeof(uint8_t); + break; + default: + NN_ERR_PRINTF("Unsupported tensor element type: %d", element_type); + return unsupported_operation; + } + + size_t output_size_bytes = tensor_size * element_size; + if (out_buffer->size < output_size_bytes) { + NN_ERR_PRINTF( + "Output buffer too small: %u bytes provided, %zu bytes needed", + out_buffer->size, output_size_bytes); + *out_buffer_size = output_size_bytes; + return too_large; + } + NN_INFO_PRINTF("Output tensor size: %zu elements, element size: %zu bytes, " + "total: %zu bytes", + tensor_size, element_size, output_size_bytes); + + if (tensor_data == nullptr) { + NN_ERR_PRINTF("Tensor data is null"); + return runtime_error; + } + + if (out_buffer->buf == nullptr) { + NN_ERR_PRINTF("Output buffer is null"); + return invalid_argument; + } + + memcpy(out_buffer->buf, tensor_data, output_size_bytes); + *out_buffer_size = output_size_bytes; + + NN_INFO_PRINTF( + "Output tensor retrieved for context %d, index %d, size %zu bytes", ctx, + index, output_size_bytes); + return success; +} + +} /* End of extern "C" */ From c661592edd1554870c5f3ce254d99328945c4510 Mon Sep 17 00:00:00 2001 From: YAMAMOTO Takashi Date: Tue, 19 Aug 2025 09:23:00 +0900 Subject: [PATCH 035/103] wasi_nn_onnx.cpp: fix debug build (#4564) --- core/iwasm/libraries/wasi-nn/src/wasi_nn_onnx.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/iwasm/libraries/wasi-nn/src/wasi_nn_onnx.cpp b/core/iwasm/libraries/wasi-nn/src/wasi_nn_onnx.cpp index 44d8d66135..88587f68bc 100644 --- a/core/iwasm/libraries/wasi-nn/src/wasi_nn_onnx.cpp +++ b/core/iwasm/libraries/wasi-nn/src/wasi_nn_onnx.cpp @@ -296,7 +296,7 @@ load(void *onnx_ctx, graph_builder_array *builder, graph_encoding encoding, return invalid_argument; } - NN_INFO_PRINTF("[ONNX Runtime] Loading model of size %zu bytes...", + NN_INFO_PRINTF("[ONNX Runtime] Loading model of size %" PRIu32 " bytes...", builder->buf[0].size); if (builder->buf[0].size > 16) { From d0c636bd80d363e049379039d8e04f4146c24c47 Mon Sep 17 00:00:00 2001 From: Zhenwei Jin <109658203+kylo5aby@users.noreply.github.com> Date: Tue, 19 Aug 2025 08:53:28 +0800 Subject: [PATCH 036/103] fix integer overflow in gc threshold calculation (#4546) Signed-off-by: zhenweijin --- core/shared/mem-alloc/ems/ems_gc_internal.h | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/core/shared/mem-alloc/ems/ems_gc_internal.h b/core/shared/mem-alloc/ems/ems_gc_internal.h index c904942010..605d764dfa 100644 --- a/core/shared/mem-alloc/ems/ems_gc_internal.h +++ b/core/shared/mem-alloc/ems/ems_gc_internal.h @@ -338,8 +338,13 @@ typedef struct gc_heap_struct { static inline void gc_update_threshold(gc_heap_t *heap) { - heap->gc_threshold = - heap->total_free_size * heap->gc_threshold_factor / 1000; + uint64_t result = (uint64_t)heap->total_free_size + * (uint64_t)heap->gc_threshold_factor / 1000; + /* heap->total_free_size * heap->gc_threshold_factor won't exceed + * 6^32(GC_HEAP_SIZE_MAX * GC_DEFAULT_THRESHOLD_FACTOR), so casting result + * to uint32_t is safe + */ + heap->gc_threshold = (uint32_t)result; } #define gct_vm_mutex_init os_mutex_init From ab2ff4a56d0000755e961503aa1a728c95256875 Mon Sep 17 00:00:00 2001 From: Zhenwei Jin <109658203+kylo5aby@users.noreply.github.com> Date: Tue, 19 Aug 2025 08:53:37 +0800 Subject: [PATCH 037/103] add rec idx and rec count validation in aot loader (#4555) Signed-off-by: zhenweijin --- core/iwasm/aot/aot_loader.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/core/iwasm/aot/aot_loader.c b/core/iwasm/aot/aot_loader.c index b36d5aa3ad..1138f667ea 100644 --- a/core/iwasm/aot/aot_loader.c +++ b/core/iwasm/aot/aot_loader.c @@ -1807,8 +1807,12 @@ load_types(const uint8 **p_buf, const uint8 *buf_end, AOTModule *module, read_uint16(buf, buf_end, rec_count); read_uint16(buf, buf_end, rec_idx); #if WASM_ENABLE_AOT_VALIDATOR != 0 - if (rec_idx > i) { - set_error_buf(error_buf, error_buf_size, "invalid rec_idx"); + if (rec_count > module->type_count) { + set_error_buf(error_buf, error_buf_size, "invalid rec count"); + goto fail; + } + if (rec_idx > i || rec_idx >= rec_count) { + set_error_buf(error_buf, error_buf_size, "invalid rec idx"); goto fail; } if (parent_type_idx >= i) { From be3f1f88fe8801e44711f04c8a7e5741bbf26294 Mon Sep 17 00:00:00 2001 From: Zhenwei Jin <109658203+kylo5aby@users.noreply.github.com> Date: Tue, 19 Aug 2025 08:53:44 +0800 Subject: [PATCH 038/103] remove duplicate parent type index validation (#4556) Signed-off-by: zhenweijin --- core/iwasm/aot/aot_loader.c | 14 -------------- 1 file changed, 14 deletions(-) diff --git a/core/iwasm/aot/aot_loader.c b/core/iwasm/aot/aot_loader.c index 1138f667ea..0c4c7baa25 100644 --- a/core/iwasm/aot/aot_loader.c +++ b/core/iwasm/aot/aot_loader.c @@ -2077,13 +2077,6 @@ load_types(const uint8 **p_buf, const uint8 *buf_end, AOTModule *module, AOTType *cur_type = module->types[j]; parent_type_idx = cur_type->parent_type_idx; if (parent_type_idx != (uint32)-1) { /* has parent */ -#if WASM_ENABLE_AOT_VALIDATOR != 0 - if (parent_type_idx >= module->type_count) { - set_error_buf(error_buf, error_buf_size, - "invalid parent type index"); - goto fail; - } -#endif AOTType *parent_type = module->types[parent_type_idx]; module->types[j]->parent_type = parent_type; @@ -2107,13 +2100,6 @@ load_types(const uint8 **p_buf, const uint8 *buf_end, AOTModule *module, AOTType *cur_type = module->types[j]; parent_type_idx = cur_type->parent_type_idx; if (parent_type_idx != (uint32)-1) { /* has parent */ -#if WASM_ENABLE_AOT_VALIDATOR != 0 - if (parent_type_idx >= module->type_count) { - set_error_buf(error_buf, error_buf_size, - "invalid parent type index"); - goto fail; - } -#endif AOTType *parent_type = module->types[parent_type_idx]; /* subtyping has been checked during compilation */ bh_assert(wasm_type_is_subtype_of( From b0dae624a1fb6d377fe85932bb73dfe44d80bc1b Mon Sep 17 00:00:00 2001 From: Liu Jia Date: Tue, 19 Aug 2025 08:53:51 +0800 Subject: [PATCH 039/103] add comments about AOT crash when calling unlinked import func (#4559) --- core/iwasm/aot/aot_runtime.c | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/core/iwasm/aot/aot_runtime.c b/core/iwasm/aot/aot_runtime.c index d2621fb2fa..5709a94d41 100644 --- a/core/iwasm/aot/aot_runtime.c +++ b/core/iwasm/aot/aot_runtime.c @@ -1385,6 +1385,16 @@ init_func_ptrs(AOTModuleInstance *module_inst, AOTModule *module, if (!*func_ptrs) { const char *module_name = module->import_funcs[i].module_name; const char *field_name = module->import_funcs[i].func_name; + + /* AOT mode: If linking an imported function fails, we only issue + * a warning here instead of throwing an error. However, during the + * subsequent `invoke_native` stage, calling this unresolved import + * will likely crash. + * + * See: + * https://github.com/bytecodealliance/wasm-micro-runtime/issues/4539 + * + * Debugging: Check if the import is resolved at link time */ LOG_WARNING("warning: failed to link import function (%s, %s)", module_name, field_name); } @@ -2460,6 +2470,14 @@ invoke_native_with_hw_bound_check(WASMExecEnv *exec_env, void *func_ptr, wasm_exec_env_push_jmpbuf(exec_env, &jmpbuf_node); + /* In AOT mode, this is primarily a design choice for performance reasons. + * Before invoke_native, we do not check whether every imported caller is + * NULL, unlike wasm_interp_call_func_import() and + * wasm_interp_call_func_native(). + * + * See: https://github.com/bytecodealliance/wasm-micro-runtime/issues/4539 + */ + if (os_setjmp(jmpbuf_node.jmpbuf) == 0) { #if WASM_ENABLE_QUICK_AOT_ENTRY != 0 /* Quick call if the quick aot entry is registered */ From 80007d5b1fbda4c144689390cff34484909038c8 Mon Sep 17 00:00:00 2001 From: YAMAMOTO Takashi Date: Tue, 19 Aug 2025 10:48:16 +0900 Subject: [PATCH 040/103] ADOPTERS.md: Add EVP (#4554) --- ADOPTERS.md | 1 + 1 file changed, 1 insertion(+) diff --git a/ADOPTERS.md b/ADOPTERS.md index ef112e9a12..8cdd82d5c9 100644 --- a/ADOPTERS.md +++ b/ADOPTERS.md @@ -26,6 +26,7 @@ _The list is in alphabetical order._ | Project | Reference | | ------------------------------------------------------------ | ------------------------------------------------------------ | | [Apache Teaclave](https://github.com/apache/incubator-teaclave) | https://github.com/apache/incubator-teaclave/blob/master/docs/executing-wasm.md | +| [Edge Virtualization Platform](https://github.com/SonySemiconductorSolutions/edge-virtualization-platform) | https://github.com/SonySemiconductorSolutions/edge-virtualization-platform | | [Envoy](https://github.com/envoyproxy/envoy) | https://github.com/envoyproxy/envoy/blob/main/docs/root/configuration/other_features/wasm.rst | | [faasm](https://github.com/faasm/faasm) | https://github.com/faasm/faasm/blob/main/docs/source/wamr.md | | [fluent-bit](https://github.com/fluent/fluent-bit) | https://github.com/fluent/fluent-bit/tree/master/lib/wasm-micro-runtime-WAMR-1.3.0 | From 735b510437db5e86b604651d11cbad5d633b312c Mon Sep 17 00:00:00 2001 From: YAMAMOTO Takashi Date: Wed, 18 Jun 2025 09:02:49 +0900 Subject: [PATCH 041/103] core/iwasm/libraries/wasi-nn/test/build.sh: set -e --- core/iwasm/libraries/wasi-nn/test/build.sh | 2 ++ 1 file changed, 2 insertions(+) diff --git a/core/iwasm/libraries/wasi-nn/test/build.sh b/core/iwasm/libraries/wasi-nn/test/build.sh index 14f6b9e090..79d65d730c 100755 --- a/core/iwasm/libraries/wasi-nn/test/build.sh +++ b/core/iwasm/libraries/wasi-nn/test/build.sh @@ -14,6 +14,8 @@ # https://github.com/tensorflow/tensorflow/releases/tag/v2.16.1 # https://blog.tensorflow.org/2024/03/whats-new-in-tensorflow-216.html +set -e + CURR_PATH=$(cd $(dirname $0) && pwd -P) # WASM application that uses WASI-NN From 6e8802f7b0125d6ba4a9fbcd6882420c529db0f6 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 20 Aug 2025 08:25:44 +0800 Subject: [PATCH 042/103] build(deps): Bump github/codeql-action from 3.29.8 to 3.29.10 (#4566) Bumps [github/codeql-action](https://github.com/github/codeql-action) from 3.29.8 to 3.29.10. - [Release notes](https://github.com/github/codeql-action/releases) - [Commits](https://github.com/github/codeql-action/compare/v3.29.8...v3.29.10) --- updated-dependencies: - dependency-name: github/codeql-action dependency-version: 3.29.10 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/codeql.yml | 6 +++--- .github/workflows/supply_chain.yml | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml index 0ba7586373..02688d45d9 100644 --- a/.github/workflows/codeql.yml +++ b/.github/workflows/codeql.yml @@ -53,7 +53,7 @@ jobs: # Initializes the CodeQL tools for scanning. - name: Initialize CodeQL - uses: github/codeql-action/init@v3.29.8 + uses: github/codeql-action/init@v3.29.10 with: languages: ${{ matrix.language }} @@ -70,7 +70,7 @@ jobs: - run: | ./.github/scripts/codeql_buildscript.sh - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@v3.29.8 + uses: github/codeql-action/analyze@v3.29.10 with: category: "/language:${{matrix.language}}" upload: false @@ -99,7 +99,7 @@ jobs: output: ${{ steps.step1.outputs.sarif-output }}/cpp.sarif - name: Upload CodeQL results to code scanning - uses: github/codeql-action/upload-sarif@v3.29.8 + uses: github/codeql-action/upload-sarif@v3.29.10 with: sarif_file: ${{ steps.step1.outputs.sarif-output }} category: "/language:${{matrix.language}}" diff --git a/.github/workflows/supply_chain.yml b/.github/workflows/supply_chain.yml index 643788b631..fb305c396c 100644 --- a/.github/workflows/supply_chain.yml +++ b/.github/workflows/supply_chain.yml @@ -60,6 +60,6 @@ jobs: # Upload the results to GitHub's code scanning dashboard. - name: "Upload to code-scanning" - uses: github/codeql-action/upload-sarif@4474150eef8c855ab74a7f19f3ae525e469d2de6 + uses: github/codeql-action/upload-sarif@e96e340c1e95e91449de06aabfa9525b7b98113f with: sarif_file: results.sarif From 962511226fabe0816ca736a602128baf824d05a6 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 20 Aug 2025 09:24:38 +0800 Subject: [PATCH 043/103] build(deps): Bump actions/checkout from 3 to 5 (#4567) Bumps [actions/checkout](https://github.com/actions/checkout) from 3 to 5. - [Release notes](https://github.com/actions/checkout/releases) - [Commits](https://github.com/actions/checkout/compare/v3...v5) --- updated-dependencies: - dependency-name: actions/checkout dependency-version: '5' dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/build_docker_images.yml | 2 +- .github/workflows/build_iwasm_release.yml | 2 +- .github/workflows/build_llvm_libraries.yml | 2 +- .github/workflows/build_wamr_lldb.yml | 2 +- .github/workflows/build_wamr_sdk.yml | 2 +- .github/workflows/build_wamr_vscode_ext.yml | 2 +- .github/workflows/build_wamr_wasi_extensions.yml | 2 +- .github/workflows/build_wamrc.yml | 2 +- .github/workflows/check_version_h.yml | 2 +- .github/workflows/codeql.yml | 2 +- .github/workflows/coding_guidelines.yml | 2 +- .../workflows/compilation_on_android_ubuntu.yml | 14 +++++++------- .github/workflows/compilation_on_macos.yml | 8 ++++---- .github/workflows/compilation_on_nuttx.yml | 8 ++++---- .github/workflows/compilation_on_sgx.yml | 6 +++--- .github/workflows/compilation_on_windows.yml | 6 +++--- .github/workflows/compilation_on_zephyr.yml | 2 +- .github/workflows/create_tag.yml | 2 +- .github/workflows/hadolint_dockerfiles.yml | 2 +- .github/workflows/nightly_run.yml | 10 +++++----- .github/workflows/release_process.yml | 2 +- .../workflows/reuse_latest_release_binaries.yml | 2 +- .github/workflows/spec_test_on_nuttx.yml | 6 +++--- .github/workflows/supply_chain.yml | 2 +- .github/workflows/wamr_wasi_extensions.yml | 2 +- 25 files changed, 47 insertions(+), 47 deletions(-) diff --git a/.github/workflows/build_docker_images.yml b/.github/workflows/build_docker_images.yml index f7643af3fd..fed9d4b3eb 100644 --- a/.github/workflows/build_docker_images.yml +++ b/.github/workflows/build_docker_images.yml @@ -26,7 +26,7 @@ jobs: steps: - name: Checkout repository - uses: actions/checkout@v4 + uses: actions/checkout@v5 - name: Build and save Docker image(wasm-debug-server:${{ inputs.ver_num }}) to tar file run: | diff --git a/.github/workflows/build_iwasm_release.yml b/.github/workflows/build_iwasm_release.yml index d1bdd685d2..7be7db524f 100644 --- a/.github/workflows/build_iwasm_release.yml +++ b/.github/workflows/build_iwasm_release.yml @@ -104,7 +104,7 @@ jobs: contents: write # for uploading release artifacts steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v5 - name: get cached LLVM libraries id: retrieve_llvm_libs diff --git a/.github/workflows/build_llvm_libraries.yml b/.github/workflows/build_llvm_libraries.yml index 97e665c0bb..2f07d617a3 100644 --- a/.github/workflows/build_llvm_libraries.yml +++ b/.github/workflows/build_llvm_libraries.yml @@ -45,7 +45,7 @@ jobs: steps: - name: checkout - uses: actions/checkout@v4 + uses: actions/checkout@v5 - name: install dependencies for non macos-14 if: inputs.os != 'macos-14' diff --git a/.github/workflows/build_wamr_lldb.yml b/.github/workflows/build_wamr_lldb.yml index 297328cc5a..8c259d3009 100644 --- a/.github/workflows/build_wamr_lldb.yml +++ b/.github/workflows/build_wamr_lldb.yml @@ -55,7 +55,7 @@ jobs: contents: write # for uploading release artifacts steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v5 - name: download and install wasi-sdk run: | diff --git a/.github/workflows/build_wamr_sdk.yml b/.github/workflows/build_wamr_sdk.yml index 266c3a6466..c3faeaa6d0 100644 --- a/.github/workflows/build_wamr_sdk.yml +++ b/.github/workflows/build_wamr_sdk.yml @@ -45,7 +45,7 @@ jobs: contents: write # for uploading release artifacts steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v5 - name: download wamr-app-framework run: | diff --git a/.github/workflows/build_wamr_vscode_ext.yml b/.github/workflows/build_wamr_vscode_ext.yml index d0fa3b18ee..5b72612baf 100644 --- a/.github/workflows/build_wamr_vscode_ext.yml +++ b/.github/workflows/build_wamr_vscode_ext.yml @@ -24,7 +24,7 @@ jobs: contents: write # for uploading release artifacts steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v5 - name: Use Node.js 18.x uses: actions/setup-node@v4 diff --git a/.github/workflows/build_wamr_wasi_extensions.yml b/.github/workflows/build_wamr_wasi_extensions.yml index 5412d794d1..82b611e39e 100644 --- a/.github/workflows/build_wamr_wasi_extensions.yml +++ b/.github/workflows/build_wamr_wasi_extensions.yml @@ -28,7 +28,7 @@ jobs: os: [ubuntu-22.04] steps: - name: checkout - uses: actions/checkout@v4 + uses: actions/checkout@v5 - name: install-wasi-sdk-wabt uses: ./.github/actions/install-wasi-sdk-wabt diff --git a/.github/workflows/build_wamrc.yml b/.github/workflows/build_wamrc.yml index df257723f0..419edec384 100644 --- a/.github/workflows/build_wamrc.yml +++ b/.github/workflows/build_wamrc.yml @@ -41,7 +41,7 @@ jobs: contents: write # for uploading release artifacts steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v5 - name: get cached LLVM libraries id: retrieve_llvm_libs diff --git a/.github/workflows/check_version_h.yml b/.github/workflows/check_version_h.yml index ab23ecf9ed..98d89f814b 100644 --- a/.github/workflows/check_version_h.yml +++ b/.github/workflows/check_version_h.yml @@ -14,7 +14,7 @@ jobs: steps: - name: checkout - uses: actions/checkout@v4 + uses: actions/checkout@v5 - name: cmake execute to generate version.h run: cmake -B build_version -S . diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml index 02688d45d9..453193acae 100644 --- a/.github/workflows/codeql.yml +++ b/.github/workflows/codeql.yml @@ -47,7 +47,7 @@ jobs: steps: - name: Checkout repository - uses: actions/checkout@v3 + uses: actions/checkout@v5 with: submodules: recursive diff --git a/.github/workflows/coding_guidelines.yml b/.github/workflows/coding_guidelines.yml index b1f59ce3b9..4feaf33957 100644 --- a/.github/workflows/coding_guidelines.yml +++ b/.github/workflows/coding_guidelines.yml @@ -22,7 +22,7 @@ jobs: runs-on: ubuntu-22.04 steps: - name: checkout - uses: actions/checkout@v4 + uses: actions/checkout@v5 with: fetch-depth: 0 diff --git a/.github/workflows/compilation_on_android_ubuntu.yml b/.github/workflows/compilation_on_android_ubuntu.yml index 358a0d93f2..032560db10 100644 --- a/.github/workflows/compilation_on_android_ubuntu.yml +++ b/.github/workflows/compilation_on_android_ubuntu.yml @@ -101,7 +101,7 @@ jobs: llvm_cache_key: ${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }} steps: - name: checkout - uses: actions/checkout@v4 + uses: actions/checkout@v5 # since jobs.id can't contain the dot character # it is hard to use `format` to assemble the cache key @@ -269,7 +269,7 @@ jobs: llvm_cache_key: ${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }} steps: - name: checkout - uses: actions/checkout@v4 + uses: actions/checkout@v5 # only download llvm cache when needed - name: Get LLVM libraries @@ -327,7 +327,7 @@ jobs: steps: - name: checkout - uses: actions/checkout@v4 + uses: actions/checkout@v5 - name: Get LLVM libraries id: retrieve_llvm_libs @@ -384,7 +384,7 @@ jobs: steps: - name: checkout - uses: actions/checkout@v4 + uses: actions/checkout@v5 - name: Get LLVM libraries id: retrieve_llvm_libs @@ -440,7 +440,7 @@ jobs: steps: - name: checkout - uses: actions/checkout@v4 + uses: actions/checkout@v5 - name: Get LLVM libraries id: retrieve_llvm_libs @@ -502,7 +502,7 @@ jobs: steps: - name: checkout - uses: actions/checkout@v4 + uses: actions/checkout@v5 - name: Get LLVM libraries id: retrieve_llvm_libs @@ -665,7 +665,7 @@ jobs: steps: - name: checkout - uses: actions/checkout@v4 + uses: actions/checkout@v5 - name: Set-up OCaml uses: ocaml/setup-ocaml@v3 diff --git a/.github/workflows/compilation_on_macos.yml b/.github/workflows/compilation_on_macos.yml index 462e273bfd..872da9316c 100644 --- a/.github/workflows/compilation_on_macos.yml +++ b/.github/workflows/compilation_on_macos.yml @@ -86,7 +86,7 @@ jobs: llvm_cache_key: ${{ needs.build_llvm_libraries_on_intel_macos.outputs.cache_key }} steps: - name: checkout - uses: actions/checkout@v4 + uses: actions/checkout@v5 - name: Get LLVM libraries id: retrieve_llvm_libs @@ -190,7 +190,7 @@ jobs: llvm_cache_key: ${{ needs.build_llvm_libraries_on_intel_macos.outputs.cache_key }} steps: - name: checkout - uses: actions/checkout@v4 + uses: actions/checkout@v5 # only download llvm cache when needed - name: Get LLVM libraries @@ -243,7 +243,7 @@ jobs: steps: - name: checkout - uses: actions/checkout@v4 + uses: actions/checkout@v5 - name: Get LLVM libraries id: retrieve_llvm_libs @@ -301,7 +301,7 @@ jobs: llvm_cache_key: ${{ needs.build_llvm_libraries_on_arm_macos.outputs.cache_key }} steps: - name: checkout - uses: actions/checkout@v4 + uses: actions/checkout@v5 - name: install-wasi-sdk-wabt uses: ./.github/actions/install-wasi-sdk-wabt diff --git a/.github/workflows/compilation_on_nuttx.yml b/.github/workflows/compilation_on_nuttx.yml index 5922f5e3a9..4e164fc82b 100644 --- a/.github/workflows/compilation_on_nuttx.yml +++ b/.github/workflows/compilation_on_nuttx.yml @@ -85,21 +85,21 @@ jobs: steps: - name: Checkout NuttX - uses: actions/checkout@v4 + uses: actions/checkout@v5 with: repository: apache/nuttx ref: releases/12.9 path: nuttx - name: Checkout NuttX Apps - uses: actions/checkout@v4 + uses: actions/checkout@v5 with: repository: apache/nuttx-apps ref: releases/12.9 path: apps - name: Checkout WAMR - uses: actions/checkout@v4 + uses: actions/checkout@v5 with: repository: ${{ github.repository }} path: apps/interpreters/wamr/wamr @@ -122,7 +122,7 @@ jobs: run: make -j$(nproc) EXTRAFLAGS=-Werror - name: Checkout Bloaty - uses: actions/checkout@v4 + uses: actions/checkout@v5 with: repository: google/bloaty submodules: recursive diff --git a/.github/workflows/compilation_on_sgx.yml b/.github/workflows/compilation_on_sgx.yml index ec27fd8baa..aa95f94699 100644 --- a/.github/workflows/compilation_on_sgx.yml +++ b/.github/workflows/compilation_on_sgx.yml @@ -116,7 +116,7 @@ jobs: make_options_feature: "-DWAMR_BUILD_MINI_LOADER=1" steps: - name: checkout - uses: actions/checkout@v4 + uses: actions/checkout@v5 - name: install SGX SDK and necessary libraries uses: ./.github/actions/install-linux-sgx @@ -159,7 +159,7 @@ jobs: steps: - name: checkout - uses: actions/checkout@v4 + uses: actions/checkout@v5 - name: install-wasi-sdk-wabt uses: ./.github/actions/install-wasi-sdk-wabt @@ -255,7 +255,7 @@ jobs: steps: - name: checkout - uses: actions/checkout@v4 + uses: actions/checkout@v5 - name: Get LLVM libraries if: matrix.running_mode == 'aot' diff --git a/.github/workflows/compilation_on_windows.yml b/.github/workflows/compilation_on_windows.yml index 7cee2aa400..543880048d 100644 --- a/.github/workflows/compilation_on_windows.yml +++ b/.github/workflows/compilation_on_windows.yml @@ -85,7 +85,7 @@ jobs: "-DWAMR_BUILD_LIBC_UVWASI=0 -DWAMR_BUILD_LIBC_WASI=1", ] steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v5 - name: clone uvwasi library if: ${{ !contains(matrix.build_options, '-DWAMR_BUILD_LIBC_UVWASI=0') }} @@ -109,7 +109,7 @@ jobs: llvm_cache_key: ${{ needs.build_llvm_libraries_on_windows.outputs.cache_key }} steps: - name: checkout - uses: actions/checkout@v4 + uses: actions/checkout@v5 # since jobs.id can't contain the dot character # it is hard to use `format` to assemble the cache key @@ -151,7 +151,7 @@ jobs: ] steps: - name: checkout - uses: actions/checkout@v4 + uses: actions/checkout@v5 - name: download and install wasi-sdk if: matrix.test_option == '$WASI_TEST_OPTIONS' diff --git a/.github/workflows/compilation_on_zephyr.yml b/.github/workflows/compilation_on_zephyr.yml index 274fc37406..7342804ac8 100644 --- a/.github/workflows/compilation_on_zephyr.yml +++ b/.github/workflows/compilation_on_zephyr.yml @@ -78,7 +78,7 @@ jobs: # └─── application/ --> DUMMY. keep west_lite.yml here - name: Checkout code - uses: actions/checkout@v3 + uses: actions/checkout@v5 with: path: modules/wasm-micro-runtime diff --git a/.github/workflows/create_tag.yml b/.github/workflows/create_tag.yml index 7a90ea5f74..dcb2937495 100644 --- a/.github/workflows/create_tag.yml +++ b/.github/workflows/create_tag.yml @@ -29,7 +29,7 @@ jobs: contents: write # create and push tags steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v5 # Full git history is needed to get a proper list of commits and tags with: fetch-depth: 0 diff --git a/.github/workflows/hadolint_dockerfiles.yml b/.github/workflows/hadolint_dockerfiles.yml index f9d8c38934..e43cd10372 100644 --- a/.github/workflows/hadolint_dockerfiles.yml +++ b/.github/workflows/hadolint_dockerfiles.yml @@ -37,7 +37,7 @@ jobs: steps: - name: Checkout repository - uses: actions/checkout@v4 + uses: actions/checkout@v5 # on default, hadolint will fail on warnings and errors - name: Run hadolint on dockerfiles diff --git a/.github/workflows/nightly_run.yml b/.github/workflows/nightly_run.yml index b2bd04d1d9..260a7e97c4 100644 --- a/.github/workflows/nightly_run.yml +++ b/.github/workflows/nightly_run.yml @@ -67,7 +67,7 @@ jobs: llvm_cache_key: ${{ needs.build_llvm_libraries_on_ubuntu.outputs.cache_key }} steps: - name: checkout - uses: actions/checkout@v4 + uses: actions/checkout@v5 # since jobs.id can't contain the dot character # it is hard to use `format` to assemble the cache key @@ -233,7 +233,7 @@ jobs: steps: - name: checkout - uses: actions/checkout@v4 + uses: actions/checkout@v5 # only download llvm cache when needed - name: Get LLVM libraries @@ -387,7 +387,7 @@ jobs: sanitizer: asan steps: - name: checkout - uses: actions/checkout@v4 + uses: actions/checkout@v5 - name: Get LLVM libraries id: retrieve_llvm_libs @@ -440,7 +440,7 @@ jobs: llvm_cache_key: ${{ needs.build_llvm_libraries_on_ubuntu.outputs.cache_key }} steps: - name: checkout - uses: actions/checkout@v4 + uses: actions/checkout@v5 - name: install-wasi-sdk-wabt uses: ./.github/actions/install-wasi-sdk-wabt @@ -626,7 +626,7 @@ jobs: sanitizer: ubsan steps: - name: checkout - uses: actions/checkout@v4 + uses: actions/checkout@v5 - name: install-wasi-sdk-wabt if: matrix.test_option == '$WASI_TEST_OPTIONS' diff --git a/.github/workflows/release_process.yml b/.github/workflows/release_process.yml index 298d0004a4..857036662d 100644 --- a/.github/workflows/release_process.yml +++ b/.github/workflows/release_process.yml @@ -55,7 +55,7 @@ jobs: outputs: upload_url: ${{ steps.create_release.outputs.upload_url }} steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v5 - name: prepare the release note run: | diff --git a/.github/workflows/reuse_latest_release_binaries.yml b/.github/workflows/reuse_latest_release_binaries.yml index 77fe7329f5..7c34cb6183 100644 --- a/.github/workflows/reuse_latest_release_binaries.yml +++ b/.github/workflows/reuse_latest_release_binaries.yml @@ -34,7 +34,7 @@ jobs: contents: write # for creating realease and uploading release artifacts steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v5 # Full git history is needed to get a proper list of commits and tags with: fetch-depth: 0 diff --git a/.github/workflows/spec_test_on_nuttx.yml b/.github/workflows/spec_test_on_nuttx.yml index 6c36c45ca3..a65a03bf9c 100644 --- a/.github/workflows/spec_test_on_nuttx.yml +++ b/.github/workflows/spec_test_on_nuttx.yml @@ -143,21 +143,21 @@ jobs: # Note: we use an unreleased version nuttx for xtensa because # 12.4 doesn't contain necessary esp32s3 changes. - name: Checkout NuttX - uses: actions/checkout@v4 + uses: actions/checkout@v5 with: repository: apache/nuttx ref: ${{ matrix.target_config.target == 'xtensa' && '985d395b025cf2012b22f6bb4461959fa6d87645' || 'releases/12.9' }} path: nuttx - name: Checkout NuttX Apps - uses: actions/checkout@v4 + uses: actions/checkout@v5 with: repository: apache/nuttx-apps ref: ${{ matrix.target_config.target == 'xtensa' && '2ef3eb25c0cec944b13792185f7e5d5a05990d5f' || 'releases/12.9' }} path: apps - name: Checkout WAMR - uses: actions/checkout@v4 + uses: actions/checkout@v5 with: repository: ${{ github.repository }} path: apps/interpreters/wamr/wamr diff --git a/.github/workflows/supply_chain.yml b/.github/workflows/supply_chain.yml index fb305c396c..f05372ee4e 100644 --- a/.github/workflows/supply_chain.yml +++ b/.github/workflows/supply_chain.yml @@ -34,7 +34,7 @@ jobs: steps: - name: "Checkout code" - uses: actions/checkout@93ea575cb5d8a053eaa0ac8fa3b40d7e05a33cc8 # v3.1.0 + uses: actions/checkout@ff7abcd0c3c05ccf6adc123a8cd1fd4fb30fb493 # v3.1.0 with: persist-credentials: false diff --git a/.github/workflows/wamr_wasi_extensions.yml b/.github/workflows/wamr_wasi_extensions.yml index e9d10fe93c..7a7a56db33 100644 --- a/.github/workflows/wamr_wasi_extensions.yml +++ b/.github/workflows/wamr_wasi_extensions.yml @@ -30,7 +30,7 @@ jobs: os: [ubuntu-22.04, macos-13, macos-14] steps: - name: checkout - uses: actions/checkout@v4 + uses: actions/checkout@v5 - name: install-wasi-sdk-wabt uses: ./.github/actions/install-wasi-sdk-wabt From 9ee44bf2d07681af912bc5cc9bc13ccbfd071969 Mon Sep 17 00:00:00 2001 From: James Marsh Date: Wed, 20 Aug 2025 13:13:56 +0100 Subject: [PATCH 044/103] Add Android macro check for indirect mode --- core/iwasm/aot/aot_loader.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/core/iwasm/aot/aot_loader.c b/core/iwasm/aot/aot_loader.c index 0c4c7baa25..a87aee0a72 100644 --- a/core/iwasm/aot/aot_loader.c +++ b/core/iwasm/aot/aot_loader.c @@ -3899,8 +3899,9 @@ load_relocation_section(const uint8 *buf, const uint8 *buf_end, || !strcmp(group->section_name, ".text") #endif ) { -#if !defined(BH_PLATFORM_LINUX) && !defined(BH_PLATFORM_LINUX_SGX) \ - && !defined(BH_PLATFORM_DARWIN) && !defined(BH_PLATFORM_WINDOWS) +#if !defined(BH_PLATFORM_LINUX) && !defined(BH_PLATFORM_LINUX_SGX) \ + && !defined(BH_PLATFORM_DARWIN) && !defined(BH_PLATFORM_WINDOWS) \ + && !defined(BH_PLATFORM_ANDROID) if (module->is_indirect_mode) { set_error_buf(error_buf, error_buf_size, "cannot apply relocation to text section " From ddd35006020b40a6d3ab717805258b8aac692059 Mon Sep 17 00:00:00 2001 From: Zhenwei Jin <109658203+kylo5aby@users.noreply.github.com> Date: Sun, 24 Aug 2025 06:55:27 +0800 Subject: [PATCH 045/103] update doc to state support for export/import mut globals (#4562) Signed-off-by: zhenweijin --- build-scripts/config_common.cmake | 16 +++---- doc/stability_wasm_proposals.md | 44 ++++++++++--------- product-mini/platforms/common/wasm_proposal.c | 13 +++--- 3 files changed, 37 insertions(+), 36 deletions(-) diff --git a/build-scripts/config_common.cmake b/build-scripts/config_common.cmake index a6d27afaee..d21ca9c3a9 100644 --- a/build-scripts/config_common.cmake +++ b/build-scripts/config_common.cmake @@ -732,28 +732,28 @@ endif () message ( "-- About Wasm Proposals:\n" " Always-on:\n" +" \"Import/Export of Mutable Globals\"\n" " \"Multi-value\"\n" -" \"Non-trapping float-to-int conversions\"\n" -" \"Sign-extension operators\"\n" +" \"Non-trapping float-to-int Conversions\"\n" +" \"Sign-extension Operators\"\n" " \"WebAssembly C and C++ API\"\n" " Configurable. 0 is OFF. 1 is ON:\n" " \"Bulk Memory Operation\" via WAMR_BUILD_BULK_MEMORY: ${WAMR_BUILD_BULK_MEMORY}\n" " \"Extended Constant Expressions\" via WAMR_BUILD_EXTENDED_CONST_EXPR: ${WAMR_BUILD_EXTENDED_CONST_EXPR}\n" " \"Fixed-width SIMD\" via WAMR_BUILD_SIMD: ${WAMR_BUILD_SIMD}\n" -" \"Garbage collection\" via WAMR_BUILD_GC: ${WAMR_BUILD_GC}\n" -" \"Legacy Exception handling\" via WAMR_BUILD_EXCE_HANDLING: ${WAMR_BUILD_EXCE_HANDLING}\n" +" \"Garbage Collection\" via WAMR_BUILD_GC: ${WAMR_BUILD_GC}\n" +" \"Legacy Exception Handling\" via WAMR_BUILD_EXCE_HANDLING: ${WAMR_BUILD_EXCE_HANDLING}\n" " \"Memory64\" via WAMR_BUILD_MEMORY64: ${WAMR_BUILD_MEMORY64}\n" -" \"Multiple memories\" via WAMR_BUILD_MULTI_MEMORY: ${WAMR_BUILD_MULTI_MEMORY}\n" +" \"Multiple Memories\" via WAMR_BUILD_MULTI_MEMORY: ${WAMR_BUILD_MULTI_MEMORY}\n" " \"Reference Types\" via WAMR_BUILD_REF_TYPES: ${WAMR_BUILD_REF_TYPES}\n" " \"Reference-Typed Strings\" via WAMR_BUILD_STRINGREF: ${WAMR_BUILD_STRINGREF}\n" -" \"Tail call\" via WAMR_BUILD_TAIL_CALL: ${WAMR_BUILD_TAIL_CALL}\n" +" \"Tail Call\" via WAMR_BUILD_TAIL_CALL: ${WAMR_BUILD_TAIL_CALL}\n" " \"Threads\" via WAMR_BUILD_SHARED_MEMORY: ${WAMR_BUILD_SHARED_MEMORY}\n" " \"Typed Function References\" via WAMR_BUILD_GC: ${WAMR_BUILD_GC}\n" " Unsupported (>= Phase4):\n" " \"Branch Hinting\"\n" " \"Custom Annotation Syntax in the Text Format\"\n" -" \"Exception handling\"\n" -" \"Import/Export of Mutable Globals\"\n" +" \"Exception Handling\"\n" " \"JS String Builtins\"\n" " \"Relaxed SIMD\"\n" ) diff --git a/doc/stability_wasm_proposals.md b/doc/stability_wasm_proposals.md index e2bbe54e84..fe93d31d1d 100644 --- a/doc/stability_wasm_proposals.md +++ b/doc/stability_wasm_proposals.md @@ -14,37 +14,41 @@ Users can turn those features on or off by using compilation options. If a relev | Proposal | >= Phase 4 | Compilation Option | | ------------------------------------- | ---------- | ------------------------ | -| Bulk memory operations | Yes | `WAMR_BUILD_BULK_MEMORY` | +| Bulk Memory Operations | Yes | `WAMR_BUILD_BULK_MEMORY` | | Fixed-width SIMD[^1] | Yes | `WAMR_BUILD_SIMD` | +| Import/Export of Mutable Globals[^2] | Yes | N/A | | Multi-value | Yes | N/A | -| Non-trapping float-to-int conversions | Yes | N/A | +| Non-trapping float-to-int Conversions | Yes | N/A | | Reference Types | Yes | `WAMR_BUILD_REF_TYPES` | -| Sign-extension operators | Yes | N/A | +| Sign-extension Operators | Yes | N/A | | WebAssembly C and C++ API | No | N/A | [^1]: llvm-jit and aot only. +[^2]: in WAMR's implementation, if a mutable global shared by several wasm instances, each instance maintains its own copy of the global rather than sharing it. + ## Off-by-default Wasm Proposals -| Proposal | >= Phase 4 | Compilation Option | -| ----------------------------- | ---------- | -------------------------- | -| Garbage collection | Yes | `WAMR_BUILD_GC` | -| Legacy Exception handling[^2] | No | `WAMR_BUILD_EXCE_HANDLING` | -| Memory64 | Yes | `WAMR_BUILD_MEMORY64` | -| Multiple memories[^3] | Yes | `WAMR_BUILD_MULTI_MEMORY` | -| Reference-Typed Strings | No | `WAMR_BUILD_STRINGREF` | -| Tail call | Yes | `WAMR_BUILD_TAIL_CALL` | -| Threads[^4] | Yes | `WAMR_BUILD_SHARED_MEMORY` | -| Typed Function References | Yes | `WAMR_BUILD_GC` | - -[^2]: +| Proposal | >= Phase 4 | Compilation Option | +| ----------------------------- | ---------- | ---------------------------------| +| Extended Constant Expressions | Yes | `WAMR_BUILD_EXTENDED_CONST_EXPR` | +| Garbage Collection | Yes | `WAMR_BUILD_GC` | +| Legacy Exception Handling[^3] | No | `WAMR_BUILD_EXCE_HANDLING` | +| Memory64 | Yes | `WAMR_BUILD_MEMORY64` | +| Multiple Memories[^4] | Yes | `WAMR_BUILD_MULTI_MEMORY` | +| Reference-Typed Strings | No | `WAMR_BUILD_STRINGREF` | +| Tail Call | Yes | `WAMR_BUILD_TAIL_CALL` | +| Threads[^5] | Yes | `WAMR_BUILD_SHARED_MEMORY` | +| Typed Function References | Yes | `WAMR_BUILD_GC` | + +[^3]: interpreter only. [a legacy version](https://github.com/WebAssembly/exception-handling/blob/main/proposals/exception-handling/legacy/Exceptions.md). This proposal is currently also known as the "legacy proposal" and still supported in the web, but can be deprecated in future and the use of this proposal is discouraged. -[^3]: interpreter only -[^4]: `WAMR_BUILD_LIB_PTHREAD` can also be used to enable +[^4]: interpreter only +[^5]: `WAMR_BUILD_LIB_PTHREAD` can also be used to enable ## Unimplemented Wasm Proposals @@ -52,13 +56,11 @@ Users can turn those features on or off by using compilation options. If a relev | ------------------------------------------- | ---------- | | Branch Hinting | Yes | | Custom Annotation Syntax in the Text Format | Yes | -| Exception handling[^5] | Yes | -| Extended Constant Expressions | Yes | -| Import/Export of Mutable Globals | Yes | +| Exception Handling[^6] | Yes | | JS String Builtins | Yes | | Relaxed SIMD | Yes | -[^5]: [up-to-date version](https://github.com/WebAssembly/exception-handling/blob/main/proposals/exception-handling/Exceptions.md) +[^6]: [up-to-date version](https://github.com/WebAssembly/exception-handling/blob/main/proposals/exception-handling/Exceptions.md) ## On-by-default WASI Proposals diff --git a/product-mini/platforms/common/wasm_proposal.c b/product-mini/platforms/common/wasm_proposal.c index 3c04d46ecf..8a4c3d44f9 100644 --- a/product-mini/platforms/common/wasm_proposal.c +++ b/product-mini/platforms/common/wasm_proposal.c @@ -12,14 +12,15 @@ wasm_proposal_print_status(void) { printf("About Wasm Proposals:\n"); printf(" Always-on:\n"); + printf(" - Import/Export of Mutable Globals\n"); printf(" - Multi-value\n"); - printf(" - Non-trapping float-to-int conversions\n"); - printf(" - Sign-extension operators\n"); + printf(" - Non-trapping float-to-int Conversions\n"); + printf(" - Sign-extension Operators\n"); printf(" - WebAssembly C and C++ API\n"); printf(" Compilation Configurable. 0 is OFF. 1 is ON:\n"); printf(" - Bulk Memory Operation via WASM_ENABLE_BULK_MEMORY: %u\n", WASM_ENABLE_BULK_MEMORY); - printf(" - Fixed-Width SIMD via WASM_ENABLE_SIMD: %u\n", + printf(" - Fixed-width SIMD via WASM_ENABLE_SIMD: %u\n", WASM_ENABLE_SIMD); printf(" - Garbage Collection via WASM_ENABLE_GC: %u\n", WASM_ENABLE_GC); printf( @@ -27,7 +28,7 @@ wasm_proposal_print_status(void) WASM_ENABLE_EXCE_HANDLING); printf(" - Memory64 via WASM_ENABLE_MEMORY64: %u\n", WASM_ENABLE_MEMORY64); - printf(" - Multiple Memory via WASM_ENABLE_MULTI_MEMORY: %u\n", + printf(" - Multiple Memories via WASM_ENABLE_MULTI_MEMORY: %u\n", WASM_ENABLE_MULTI_MEMORY); printf(" - Reference Types via WASM_ENABLE_REF_TYPES: %u\n", WASM_ENABLE_REF_TYPES); @@ -42,9 +43,7 @@ wasm_proposal_print_status(void) printf(" Unsupported (>= Phase4):\n"); printf(" - Branch Hinting\n"); printf(" - Custom Annotation Syntax in the Text Format\n"); - printf(" - Exception handling\n"); - printf(" - Extended Constant Expressions\n"); - printf(" - Import/Export of Mutable Globals\n"); + printf(" - Exception Handling\n"); printf(" - JS String Builtins\n"); printf(" - Relaxed SIMD\n"); } From 0b97d0cb1482e581fef31e41b822408bf6823276 Mon Sep 17 00:00:00 2001 From: "liang.he" Date: Mon, 25 Aug 2025 16:55:23 +0800 Subject: [PATCH 046/103] Merge dev/zephyr_file_socket into main (#4347) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit zephyr: Enable WASI support for file system and sockets on zephyr (#3633) This work also implements the WASI support on Zephyr. * Added os_is_* methods for stdin/stdout/stderr. Fixed issues in os_renameat * Zephyr platform fixes for WASI sockets Addressed numerous of build warnings on Zephyr * Updated `os_writev` to use `fwrite` for STDOUT/STDERR * Temporarily reverted change to `writev` to work around an issue. * Fixes: fstat, fstatat, and unlink * Add initial support for directories in os_openat. Partial implementation — just avoids a hard fault. * Directory support WIP. readdir works but I think we have a memory leak somewhere * Fix: always use standard stream fds. Fix unlinkat and renameat. fd 0, 1, and 2 will always be supplied for standard streams. Unlinkat and renameat work exclusively based on supplied paths. * Fix: use macro for free() * Added a temporary workaround for issue identified in PR#4377 * Fixed reference to file descriptor and cleaned up dead/commented code. Note that some comments haven't been addressed and will be fixed in the further patches. Signed-off-by: Stephen Berard Co-authored-by: Lucas Abad <149054121+lucasAbadFr@users.noreply.github.com> Co-authored-by: Stephen Berard Co-authored-by: Dan Kouba --- core/iwasm/common/wasm_application.c | 5 +- .../libraries/libc-wasi/libc_wasi_wrapper.c | 17 +- .../src/blocking_op.c | 6 +- .../src/blocking_op.h | 4 +- .../sandboxed-system-primitives/src/locking.h | 17 +- .../sandboxed-system-primitives/src/posix.c | 100 +- .../sandboxed-system-primitives/src/random.c | 14 + .../src/ssp_config.h | 8 +- core/shared/mem-alloc/ems/ems_gc.c | 2 + .../shared/platform/alios/platform_internal.h | 3 + .../platform/android/platform_internal.h | 6 + .../shared/platform/common/posix/posix_file.c | 28 + .../platform/common/posix/posix_socket.c | 2 +- .../platform/cosmopolitan/platform_internal.h | 3 + .../platform/darwin/platform_internal.h | 3 + core/shared/platform/esp-idf/espidf_file.c | 12 + .../platform/esp-idf/platform_internal.h | 6 + .../platform/freebsd/platform_internal.h | 3 + .../platform/include/platform_api_extension.h | 20 + .../platform/include/platform_wasi_types.h | 7 +- .../platform/linux-sgx/platform_internal.h | 10 + .../shared/platform/linux/platform_internal.h | 4 + .../shared/platform/nuttx/platform_internal.h | 5 + core/shared/platform/riot/platform_internal.h | 3 + .../platform/rt-thread/platform_internal.h | 3 + .../platform/vxworks/platform_internal.h | 6 + .../platform/windows/platform_internal.h | 6 + core/shared/platform/windows/win_file.c | 36 + .../platform/zephyr/platform_internal.h | 147 +- .../platform/zephyr/shared_platform.cmake | 15 +- core/shared/platform/zephyr/zephyr_clock.c | 66 + core/shared/platform/zephyr/zephyr_file.c | 1198 +++++++ core/shared/platform/zephyr/zephyr_socket.c | 1062 ++++++ core/shared/platform/zephyr/zephyr_thread.c | 242 +- .../zephyr/simple-file/CMakeLists.txt | 91 + .../platforms/zephyr/simple-file/README.md | 91 + .../platforms/zephyr/simple-file/prj.conf | 40 + .../platforms/zephyr/simple-file/src/file.h | 2898 ++++++++++++++++ .../platforms/zephyr/simple-file/src/main.c | 225 ++ .../zephyr/simple-file/to_c_header.py | 32 + .../zephyr/simple-file/wasm-apps/file.c | 55 + .../zephyr/simple-http/CMakeLists.txt | 89 + .../platforms/zephyr/simple-http/README.md | 143 + .../platforms/zephyr/simple-http/prj.conf | 61 + .../zephyr/simple-http/src/http_get.h | 3039 +++++++++++++++++ .../platforms/zephyr/simple-http/src/main.c | 141 + .../zephyr/simple-http/to_c_header.py | 34 + .../zephyr/simple-http/wasm-apps/http_get.c | 91 + .../simple-http/wasm-apps/inc/location.md | 5 + samples/socket-api/wasm-src/CMakeLists.txt | 2 +- 50 files changed, 9956 insertions(+), 150 deletions(-) create mode 100644 core/shared/platform/zephyr/zephyr_clock.c create mode 100644 core/shared/platform/zephyr/zephyr_file.c create mode 100644 core/shared/platform/zephyr/zephyr_socket.c create mode 100644 product-mini/platforms/zephyr/simple-file/CMakeLists.txt create mode 100644 product-mini/platforms/zephyr/simple-file/README.md create mode 100644 product-mini/platforms/zephyr/simple-file/prj.conf create mode 100644 product-mini/platforms/zephyr/simple-file/src/file.h create mode 100644 product-mini/platforms/zephyr/simple-file/src/main.c create mode 100644 product-mini/platforms/zephyr/simple-file/to_c_header.py create mode 100644 product-mini/platforms/zephyr/simple-file/wasm-apps/file.c create mode 100644 product-mini/platforms/zephyr/simple-http/CMakeLists.txt create mode 100644 product-mini/platforms/zephyr/simple-http/README.md create mode 100644 product-mini/platforms/zephyr/simple-http/prj.conf create mode 100644 product-mini/platforms/zephyr/simple-http/src/http_get.h create mode 100644 product-mini/platforms/zephyr/simple-http/src/main.c create mode 100644 product-mini/platforms/zephyr/simple-http/to_c_header.py create mode 100644 product-mini/platforms/zephyr/simple-http/wasm-apps/http_get.c create mode 100644 product-mini/platforms/zephyr/simple-http/wasm-apps/inc/location.md diff --git a/core/iwasm/common/wasm_application.c b/core/iwasm/common/wasm_application.c index 85f3770f64..7bbd43d166 100644 --- a/core/iwasm/common/wasm_application.c +++ b/core/iwasm/common/wasm_application.c @@ -712,7 +712,10 @@ execute_func(WASMModuleInstanceCommon *module_inst, const char *name, } case VALUE_TYPE_F32: { - os_printf("%.7g:f32", *(float32 *)(argv1 + k)); + // Explicit cast to double to avoid warning. + // Float arguments are promoted to double in variadic + // functions per section 6.5.2.2 of the C99 standard. + os_printf("%.7g:f32", (double)*(float32 *)(argv1 + k)); k++; break; } diff --git a/core/iwasm/libraries/libc-wasi/libc_wasi_wrapper.c b/core/iwasm/libraries/libc-wasi/libc_wasi_wrapper.c index f7dfea0b52..acd7c31c96 100644 --- a/core/iwasm/libraries/libc-wasi/libc_wasi_wrapper.c +++ b/core/iwasm/libraries/libc-wasi/libc_wasi_wrapper.c @@ -1016,12 +1016,10 @@ update_clock_subscription_data(wasi_subscription_t *in, uint32 nsubscriptions, } static wasi_errno_t -execute_interruptible_poll_oneoff( -#if !defined(WASMTIME_SSP_STATIC_CURFDS) - struct fd_table *curfds, -#endif - const __wasi_subscription_t *in, __wasi_event_t *out, size_t nsubscriptions, - size_t *nevents, wasm_exec_env_t exec_env) +execute_interruptible_poll_oneoff(struct fd_table *curfds, + const __wasi_subscription_t *in, + __wasi_event_t *out, size_t nsubscriptions, + size_t *nevents, wasm_exec_env_t exec_env) { if (nsubscriptions == 0) { *nevents = 0; @@ -2118,15 +2116,16 @@ wasi_sock_recv(wasm_exec_env_t exec_env, wasi_fd_t sock, iovec_app_t *ri_data, wasi_roflags_t *ro_flags) { wasm_module_inst_t module_inst = get_module_inst(exec_env); - __wasi_addr_t src_addr; wasi_errno_t error; if (!validate_native_addr(ro_flags, (uint64)sizeof(wasi_roflags_t))) return __WASI_EINVAL; + // We call `recvfrom` with NULL source address as `recv` doesn't + // return the source address and this parameter is not used. + *ro_data_len = 0; error = wasi_sock_recv_from(exec_env, sock, ri_data, ri_data_len, ri_flags, - &src_addr, ro_data_len); - *ro_flags = ri_flags; + NULL, ro_data_len); return error; } diff --git a/core/iwasm/libraries/libc-wasi/sandboxed-system-primitives/src/blocking_op.c b/core/iwasm/libraries/libc-wasi/sandboxed-system-primitives/src/blocking_op.c index 4dcc4f5b0b..cf3acf3556 100644 --- a/core/iwasm/libraries/libc-wasi/sandboxed-system-primitives/src/blocking_op.c +++ b/core/iwasm/libraries/libc-wasi/sandboxed-system-primitives/src/blocking_op.c @@ -175,14 +175,14 @@ blocking_op_openat(wasm_exec_env_t exec_env, os_file_handle handle, #ifndef BH_PLATFORM_WINDOWS /* REVISIT: apply the os_file_handle style abstraction for pollfd? */ __wasi_errno_t -blocking_op_poll(wasm_exec_env_t exec_env, struct pollfd *pfds, nfds_t nfds, - int timeout_ms, int *retp) +blocking_op_poll(wasm_exec_env_t exec_env, os_poll_file_handle *pfds, + os_nfds_t nfds, int timeout_ms, int *retp) { int ret; if (!wasm_runtime_begin_blocking_op(exec_env)) { return __WASI_EINTR; } - ret = poll(pfds, nfds, timeout_ms); + ret = os_poll(pfds, nfds, timeout_ms); wasm_runtime_end_blocking_op(exec_env); if (ret == -1) { return convert_errno(errno); diff --git a/core/iwasm/libraries/libc-wasi/sandboxed-system-primitives/src/blocking_op.h b/core/iwasm/libraries/libc-wasi/sandboxed-system-primitives/src/blocking_op.h index a32e5d662e..310d6bd2c8 100644 --- a/core/iwasm/libraries/libc-wasi/sandboxed-system-primitives/src/blocking_op.h +++ b/core/iwasm/libraries/libc-wasi/sandboxed-system-primitives/src/blocking_op.h @@ -57,8 +57,8 @@ blocking_op_openat(wasm_exec_env_t exec_env, os_file_handle handle, #ifndef BH_PLATFORM_WINDOWS __wasi_errno_t -blocking_op_poll(wasm_exec_env_t exec_env, struct pollfd *pfds, nfds_t nfds, - int timeout, int *retp); +blocking_op_poll(wasm_exec_env_t exec_env, os_poll_file_handle *pfds, + os_nfds_t nfds, int timeout, int *retp); #endif #endif /* end of _BLOCKING_OP_H_ */ diff --git a/core/iwasm/libraries/libc-wasi/sandboxed-system-primitives/src/locking.h b/core/iwasm/libraries/libc-wasi/sandboxed-system-primitives/src/locking.h index 0ad40ecfd3..b273ba3a9f 100644 --- a/core/iwasm/libraries/libc-wasi/sandboxed-system-primitives/src/locking.h +++ b/core/iwasm/libraries/libc-wasi/sandboxed-system-primitives/src/locking.h @@ -196,8 +196,12 @@ static inline bool cond_timedwait(struct cond *cond, struct mutex *lock, uint64_t timeout, bool abstime) REQUIRES_EXCLUSIVE(*lock) NO_LOCK_ANALYSIS { +#if defined(BH_PLATFORM_ZEPHYR) + // TODO: Implement this for Zephyr + return false; +#else int ret; - struct timespec ts = { + os_timespec ts = { .tv_sec = (time_t)(timeout / 1000000000), .tv_nsec = (long)(timeout % 1000000000), }; @@ -210,8 +214,8 @@ cond_timedwait(struct cond *cond, struct mutex *lock, uint64_t timeout, * realtime clock. */ if (cond->clock != CLOCK_REALTIME) { - struct timespec ts_monotonic; - struct timespec ts_realtime; + os_timespec ts_monotonic; + os_timespec ts_realtime; clock_gettime(cond->clock, &ts_monotonic); ts.tv_sec -= ts_monotonic.tv_sec; @@ -229,7 +233,7 @@ cond_timedwait(struct cond *cond, struct mutex *lock, uint64_t timeout, ++ts.tv_sec; } } -#endif +#endif /* !CONFIG_HAS_PTHREAD_CONDATTR_SETCLOCK */ } else { #if CONFIG_HAS_PTHREAD_COND_TIMEDWAIT_RELATIVE_NP @@ -241,7 +245,7 @@ cond_timedwait(struct cond *cond, struct mutex *lock, uint64_t timeout, return ret == ETIMEDOUT; #else /* Convert to absolute timeout. */ - struct timespec ts_now; + os_timespec ts_now; #if CONFIG_HAS_PTHREAD_CONDATTR_SETCLOCK clock_gettime(cond->clock, &ts_now); #else @@ -253,13 +257,14 @@ cond_timedwait(struct cond *cond, struct mutex *lock, uint64_t timeout, ts.tv_nsec -= 1000000000; ++ts.tv_sec; } -#endif +#endif /* CONFIG_HAS_PTHREAD_COND_TIMEDWAIT_RELATIVE_NP */ } ret = pthread_cond_timedwait(&cond->object, &lock->object, &ts); bh_assert((ret == 0 || ret == ETIMEDOUT) && "pthread_cond_timedwait() failed"); return ret == ETIMEDOUT; +#endif /* BH_PLATFORM_ZEPHYR */ } #endif diff --git a/core/iwasm/libraries/libc-wasi/sandboxed-system-primitives/src/posix.c b/core/iwasm/libraries/libc-wasi/sandboxed-system-primitives/src/posix.c index bef4c19f3c..684233558b 100644 --- a/core/iwasm/libraries/libc-wasi/sandboxed-system-primitives/src/posix.c +++ b/core/iwasm/libraries/libc-wasi/sandboxed-system-primitives/src/posix.c @@ -356,16 +356,20 @@ fd_table_get_entry(struct fd_table *ft, __wasi_fd_t fd, REQUIRES_SHARED(ft->lock) { // Test for file descriptor existence. - if (fd >= ft->size) + if (fd >= ft->size) { return __WASI_EBADF; + } + struct fd_entry *fe = &ft->entries[fd]; - if (fe->object == NULL) + if (fe->object == NULL) { return __WASI_EBADF; + } // Validate rights. if ((~fe->rights_base & rights_base) != 0 - || (~fe->rights_inheriting & rights_inheriting) != 0) + || (~fe->rights_inheriting & rights_inheriting) != 0) { return __WASI_ENOTCAPABLE; + } *ret = fe; return 0; } @@ -426,15 +430,15 @@ fd_table_attach(struct fd_table *ft, __wasi_fd_t fd, struct fd_object *fo, __wasi_rights_t rights_base, __wasi_rights_t rights_inheriting) REQUIRES_EXCLUSIVE(ft->lock) CONSUMES(fo->refcount) { - assert(ft->size > fd && "File descriptor table too small"); + bh_assert(ft->size > fd && "File descriptor table too small"); struct fd_entry *fe = &ft->entries[fd]; - assert(fe->object == NULL - && "Attempted to overwrite an existing descriptor"); + bh_assert(fe->object == NULL + && "Attempted to overwrite an existing descriptor"); fe->object = fo; fe->rights_base = rights_base; fe->rights_inheriting = rights_inheriting; ++ft->used; - assert(ft->size >= ft->used * 2 && "File descriptor too full"); + bh_assert(ft->size >= ft->used * 2 && "File descriptor too full"); } // Detaches a file descriptor from the file descriptor table. @@ -442,12 +446,12 @@ static void fd_table_detach(struct fd_table *ft, __wasi_fd_t fd, struct fd_object **fo) REQUIRES_EXCLUSIVE(ft->lock) PRODUCES((*fo)->refcount) { - assert(ft->size > fd && "File descriptor table too small"); + bh_assert(ft->size > fd && "File descriptor table too small"); struct fd_entry *fe = &ft->entries[fd]; *fo = fe->object; - assert(*fo != NULL && "Attempted to detach nonexistent descriptor"); + bh_assert(*fo != NULL && "Attempted to detach nonexistent descriptor"); fe->object = NULL; - assert(ft->used > 0 && "Reference count mismatch"); + bh_assert(ft->used > 0 && "Reference count mismatch"); --ft->used; } @@ -636,7 +640,7 @@ fd_table_insert_existing(struct fd_table *ft, __wasi_fd_t in, static __wasi_errno_t fd_table_unused(struct fd_table *ft, __wasi_fd_t *out) REQUIRES_SHARED(ft->lock) { - assert(ft->size > ft->used && "File descriptor table has no free slots"); + bh_assert(ft->size > ft->used && "File descriptor table has no free slots"); for (;;) { uintmax_t random_fd = 0; __wasi_errno_t error = random_uniform(ft->size, &random_fd); @@ -1550,7 +1554,8 @@ path_put(struct path_access *pa) UNLOCKS(pa->fd_object->refcount) { if (pa->path_start) wasm_runtime_free(pa->path_start); - if (pa->fd_object->file_handle != pa->fd) + /* Can't use `!=` operator when `os_file_handle` is a struct */ + if (!os_compare_file_handle(pa->fd_object->file_handle, pa->fd)) os_close(pa->fd, false); fd_object_release(NULL, pa->fd_object); } @@ -1891,7 +1896,7 @@ wasmtime_ssp_fd_filestat_get(wasm_exec_env_t exec_env, struct fd_table *curfds, } static void -convert_timestamp(__wasi_timestamp_t in, struct timespec *out) +convert_timestamp(__wasi_timestamp_t in, os_timespec *out) { // Store sub-second remainder. #if defined(__SYSCALL_SLONG_TYPE) @@ -1899,10 +1904,10 @@ convert_timestamp(__wasi_timestamp_t in, struct timespec *out) #else out->tv_nsec = (long)(in % 1000000000); #endif - in /= 1000000000; + __wasi_timestamp_t temp = in / 1000000000; // Clamp to the maximum in case it would overflow our system's time_t. - out->tv_sec = (time_t)in < BH_TIME_T_MAX ? (time_t)in : BH_TIME_T_MAX; + out->tv_sec = (time_t)temp < BH_TIME_T_MAX ? (time_t)temp : BH_TIME_T_MAX; } __wasi_errno_t @@ -2089,7 +2094,7 @@ wasmtime_ssp_poll_oneoff(wasm_exec_env_t exec_env, struct fd_table *curfds, size_t nsubscriptions, size_t *nevents) NO_LOCK_ANALYSIS { -#ifdef BH_PLATFORM_WINDOWS +#if defined(BH_PLATFORM_WINDOWS) return __WASI_ENOSYS; #else // Sleeping. @@ -2101,7 +2106,7 @@ wasmtime_ssp_poll_oneoff(wasm_exec_env_t exec_env, struct fd_table *curfds, #if CONFIG_HAS_CLOCK_NANOSLEEP clockid_t clock_id; if (wasi_clockid_to_clockid(in[0].u.u.clock.clock_id, &clock_id)) { - struct timespec ts; + os_timespec ts; convert_timestamp(in[0].u.u.clock.timeout, &ts); int ret = clock_nanosleep( clock_id, @@ -2128,7 +2133,7 @@ wasmtime_ssp_poll_oneoff(wasm_exec_env_t exec_env, struct fd_table *curfds, else { // Perform relative sleeps on the monotonic clock also using // nanosleep(). This is incorrect, but good enough for now. - struct timespec ts; + os_timespec ts; convert_timestamp(in[0].u.u.clock.timeout, &ts); nanosleep(&ts, NULL); } @@ -2156,7 +2161,7 @@ wasmtime_ssp_poll_oneoff(wasm_exec_env_t exec_env, struct fd_table *curfds, } else { // Relative sleeps can be done using nanosleep(). - struct timespec ts; + os_timespec ts; convert_timestamp(in[0].u.u.clock.timeout, &ts); nanosleep(&ts, NULL); } @@ -2181,7 +2186,7 @@ wasmtime_ssp_poll_oneoff(wasm_exec_env_t exec_env, struct fd_table *curfds, wasm_runtime_malloc((uint32)(nsubscriptions * sizeof(*fos))); if (fos == NULL) return __WASI_ENOMEM; - struct pollfd *pfds = + os_poll_file_handle *pfds = wasm_runtime_malloc((uint32)(nsubscriptions * sizeof(*pfds))); if (pfds == NULL) { wasm_runtime_free(fos); @@ -2205,9 +2210,16 @@ wasmtime_ssp_poll_oneoff(wasm_exec_env_t exec_env, struct fd_table *curfds, fd_object_get_locked(&fos[i], ft, s->u.u.fd_readwrite.fd, __WASI_RIGHT_POLL_FD_READWRITE, 0); if (error == 0) { + +// Temporary workaround (see PR#4377) +#ifdef BH_PLATFORM_ZEPHYR + os_file_handle tfd = fos[i]->file_handle->fd; +#else + os_file_handle tfd = fos[i]->file_handle; +#endif // Proper file descriptor on which we can poll(). - pfds[i] = (struct pollfd){ - .fd = fos[i]->file_handle, + pfds[i] = (os_poll_file_handle){ + .fd = tfd, .events = s->u.type == __WASI_EVENTTYPE_FD_READ ? POLLIN : POLLOUT, @@ -2216,7 +2228,7 @@ wasmtime_ssp_poll_oneoff(wasm_exec_env_t exec_env, struct fd_table *curfds, else { // Invalid file descriptor or rights missing. fos[i] = NULL; - pfds[i] = (struct pollfd){ .fd = -1 }; + pfds[i] = (os_poll_file_handle){ .fd = -1 }; out[(*nevents)++] = (__wasi_event_t){ .userdata = s->userdata, .error = error, @@ -2231,7 +2243,7 @@ wasmtime_ssp_poll_oneoff(wasm_exec_env_t exec_env, struct fd_table *curfds, == 0) { // Relative timeout. fos[i] = NULL; - pfds[i] = (struct pollfd){ .fd = -1 }; + pfds[i] = (os_poll_file_handle){ .fd = -1 }; clock_subscription = s; break; } @@ -2239,7 +2251,7 @@ wasmtime_ssp_poll_oneoff(wasm_exec_env_t exec_env, struct fd_table *curfds, default: // Unsupported event. fos[i] = NULL; - pfds[i] = (struct pollfd){ .fd = -1 }; + pfds[i] = (os_poll_file_handle){ .fd = -1 }; out[(*nevents)++] = (__wasi_event_t){ .userdata = s->userdata, .error = __WASI_ENOSYS, @@ -2283,7 +2295,7 @@ wasmtime_ssp_poll_oneoff(wasm_exec_env_t exec_env, struct fd_table *curfds, __wasi_filesize_t nbytes = 0; if (in[i].u.type == __WASI_EVENTTYPE_FD_READ) { int l; - if (ioctl(fos[i]->file_handle, FIONREAD, &l) == 0) + if (os_ioctl(fos[i]->file_handle, FIONREAD, &l) == 0) nbytes = (__wasi_filesize_t)l; } if ((pfds[i].revents & POLLNVAL) != 0) { @@ -2449,7 +2461,7 @@ wasi_addr_to_string(const __wasi_addr_t *addr, char *buf, size_t buflen) if (addr->kind == IPv4) { const char *format = "%u.%u.%u.%u"; - assert(buflen >= 16); + bh_assert(buflen >= 16); snprintf(buf, buflen, format, addr->addr.ip4.addr.n0, addr->addr.ip4.addr.n1, addr->addr.ip4.addr.n2, @@ -2461,14 +2473,13 @@ wasi_addr_to_string(const __wasi_addr_t *addr, char *buf, size_t buflen) const char *format = "%04x:%04x:%04x:%04x:%04x:%04x:%04x:%04x"; __wasi_addr_ip6_t ipv6 = addr->addr.ip6.addr; - assert(buflen >= 40); + bh_assert(buflen >= 40); snprintf(buf, buflen, format, ipv6.n0, ipv6.n1, ipv6.n2, ipv6.n3, ipv6.h0, ipv6.h1, ipv6.h2, ipv6.h3); return true; } - return false; } @@ -2575,9 +2586,11 @@ wasi_ssp_sock_connect(wasm_exec_env_t exec_env, struct fd_table *curfds, } error = fd_object_get(curfds, &fo, fd, __WASI_RIGHT_SOCK_BIND, 0); - if (error != __WASI_ESUCCESS) + if (error != __WASI_ESUCCESS) { return error; + } + /* Consume __wasi_addr_t */ ret = blocking_op_socket_connect(exec_env, fo->file_handle, buf, addr->kind == IPv4 ? addr->addr.ip4.port : addr->addr.ip6.port); @@ -2726,10 +2739,10 @@ wasi_ssp_sock_open(wasm_exec_env_t exec_env, struct fd_table *curfds, } if (SOCKET_DGRAM == socktype) { - assert(wasi_type == __WASI_FILETYPE_SOCKET_DGRAM); + bh_assert(wasi_type == __WASI_FILETYPE_SOCKET_DGRAM); } else { - assert(wasi_type == __WASI_FILETYPE_SOCKET_STREAM); + bh_assert(wasi_type == __WASI_FILETYPE_SOCKET_STREAM); } // TODO: base rights and inheriting rights ? @@ -2839,7 +2852,7 @@ wasmtime_ssp_sock_recv_from(wasm_exec_env_t exec_env, struct fd_table *curfds, { struct fd_object *fo; __wasi_errno_t error; - bh_sockaddr_t sockaddr; + bh_sockaddr_t sockaddr, *sockaddr_ptr = NULL; int ret; error = fd_object_get(curfds, &fo, sock, __WASI_RIGHT_FD_READ, 0); @@ -2847,14 +2860,26 @@ wasmtime_ssp_sock_recv_from(wasm_exec_env_t exec_env, struct fd_table *curfds, return error; } + // If the source address is not NULL, the caller is requesting the source + // address to be returned if the protocol supports it. If the value is + // NULL, the POSIX standard states that the address is not returned. + if (src_addr != NULL) { + sockaddr_ptr = &sockaddr; + } + + /* Consume bh_sockaddr_t instead of __wasi_addr_t */ ret = blocking_op_socket_recv_from(exec_env, fo->file_handle, buf, buf_len, - 0, &sockaddr); + 0, sockaddr_ptr); fd_object_release(exec_env, fo); if (-1 == ret) { return convert_errno(errno); } - bh_sockaddr_to_wasi_addr(&sockaddr, src_addr); + // If the source address is not NULL, we need to convert the sockaddr + // back to __wasi_addr_t format. + if (src_addr != NULL) { + bh_sockaddr_to_wasi_addr(sockaddr_ptr, src_addr); + } *recv_len = (size_t)ret; return __WASI_ESUCCESS; @@ -2912,6 +2937,7 @@ wasmtime_ssp_sock_send_to(wasm_exec_env_t exec_env, struct fd_table *curfds, wasi_addr_to_bh_sockaddr(dest_addr, &sockaddr); + /* Consume bh_sockaddr instead of __wasi_addr_t */ ret = blocking_op_socket_send_to(exec_env, fo->file_handle, buf, buf_len, 0, &sockaddr); fd_object_release(exec_env, fo); @@ -2943,8 +2969,10 @@ wasmtime_ssp_sock_shutdown(wasm_exec_env_t exec_env, struct fd_table *curfds, __wasi_errno_t wasmtime_ssp_sched_yield(void) { -#ifdef BH_PLATFORM_WINDOWS +#if defined(BH_PLATFORM_WINDOWS) SwitchToThread(); +#elif defined(BH_PLATFORM_ZEPHYR) + k_yield(); #else if (sched_yield() < 0) return convert_errno(errno); diff --git a/core/iwasm/libraries/libc-wasi/sandboxed-system-primitives/src/random.c b/core/iwasm/libraries/libc-wasi/sandboxed-system-primitives/src/random.c index 29c50dd870..665a9de918 100644 --- a/core/iwasm/libraries/libc-wasi/sandboxed-system-primitives/src/random.c +++ b/core/iwasm/libraries/libc-wasi/sandboxed-system-primitives/src/random.c @@ -66,6 +66,20 @@ random_buf(void *buf, size_t len) return ret ? __WASI_EINVAL : __WASI_ESUCCESS; } +#elif defined(BH_PLATFORM_ZEPHYR) +#include +// Maybe having an OS abstraction api would be a good idea +// because every platform is implementing this function. +// we could have a function like `os_random_buf` +// and call `os_random_buf.` in the SSP wrapper `random_buf`. + +__wasi_errno_t +random_buf(void *buf, size_t len) +{ + sys_rand_get(buf, len); + return __WASI_ESUCCESS; +} + #else static int urandom = -1; diff --git a/core/iwasm/libraries/libc-wasi/sandboxed-system-primitives/src/ssp_config.h b/core/iwasm/libraries/libc-wasi/sandboxed-system-primitives/src/ssp_config.h index 8296772131..9eeea99895 100644 --- a/core/iwasm/libraries/libc-wasi/sandboxed-system-primitives/src/ssp_config.h +++ b/core/iwasm/libraries/libc-wasi/sandboxed-system-primitives/src/ssp_config.h @@ -42,7 +42,8 @@ #define CONFIG_HAS_GETRANDOM 0 #endif -#if defined(__CloudABI__) || defined(BH_PLATFORM_FREERTOS) +#if defined(__CloudABI__) || defined(BH_PLATFORM_FREERTOS) \ + || defined(BH_PLATFORM_ZEPHYR) #define CONFIG_HAS_CAP_ENTER 1 #else #define CONFIG_HAS_CAP_ENTER 0 @@ -50,7 +51,7 @@ #if !defined(__APPLE__) && !defined(__FreeBSD__) && !defined(__EMSCRIPTEN__) \ && !defined(ESP_PLATFORM) && !defined(DISABLE_CLOCK_NANOSLEEP) \ - && !defined(BH_PLATFORM_FREERTOS) + && !defined(BH_PLATFORM_FREERTOS) && !defined(BH_PLATFORM_ZEPHYR) #define CONFIG_HAS_CLOCK_NANOSLEEP 1 #else #define CONFIG_HAS_CLOCK_NANOSLEEP 0 @@ -63,7 +64,8 @@ #endif #if !defined(__APPLE__) && !defined(BH_PLATFORM_LINUX_SGX) && !defined(_WIN32) \ - && !defined(__COSMOPOLITAN__) && !defined(BH_PLATFORM_FREERTOS) + && !defined(__COSMOPOLITAN__) && !defined(BH_PLATFORM_FREERTOS) \ + && !defined(BH_PLATFORM_ZEPHYR) #define CONFIG_HAS_PTHREAD_CONDATTR_SETCLOCK 1 #else #define CONFIG_HAS_PTHREAD_CONDATTR_SETCLOCK 0 diff --git a/core/shared/mem-alloc/ems/ems_gc.c b/core/shared/mem-alloc/ems/ems_gc.c index 26e83a975c..e97a07bba3 100644 --- a/core/shared/mem-alloc/ems/ems_gc.c +++ b/core/shared/mem-alloc/ems/ems_gc.c @@ -6,7 +6,9 @@ #include "ems_gc.h" #include "ems_gc_internal.h" +#ifndef GB // Some platforms define already, causing build warnings. #define GB (1 << 30UL) +#endif #define MARK_NODE_OBJ_CNT 256 diff --git a/core/shared/platform/alios/platform_internal.h b/core/shared/platform/alios/platform_internal.h index bdf3d073f3..125aa0b63f 100644 --- a/core/shared/platform/alios/platform_internal.h +++ b/core/shared/platform/alios/platform_internal.h @@ -75,6 +75,9 @@ int isnan(double x); typedef int os_file_handle; typedef void *os_dir_stream; typedef int os_raw_file_handle; +typedef int os_poll_file_handle; +typedef unsigned int os_nfds_t; +typedef int os_timespec; static inline os_file_handle os_get_invalid_handle(void) diff --git a/core/shared/platform/android/platform_internal.h b/core/shared/platform/android/platform_internal.h index 7abf863f81..6f74e3c78a 100644 --- a/core/shared/platform/android/platform_internal.h +++ b/core/shared/platform/android/platform_internal.h @@ -150,6 +150,12 @@ typedef int os_file_handle; typedef DIR *os_dir_stream; typedef int os_raw_file_handle; +/* The below types are used in platform_api_extension.h, + we just define them to make the compiler happy */ +typedef struct pollfd os_poll_file_handle; +typedef nfds_t os_nfds_t; +typedef struct timespec os_timespec; + static inline os_file_handle os_get_invalid_handle(void) { diff --git a/core/shared/platform/common/posix/posix_file.c b/core/shared/platform/common/posix/posix_file.c index d90f38ec5b..a05853f5e4 100644 --- a/core/shared/platform/common/posix/posix_file.c +++ b/core/shared/platform/common/posix/posix_file.c @@ -1039,3 +1039,31 @@ os_invalid_raw_handle(void) { return -1; } + +// Better to define the function here, as Linux-SGX will +// use this file to implement the `_os` functions. +// So we don't need to define them in the Linux-SGX platform. +int +os_ioctl(os_file_handle handle, int request, ...) +{ + int ret = -1; + va_list args; + + va_start(args, request); + ret = ioctl(handle, request, args); + va_end(args); + + return ret; +} + +int +os_poll(os_poll_file_handle *fds, os_nfds_t nfs, int timeout) +{ + return poll(fds, nfs, timeout); +} + +bool +os_compare_file_handle(os_file_handle handle1, os_file_handle handle2) +{ + return handle1 == handle2; +} diff --git a/core/shared/platform/common/posix/posix_socket.c b/core/shared/platform/common/posix/posix_socket.c index 89a13068f2..469b2a50c0 100644 --- a/core/shared/platform/common/posix/posix_socket.c +++ b/core/shared/platform/common/posix/posix_socket.c @@ -1035,4 +1035,4 @@ os_socket_addr_remote(bh_socket_t socket, bh_sockaddr_t *sockaddr) } return sockaddr_to_bh_sockaddr((struct sockaddr *)&addr_storage, sockaddr); -} +} \ No newline at end of file diff --git a/core/shared/platform/cosmopolitan/platform_internal.h b/core/shared/platform/cosmopolitan/platform_internal.h index 5c73ed5a65..10de33fe77 100644 --- a/core/shared/platform/cosmopolitan/platform_internal.h +++ b/core/shared/platform/cosmopolitan/platform_internal.h @@ -67,6 +67,9 @@ typedef sem_t korp_sem; typedef int os_file_handle; typedef DIR *os_dir_stream; typedef int os_raw_file_handle; +typedef struct pollfd os_poll_file_handle; +typedef nfds_t os_nfds_t; +typedef struct timespec os_timespec; static inline os_file_handle os_get_invalid_handle(void) diff --git a/core/shared/platform/darwin/platform_internal.h b/core/shared/platform/darwin/platform_internal.h index 928aad7246..9446866224 100644 --- a/core/shared/platform/darwin/platform_internal.h +++ b/core/shared/platform/darwin/platform_internal.h @@ -112,6 +112,9 @@ os_set_signal_number_for_blocking_op(int signo); typedef int os_file_handle; typedef DIR *os_dir_stream; typedef int os_raw_file_handle; +typedef struct pollfd os_poll_file_handle; +typedef nfds_t os_nfds_t; +typedef struct timespec os_timespec; static inline os_file_handle os_get_invalid_handle(void) diff --git a/core/shared/platform/esp-idf/espidf_file.c b/core/shared/platform/esp-idf/espidf_file.c index 4d78df38a0..04d31cb479 100644 --- a/core/shared/platform/esp-idf/espidf_file.c +++ b/core/shared/platform/esp-idf/espidf_file.c @@ -1039,3 +1039,15 @@ os_invalid_raw_handle(void) { return -1; } + +int +os_ioctl(os_file_handle handle, int request, ...) +{ + return BHT_ERROR; +} + +int +os_poll(os_poll_file_handle *fds, os_nfds_t nfs, int timeout) +{ + return BHT_ERROR; +} diff --git a/core/shared/platform/esp-idf/platform_internal.h b/core/shared/platform/esp-idf/platform_internal.h index 580a06d907..a704bb0fb2 100644 --- a/core/shared/platform/esp-idf/platform_internal.h +++ b/core/shared/platform/esp-idf/platform_internal.h @@ -144,6 +144,12 @@ typedef int os_file_handle; typedef DIR *os_dir_stream; typedef int os_raw_file_handle; +/* The below types are used in platform_api_extension.h, + we just define them to make the compiler happy */ +typedef int os_poll_file_handle; +typedef unsigned int os_nfds_t; +typedef int os_timespec; + static inline os_file_handle os_get_invalid_handle(void) { diff --git a/core/shared/platform/freebsd/platform_internal.h b/core/shared/platform/freebsd/platform_internal.h index 01a6e824fc..8d6160c36e 100644 --- a/core/shared/platform/freebsd/platform_internal.h +++ b/core/shared/platform/freebsd/platform_internal.h @@ -69,6 +69,9 @@ typedef sem_t korp_sem; typedef int os_file_handle; typedef DIR *os_dir_stream; typedef int os_raw_file_handle; +typedef struct pollfd os_poll_file_handle; +typedef nfds_t os_nfds_t; +typedef struct timespec os_timespec; #if WASM_DISABLE_HW_BOUND_CHECK == 0 #if defined(BUILD_TARGET_X86_64) || defined(BUILD_TARGET_AMD_64) \ diff --git a/core/shared/platform/include/platform_api_extension.h b/core/shared/platform/include/platform_api_extension.h index d57d0eac7c..41ec5742bc 100644 --- a/core/shared/platform/include/platform_api_extension.h +++ b/core/shared/platform/include/platform_api_extension.h @@ -1673,4 +1673,24 @@ os_clock_time_get(__wasi_clockid_t clock_id, __wasi_timestamp_t precision, } #endif +/* Experimental */ + +/* Used in posix.c around L2259 and expect the return code + * of ioctl() directly. + */ +int +os_ioctl(os_file_handle handle, int request, ...); + +/* Higher level API: + * __wasi_errno_t + * blocking_op_poll(wasm_exec_env_t exec_env, os_poll_file_handle *pfds, + * os_nfds_t nfds, int timeout_ms, int *retp) + * Already format the errno and expect the return code of poll() directly. + */ +int +os_poll(os_poll_file_handle *pfds, os_nfds_t nfs, int timeout); + +bool +os_compare_file_handle(os_file_handle handle1, os_file_handle handle2); + #endif /* #ifndef PLATFORM_API_EXTENSION_H */ diff --git a/core/shared/platform/include/platform_wasi_types.h b/core/shared/platform/include/platform_wasi_types.h index ac1a95ea1e..56ea7514ed 100644 --- a/core/shared/platform/include/platform_wasi_types.h +++ b/core/shared/platform/include/platform_wasi_types.h @@ -173,7 +173,7 @@ typedef uint8_t __wasi_eventtype_t; typedef uint32_t __wasi_exitcode_t; -typedef uint32_t __wasi_fd_t; +typedef int32_t __wasi_fd_t; typedef uint16_t __wasi_fdflags_t; #define __WASI_FDFLAG_APPEND (0x0001) @@ -539,7 +539,10 @@ typedef enum { typedef uint16_t __wasi_ip_port_t; -typedef enum { IPv4 = 0, IPv6 } __wasi_addr_type_t; +/* Ensure that __wasi_addr_type_t has a size of 4 byte (I32). + However, it will not have the type safety of enum. */ +typedef uint32_t __wasi_addr_type_t; +enum { IPv4 = 0, IPv6 }; /* n0.n1.n2.n3 */ typedef struct __wasi_addr_ip4_t { diff --git a/core/shared/platform/linux-sgx/platform_internal.h b/core/shared/platform/linux-sgx/platform_internal.h index 66960ad282..62f9a4482f 100644 --- a/core/shared/platform/linux-sgx/platform_internal.h +++ b/core/shared/platform/linux-sgx/platform_internal.h @@ -73,6 +73,16 @@ typedef int os_file_handle; typedef DIR *os_dir_stream; typedef int os_raw_file_handle; +struct _pollfd { + int fd; + short events; + short revents; +}; + +typedef struct _pollfd os_poll_file_handle; +typedef unsigned long os_nfds_t; +typedef struct timespec os_timespec; + static inline os_file_handle os_get_invalid_handle(void) { diff --git a/core/shared/platform/linux/platform_internal.h b/core/shared/platform/linux/platform_internal.h index 865180273e..b17abd2e48 100644 --- a/core/shared/platform/linux/platform_internal.h +++ b/core/shared/platform/linux/platform_internal.h @@ -126,6 +126,10 @@ typedef int os_file_handle; typedef DIR *os_dir_stream; typedef int os_raw_file_handle; +typedef struct pollfd os_poll_file_handle; +typedef nfds_t os_nfds_t; +typedef struct timespec os_timespec; + static inline os_file_handle os_get_invalid_handle(void) { diff --git a/core/shared/platform/nuttx/platform_internal.h b/core/shared/platform/nuttx/platform_internal.h index fef2122da8..d746dda004 100644 --- a/core/shared/platform/nuttx/platform_internal.h +++ b/core/shared/platform/nuttx/platform_internal.h @@ -132,9 +132,14 @@ fdopendir(int fd); void os_set_signal_number_for_blocking_op(int signo); +/* The below types are used in platform_api_extension.h, + we just define them to make the compiler happy */ typedef int os_file_handle; typedef DIR *os_dir_stream; typedef int os_raw_file_handle; +typedef struct pollfd os_poll_file_handle; +typedef nfds_t os_nfds_t; +typedef struct timespec os_timespec; static inline os_file_handle os_get_invalid_handle(void) diff --git a/core/shared/platform/riot/platform_internal.h b/core/shared/platform/riot/platform_internal.h index 11f2ba0a72..fd9e40da71 100644 --- a/core/shared/platform/riot/platform_internal.h +++ b/core/shared/platform/riot/platform_internal.h @@ -63,6 +63,9 @@ typedef struct korp_cond { typedef int os_file_handle; typedef void *os_dir_stream; typedef int os_raw_file_handle; +typedef int os_poll_file_handle; +typedef unsigned int os_nfds_t; +typedef int os_timespec; #if WA_MATH /* clang-format off */ diff --git a/core/shared/platform/rt-thread/platform_internal.h b/core/shared/platform/rt-thread/platform_internal.h index b9b8c78c8f..b8e64b6c75 100644 --- a/core/shared/platform/rt-thread/platform_internal.h +++ b/core/shared/platform/rt-thread/platform_internal.h @@ -122,6 +122,9 @@ typedef rt_int64_t int64_t; typedef int os_file_handle; typedef void *os_dir_stream; typedef int os_raw_file_handle; +typedef int os_poll_file_handle; +typedef unsigned int os_nfds_t; +typedef int os_timespec; static inline os_file_handle os_get_invalid_handle(void) diff --git a/core/shared/platform/vxworks/platform_internal.h b/core/shared/platform/vxworks/platform_internal.h index 6a6b00f4be..bf9d2885e0 100644 --- a/core/shared/platform/vxworks/platform_internal.h +++ b/core/shared/platform/vxworks/platform_internal.h @@ -65,6 +65,12 @@ typedef int os_file_handle; typedef DIR *os_dir_stream; typedef int os_raw_file_handle; +/* The below types are used in platform_api_extension.h, + we just define them to make the compiler happy */ +typedef struct pollfd os_poll_file_handle; +typedef nfds_t os_nfds_t; +typedef timespec os_timespec; + #if WASM_DISABLE_HW_BOUND_CHECK == 0 #if defined(BUILD_TARGET_X86_64) || defined(BUILD_TARGET_AMD_64) \ || defined(BUILD_TARGET_AARCH64) diff --git a/core/shared/platform/windows/platform_internal.h b/core/shared/platform/windows/platform_internal.h index 8ff541016a..f77e1ad5a1 100644 --- a/core/shared/platform/windows/platform_internal.h +++ b/core/shared/platform/windows/platform_internal.h @@ -186,6 +186,12 @@ typedef uint32_t os_raw_file_handle; #define bh_socket_t windows_handle * +/* The below types are used in platform_api_extension.h, + we just define them to make the compiler happy */ +typedef int os_poll_file_handle; +typedef unsigned int os_nfds_t; +typedef struct timespec os_timespec; + // UWP apps do not have stdout/stderr handles so provide a default // implementation of vprintf on debug builds so output from WASI libc is sent to // the debugger and not lost completely. diff --git a/core/shared/platform/windows/win_file.c b/core/shared/platform/windows/win_file.c index 55ea77ac76..7cfda4cc3a 100644 --- a/core/shared/platform/windows/win_file.c +++ b/core/shared/platform/windows/win_file.c @@ -1816,3 +1816,39 @@ os_invalid_raw_handle(void) { return INVALID_HANDLE_VALUE; } + +bool +os_compare_file_handle(os_file_handle handle1, os_file_handle handle2) +{ + if (handle1->type != handle2->type) { + return false; + } + + if (handle1->fdflags != handle2->fdflags + || handle1->access_mode != handle2->access_mode) { + return false; + } + + switch (handle1->type) { + case windows_handle_type_file: + return handle1->raw.handle == handle2->raw.handle; + case windows_handle_type_socket: + return handle1->raw.socket == handle2->raw.socket; + default: + // Unknown handle type + return false; + } +} + +int +os_ioctl(os_file_handle handle, int request, ...) +{ + return BHT_ERROR; +} + +// Should not be called because locked by ifdef. +int +os_poll(os_poll_file_handle *fds, os_nfds_t nfs, int timeout) +{ + return BHT_ERROR; +} diff --git a/core/shared/platform/zephyr/platform_internal.h b/core/shared/platform/zephyr/platform_internal.h index 5bc9ca986c..7e59faa746 100644 --- a/core/shared/platform/zephyr/platform_internal.h +++ b/core/shared/platform/zephyr/platform_internal.h @@ -50,6 +50,7 @@ #include #include #include +#include #endif /* end of KERNEL_VERSION_NUMBER < 0x030200 */ #ifdef CONFIG_USERSPACE @@ -79,29 +80,51 @@ #define BH_PLATFORM_ZEPHYR #endif -// Synchronization primitives for usermode +#include + +#ifndef PATH_MAX +#define PATH_MAX 256 +#endif + +#ifndef STDIN_FILENO +#define STDIN_FILENO 0 +#endif + +#ifndef STDOUT_FILENO +#define STDOUT_FILENO 1 +#endif + +#ifndef STDERR_FILENO +#define STDERR_FILENO 2 +#endif + +/* Synchronization primitives for usermode. + * The macros are prefixed with 'z' because when building + * with WAMR_BUILD_LIBC_WASI the same functions are defined, + * and used in the sandboxed-system-primitives (see locking.h) + */ #ifdef CONFIG_USERSPACE -#define mutex_t struct sys_mutex -#define mutex_init(mtx) sys_mutex_init(mtx) -#define mutex_lock(mtx, timeout) sys_mutex_lock(mtx, timeout) -#define mutex_unlock(mtx) sys_mutex_unlock(mtx) - -#define sem_t struct sys_sem -#define sem_init(sem, init_count, limit) sys_sem_init(sem, init_count, limit) -#define sem_give(sem) sys_sem_give(sem) -#define sem_take(sem, timeout) sys_sem_take(sem, timeout) -#define sem_count_get(sem) sys_sem_count_get(sem) +#define zmutex_t struct sys_mutex +#define zmutex_init(mtx) sys_mutex_init(mtx) +#define zmutex_lock(mtx, timeout) sys_mutex_lock(mtx, timeout) +#define zmutex_unlock(mtx) sys_mutex_unlock(mtx) + +#define zsem_t struct sys_sem +#define zsem_init(sem, init_count, limit) sys_sem_init(sem, init_count, limit) +#define zsem_give(sem) sys_sem_give(sem) +#define zsem_take(sem, timeout) sys_sem_take(sem, timeout) +#define zsem_count_get(sem) sys_sem_count_get(sem) #else /* else of CONFIG_USERSPACE */ -#define mutex_t struct k_mutex -#define mutex_init(mtx) k_mutex_init(mtx) -#define mutex_lock(mtx, timeout) k_mutex_lock(mtx, timeout) -#define mutex_unlock(mtx) k_mutex_unlock(mtx) - -#define sem_t struct k_sem -#define sem_init(sem, init_count, limit) k_sem_init(sem, init_count, limit) -#define sem_give(sem) k_sem_give(sem) -#define sem_take(sem, timeout) k_sem_take(sem, timeout) -#define sem_count_get(sem) k_sem_count_get(sem) +#define zmutex_t struct k_mutex +#define zmutex_init(mtx) k_mutex_init(mtx) +#define zmutex_lock(mtx, timeout) k_mutex_lock(mtx, timeout) +#define zmutex_unlock(mtx) k_mutex_unlock(mtx) + +#define zsem_t struct k_sem +#define zsem_init(sem, init_count, limit) k_sem_init(sem, init_count, limit) +#define zsem_give(sem) k_sem_give(sem) +#define zsem_take(sem, timeout) k_sem_take(sem, timeout) +#define zsem_count_get(sem) k_sem_count_get(sem) #endif /* end of CONFIG_USERSPACE */ #define BH_APPLET_PRESERVED_STACK_SIZE (2 * BH_KB) @@ -111,22 +134,32 @@ typedef struct k_thread korp_thread; typedef korp_thread *korp_tid; -typedef mutex_t korp_mutex; +typedef zmutex_t korp_mutex; typedef unsigned int korp_sem; /* korp_rwlock is used in platform_api_extension.h, we just define the type to make the compiler happy */ -typedef struct { - int dummy; -} korp_rwlock; - struct os_thread_wait_node; typedef struct os_thread_wait_node *os_thread_wait_list; typedef struct korp_cond { - mutex_t wait_list_lock; + zmutex_t wait_list_lock; os_thread_wait_list thread_wait_list; } korp_cond; +typedef struct { + struct k_mutex mtx; // Mutex for exclusive access + struct k_sem sem; // Semaphore for shared access + int read_count; // Number of readers +} korp_rwlock; + +// TODO: Conform to Zephyr POSIX definition of rwlock: +// struct posix_rwlock { +// struct k_sem rd_sem; +// struct k_sem wr_sem; +// struct k_sem reader_active; /* blocks WR till reader has acquired lock */ +// k_tid_t wr_owner; +// }; + #ifndef Z_TIMEOUT_MS #define Z_TIMEOUT_MS(ms) ms #endif @@ -204,14 +237,68 @@ set_exec_mem_alloc_func(exec_mem_alloc_func_t alloc_func, /* The below types are used in platform_api_extension.h, we just define them to make the compiler happy */ -typedef int os_file_handle; -typedef void *os_dir_stream; +typedef int os_dir_stream; typedef int os_raw_file_handle; +#define OS_DIR_STREAM_INVALID 0 + +// handle for file system descriptor +typedef struct zephyr_fs_desc { + char *path; + union { + struct fs_file_t file; + struct fs_dir_t dir; + }; + bool is_dir; + bool used; + uint32_t dir_index; // DSK: supprt for rewind and seek +} zephyr_fs_desc; + +// definition of zephyr_handle +typedef struct zephyr_handle { + int fd; + bool is_sock; +} zephyr_handle; + +typedef struct zephyr_handle *os_file_handle; +#define bh_socket_t zephyr_handle * + +typedef struct zsock_pollfd os_poll_file_handle; +typedef unsigned int os_nfds_t; + +// Some of these definitions will throw warning for macros +// redefinition if CONFIG_POSIX_API=y, but it's fine. +// Warning: the CONFIG_POSIX_API will surely be deprecated and +// split into more macros, so we may use some ifdefs to avoid +// the warning in the future. +#define POLLIN ZSOCK_POLLIN +#define POLLPRI ZSOCK_POLLPRI +#define POLLOUT ZSOCK_POLLOUT +#define POLLERR ZSOCK_POLLERR +#define POLLHUP ZSOCK_POLLHUP +#define POLLNVAL ZSOCK_POLLNVAL + +#define FIONREAD ZFD_IOCTL_FIONREAD + +typedef struct timespec os_timespec; + +#ifndef CLOCK_REALTIME +#define CLOCK_REALTIME 1 +#endif + +#define CLOCK_MONOTONIC 4 + +static inline int +os_sched_yield(void) +{ + k_yield(); + return 0; +} + static inline os_file_handle os_get_invalid_handle(void) { - return -1; + return NULL; } static inline int diff --git a/core/shared/platform/zephyr/shared_platform.cmake b/core/shared/platform/zephyr/shared_platform.cmake index dfd45a4064..f424b97204 100644 --- a/core/shared/platform/zephyr/shared_platform.cmake +++ b/core/shared/platform/zephyr/shared_platform.cmake @@ -8,11 +8,20 @@ add_definitions(-DBH_PLATFORM_ZEPHYR) include_directories(${PLATFORM_SHARED_DIR}) include_directories(${PLATFORM_SHARED_DIR}/../include) +file (GLOB_RECURSE source_all ${PLATFORM_SHARED_DIR}/*.c) + if(${CONFIG_MINIMAL_LIBC}) include (${CMAKE_CURRENT_LIST_DIR}/../common/math/platform_api_math.cmake) + set (source_all ${source_all} ${PLATFORM_COMMON_MATH_SOURCE}) endif() -file (GLOB_RECURSE source_all ${PLATFORM_SHARED_DIR}/*.c) - -set (PLATFORM_SHARED_SOURCE ${source_all} ${PLATFORM_COMMON_MATH_SOURCE}) +if (NOT WAMR_BUILD_LIBC_WASI EQUAL 1) + list(REMOVE_ITEM source_all ${PLATFORM_SHARED_DIR}/zephyr_socket.c) + list(REMOVE_ITEM source_all ${PLATFORM_SHARED_DIR}/zephyr_file.c) + list(REMOVE_ITEM source_all ${PLATFORM_SHARED_DIR}/zephyr_clock.c) +else() + include (${CMAKE_CURRENT_LIST_DIR}/../common/libc-util/platform_common_libc_util.cmake) + set(source_all ${source_all} ${PLATFORM_COMMON_LIBC_UTIL_SOURCE}) +endif () +set (PLATFORM_SHARED_SOURCE ${source_all}) diff --git a/core/shared/platform/zephyr/zephyr_clock.c b/core/shared/platform/zephyr/zephyr_clock.c new file mode 100644 index 0000000000..f8a8ab60ad --- /dev/null +++ b/core/shared/platform/zephyr/zephyr_clock.c @@ -0,0 +1,66 @@ +/* + * Copyright (C) 2024 Grenoble INP - ESISAR. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception + */ + +#include "platform_api_extension.h" +#include "platform_api_vmcore.h" +#include "libc_errno.h" + +#include + +/* Notes: + * We are using the same implementation for __WASI_CLOCK_REALTIME and + * __WASI_CLOCK_MONOTONIC, because it is a practical solution when there + * is no RTC or external time source available. + * The implementation is based on the Zephyr `k_cycle_get_32()` function or + * the 64bits variant if available. + * We could have used `k_uptime_get()` instead, but it is not as precise, + * it has a millisecond resolution or depend on CONFIG_SYS_CLOCK_TICKS_PER_SEC. + * Feel free to change the implementation if you have a better solution. + * May look at + * https://github.com/zephyrproject-rtos/zephyr/blob/main/lib/posix/options/clock.c + * for reference. + */ + +#define NANOSECONDS_PER_SECOND 1000000000ULL + +__wasi_errno_t +os_clock_res_get(__wasi_clockid_t clock_id, __wasi_timestamp_t *resolution) +{ + switch (clock_id) { + case __WASI_CLOCK_PROCESS_CPUTIME_ID: + case __WASI_CLOCK_THREAD_CPUTIME_ID: + return __WASI_ENOTSUP; + case __WASI_CLOCK_REALTIME: + case __WASI_CLOCK_MONOTONIC: + *resolution = + NANOSECONDS_PER_SECOND / CONFIG_SYS_CLOCK_HW_CYCLES_PER_SEC; + return __WASI_ESUCCESS; + default: + return __WASI_EINVAL; + } +} + +__wasi_errno_t +os_clock_time_get(__wasi_clockid_t clock_id, __wasi_timestamp_t precision, + __wasi_timestamp_t *time) +{ + (void)precision; + + switch (clock_id) { + case __WASI_CLOCK_PROCESS_CPUTIME_ID: + case __WASI_CLOCK_THREAD_CPUTIME_ID: + return __WASI_ENOTSUP; + case __WASI_CLOCK_REALTIME: + case __WASI_CLOCK_MONOTONIC: +#ifdef CONFIG_TIMER_HAS_64BIT_CYCLE_COUNTER + *time = k_cycle_get_64(); +#else + *time = k_cycle_get_32(); +#endif + return __WASI_ESUCCESS; + default: + return __WASI_EINVAL; + } +} \ No newline at end of file diff --git a/core/shared/platform/zephyr/zephyr_file.c b/core/shared/platform/zephyr/zephyr_file.c new file mode 100644 index 0000000000..1f48bc010c --- /dev/null +++ b/core/shared/platform/zephyr/zephyr_file.c @@ -0,0 +1,1198 @@ +/* + * Copyright (C) 2024 Grenoble INP - ESISAR. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception + */ + +#include "platform_api_vmcore.h" +#include "platform_api_extension.h" +#include "libc_errno.h" + +#include +#include + +#include +#include +#include +#include + +/* Notes: + * This is the implementation of a POSIX-like file system interface for Zephyr. + * To manage our file descriptors, we created a struct `zephyr_fs_desc` that + * represent a zephyr file descriptor and hold useful informations. + * We also created a file descriptor table to keep track of all the file + * descriptors. + * + * To pass the file descriptor reference to the higher level abstraction, we + * pass the index of the fd table to an `os_file_handle` struct. + * Then in the WASI implementation layer we can retrieve the file descriptor + * reference. + * + * We also fake the stdin, stdout and stderr file descriptors. + * We do not handle write on stdin and read on stdin, stdout and stderr. + */ + +// No OS API wrapper (Zephyr): +// file: +// off_t fs_tell(struct fs_file_t *zfp) +// file system: +// int fs_mount(struct fs_mount_t *mp) +// int fs_unmount(struct fs_mount_t *mp +// int fs_readmount(int *index, const char **name) +// int fs_statvfs(const char *path, struct fs_statvfs *stat) +// int fs_mkfs(int fs_type, uintptr_t dev_id, void *cfg, int flags) +// int fs_register(int type, const struct fs_file_system_t *fs) +// int fs_unregister(int type, const struct fs_file_system_t *fs) + +// We will take the maximum number of open files +// from the Zephyr POSIX configuration +#define CONFIG_WASI_MAX_OPEN_FILES CONFIG_ZVFS_OPEN_MAX + +static inline bool +os_is_virtual_fd(int fd) +{ + switch (fd) { + case STDIN_FILENO: + case STDOUT_FILENO: + case STDERR_FILENO: + return true; + default: + return false; + }; +} + +// Macro to retrieve a file system descriptor and check it's validity. +// fd's 0-2 are reserved for standard streams, hence the by-3 offsets. +#define GET_FILE_SYSTEM_DESCRIPTOR(fd, ptr) \ + do { \ + if (os_is_virtual_fd(fd)) { \ + ptr = NULL; \ + break; \ + } \ + if (fd < 3 || fd >= CONFIG_WASI_MAX_OPEN_FILES + 3) { \ + return __WASI_EBADF; \ + } \ + k_mutex_lock(&desc_array_mutex, K_FOREVER); \ + ptr = &desc_array[(int)fd - 3]; \ + if (!ptr->used) { \ + k_mutex_unlock(&desc_array_mutex); \ + return __WASI_EBADF; \ + } \ + k_mutex_unlock(&desc_array_mutex); \ + } while (0) + +// Array to keep track of file system descriptors. +static struct zephyr_fs_desc desc_array[CONFIG_WASI_MAX_OPEN_FILES]; + +// mutex to protect the file descriptor array +K_MUTEX_DEFINE(desc_array_mutex); + +static char prestat_dir[MAX_FILE_NAME + 1]; + +bool +build_absolute_path(char *abs_path, size_t abs_path_len, const char *path) +{ + if (!path) { + abs_path[0] = '\0'; + return false; + } + + size_t len1 = strlen(prestat_dir); + size_t len2 = strlen(path); + + if (len1 + 1 + len2 + 1 > abs_path_len) { + abs_path[0] = '\0'; // Empty string on error + return false; // Truncation would occur + } + + snprintf(abs_path, abs_path_len, "%s/%s", prestat_dir, path); + return true; +} + +static struct zephyr_fs_desc * +zephyr_fs_alloc_obj(bool is_dir, const char *path, int *index) +{ + struct zephyr_fs_desc *ptr = NULL; + *index = -1; // give a default value to index in case table is full + + k_mutex_lock(&desc_array_mutex, K_FOREVER); + for (int i = 0; i < CONFIG_WASI_MAX_OPEN_FILES; i++) { + if (desc_array[i].used == false) { + ptr = &desc_array[i]; + ptr->used = true; + ptr->is_dir = is_dir; + ptr->path = bh_strdup(path); + ptr->dir_index = 0; + if (ptr->path == NULL) { + ptr->used = false; + k_mutex_unlock(&desc_array_mutex); + return NULL; + } + *index = i + 3; + break; + } + } + + k_mutex_unlock(&desc_array_mutex); + + if (ptr == NULL) { + printk("Error: all file descriptor slots are in use (max = %d)\n", + CONFIG_WASI_MAX_OPEN_FILES); + } + + return ptr; +} + +static inline void +zephyr_fs_free_obj(struct zephyr_fs_desc *ptr) +{ + BH_FREE(ptr->path); + ptr->path = NULL; + ptr->used = false; +} + +/* /!\ Needed for socket to work */ +__wasi_errno_t +os_fstat(os_file_handle handle, struct __wasi_filestat_t *buf) +{ + struct zephyr_fs_desc *ptr = NULL; + int socktype, rc; + + if (!handle->is_sock) { + + if (os_is_virtual_fd(handle->fd)) { + buf->st_filetype = __WASI_FILETYPE_CHARACTER_DEVICE; + buf->st_size = 0; + buf->st_atim = 0; + buf->st_mtim = 0; + buf->st_ctim = 0; + return __WASI_ESUCCESS; + } + + GET_FILE_SYSTEM_DESCRIPTOR(handle->fd, ptr); + + // Get file information using Zephyr's fs_stat function + struct fs_dirent entry; + rc = fs_stat(ptr->path, &entry); + if (rc < 0) { + return convert_errno(-rc); + } + + // Fill in the __wasi_filestat_t structure + buf->st_dev = 0; // Zephyr's fs_stat doesn't provide a device ID + buf->st_ino = 0; // Zephyr's fs_stat doesn't provide an inode number + buf->st_filetype = entry.type == FS_DIR_ENTRY_DIR + ? __WASI_FILETYPE_DIRECTORY + : __WASI_FILETYPE_REGULAR_FILE; + buf->st_nlink = 1; // Zephyr's fs_stat doesn't provide a link count + buf->st_size = entry.size; + buf->st_atim = 0; // Zephyr's fs_stat doesn't provide timestamps + buf->st_mtim = 0; + buf->st_ctim = 0; + + return __WASI_ESUCCESS; + + // return os_fstatat(handle, ptr->path, buf, 0); + } + else { + // socklen_t socktypelen = sizeof(socktype); + // rc = zsock_getsockopt(handle->fd, SOL_SOCKET, SO_TYPE, &socktype, + // &socktypelen); Using `zsock_getsockopt` will add a dependency on the + // network stack + // TODO: may add a type to the `zephyr_handle`. + rc = 1; + socktype = SOCK_STREAM; + if (rc < 0) { + return convert_errno(-rc); + } + + switch (socktype) { + case SOCK_DGRAM: + buf->st_filetype = __WASI_FILETYPE_SOCKET_DGRAM; + break; + case SOCK_STREAM: + buf->st_filetype = __WASI_FILETYPE_SOCKET_STREAM; + break; + default: + buf->st_filetype = __WASI_FILETYPE_UNKNOWN; + break; + } + buf->st_size = 0; + buf->st_atim = 0; + buf->st_mtim = 0; + buf->st_ctim = 0; + return __WASI_ESUCCESS; + } +} + +__wasi_errno_t +os_fstatat(os_file_handle handle, const char *path, + struct __wasi_filestat_t *buf, __wasi_lookupflags_t lookup_flags) +{ + struct fs_dirent entry; + int rc; + + if (handle->fd < 0) { + return __WASI_EBADF; + } + + char abs_path[MAX_FILE_NAME + 1]; + + if (handle == NULL) { + return __WASI_EINVAL; // Or another appropriate error code + } + + if (!build_absolute_path(abs_path, sizeof(abs_path), path)) { + return __WASI_ENOMEM; + } + + // Get file information using Zephyr's fs_stat function + rc = fs_stat(abs_path, &entry); + if (rc < 0) { + return convert_errno(-rc); + } + + // Fill in the __wasi_filestat_t structure + buf->st_dev = 0; // Zephyr's fs_stat doesn't provide a device ID + // DSK: setting this to 0, in addition to d_ino = 1 causes failures with + // readdir() So, here's a hack to to avoid this. + buf->st_ino = 1; // Zephyr's fs_stat doesn't provide an inode number. + buf->st_filetype = entry.type == FS_DIR_ENTRY_DIR + ? __WASI_FILETYPE_DIRECTORY + : __WASI_FILETYPE_REGULAR_FILE; + buf->st_nlink = 1; // Zephyr's fs_stat doesn't provide a link count + buf->st_size = entry.size; + buf->st_atim = 0; // Zephyr's fs_stat doesn't provide timestamps + buf->st_mtim = 0; + buf->st_ctim = 0; + + return __WASI_ESUCCESS; +} + +__wasi_errno_t +os_file_get_fdflags(os_file_handle handle, __wasi_fdflags_t *flags) +{ + struct zephyr_fs_desc *ptr = NULL; + + if (os_is_virtual_fd(handle->fd)) { + *flags = 0; + return __WASI_ESUCCESS; + } + + GET_FILE_SYSTEM_DESCRIPTOR(handle->fd, ptr); + + if ((ptr->file.flags & FS_O_APPEND) != 0) { + *flags |= __WASI_FDFLAG_APPEND; + } + /* Others flags: + * - __WASI_FDFLAG_DSYNC + * - __WASI_FDFLAG_RSYNC + * - __WASI_FDFLAG_SYNC + * - __WASI_FDFLAG_NONBLOCK + * Have no equivalent in Zephyr. + */ + return __WASI_ESUCCESS; +} + +__wasi_errno_t +os_file_set_fdflags(os_file_handle handle, __wasi_fdflags_t flags) +{ + if (os_is_virtual_fd(handle->fd)) { + return __WASI_ESUCCESS; + } + + struct zephyr_fs_desc *ptr = NULL; + + GET_FILE_SYSTEM_DESCRIPTOR(handle->fd, ptr); + + if ((flags & __WASI_FDFLAG_APPEND) != 0) { + ptr->file.flags |= FS_O_APPEND; + } + /* Same as above */ + return __WASI_ESUCCESS; +} + +__wasi_errno_t +os_fdatasync(os_file_handle handle) +{ + return os_fsync(handle); +} + +__wasi_errno_t +os_fsync(os_file_handle handle) +{ + if (os_is_virtual_fd(handle->fd)) { + return __WASI_ESUCCESS; + } + + struct zephyr_fs_desc *ptr = NULL; + int rc = 0; + + GET_FILE_SYSTEM_DESCRIPTOR(handle->fd, ptr); + + if (ptr->is_dir) { + return __WASI_EISDIR; + } + + rc = fs_sync(&ptr->file); + if (rc < 0) { + return convert_errno(-rc); + } + + return __WASI_ESUCCESS; +} + +__wasi_errno_t +os_open_preopendir(const char *path, os_file_handle *out) +{ + int rc, index; + struct zephyr_fs_desc *ptr; + + *out = BH_MALLOC(sizeof(struct zephyr_handle)); + if (*out == NULL) { + return __WASI_ENOMEM; + } + + ptr = zephyr_fs_alloc_obj(true, path, &index); + if (ptr == NULL) { + BH_FREE(*out); + return __WASI_EMFILE; + } + + fs_dir_t_init(&ptr->dir); + + rc = fs_opendir(&ptr->dir, path); + if (rc < 0) { + zephyr_fs_free_obj(ptr); + BH_FREE(*out); + return convert_errno(-rc); + } + + (*out)->fd = index; + (*out)->is_sock = false; + + strncpy(prestat_dir, path, MAX_FILE_NAME + 1); + prestat_dir[MAX_FILE_NAME] = '\0'; + + return __WASI_ESUCCESS; +} + +static int +wasi_flags_to_zephyr(__wasi_oflags_t oflags, __wasi_fdflags_t fd_flags, + __wasi_lookupflags_t lookup_flags, + wasi_libc_file_access_mode access_mode) +{ + int mode = 0; + + // Convert open flags. + if ((oflags & __WASI_O_CREAT) != 0) { + mode |= FS_O_CREATE; + } + if (((oflags & __WASI_O_EXCL) != 0) || ((oflags & __WASI_O_TRUNC) != 0) + || ((oflags & __WASI_O_DIRECTORY) != 0)) { + /* Zephyr is not POSIX no equivalent for these flags */ + /* __WASI_O_DIRECTORY: Open shouldn't handle directories */ + // TODO: log warning + } + + // Convert file descriptor flags. + if ((fd_flags & __WASI_FDFLAG_APPEND) != 0) { + mode |= FS_O_APPEND; + } + if (((fd_flags & __WASI_FDFLAG_DSYNC) != 0) + || ((fd_flags & __WASI_FDFLAG_RSYNC) != 0) + || ((fd_flags & __WASI_FDFLAG_SYNC) != 0) + || ((fd_flags & __WASI_FDFLAG_NONBLOCK) != 0)) { + /* Zephyr is not POSIX no equivalent for these flags */ + // TODO: log warning + } + + // Convert lookup flag. + if ((lookup_flags & __WASI_LOOKUP_SYMLINK_FOLLOW) == 0) { + /* Zephyr is not POSIX no equivalent for these flags */ + // TODO: log warning + return __WASI_ENOTSUP; + } + + // Convert access mode. + switch (access_mode) { + case WASI_LIBC_ACCESS_MODE_READ_WRITE: + mode |= FS_O_RDWR; + break; + case WASI_LIBC_ACCESS_MODE_READ_ONLY: + mode |= FS_O_READ; + break; + case WASI_LIBC_ACCESS_MODE_WRITE_ONLY: + mode |= FS_O_WRITE; + break; + default: + // TODO: log warning + break; + } + return mode; +} + +__wasi_errno_t +os_openat(os_file_handle handle, const char *path, __wasi_oflags_t oflags, + __wasi_fdflags_t fd_flags, __wasi_lookupflags_t lookup_flags, + wasi_libc_file_access_mode access_mode, os_file_handle *out) +{ + /* + * `handle` will be unused because zephyr doesn't expose an openat + * function and don't seem to have the concept of relative path. + * We fill `out` with a new file descriptor. + */ + int rc, index; + struct zephyr_fs_desc *ptr = NULL; + char abs_path[MAX_FILE_NAME + 1]; + + *out = BH_MALLOC(sizeof(struct zephyr_handle)); + if (*out == NULL) { + return __WASI_ENOMEM; + } + + if (!build_absolute_path(abs_path, sizeof(abs_path), path)) { + return __WASI_ENOMEM; + } + + // Treat directories as a special case + bool is_dir = oflags & __WASI_O_DIRECTORY; + + ptr = zephyr_fs_alloc_obj(is_dir, abs_path, &index); + if (!ptr && (index < 0)) { + BH_FREE(*out); + return __WASI_EMFILE; + } + + if (is_dir) { + fs_dir_t_init(&ptr->dir); + // fs_opendir() is called in libc later - don't call here + } + else { + // Is a file + int zmode = + wasi_flags_to_zephyr(oflags, fd_flags, lookup_flags, access_mode); + fs_file_t_init(&ptr->file); + rc = fs_open(&ptr->file, abs_path, zmode); + + if (rc < 0) { + zephyr_fs_free_obj(ptr); + BH_FREE(*out); + return convert_errno(-rc); + } + } + + (*out)->fd = index; + (*out)->is_sock = false; + + return __WASI_ESUCCESS; +} + +__wasi_errno_t +os_file_get_access_mode(os_file_handle handle, + wasi_libc_file_access_mode *access_mode) +{ + + if (handle->fd == STDIN_FILENO) { + *access_mode = WASI_LIBC_ACCESS_MODE_READ_ONLY; + return __WASI_ESUCCESS; + } + else if (handle->fd == STDOUT_FILENO || handle->fd == STDERR_FILENO) { + *access_mode = WASI_LIBC_ACCESS_MODE_WRITE_ONLY; + return __WASI_ESUCCESS; + } + + struct zephyr_fs_desc *ptr = NULL; + + if (handle->is_sock) { + // for socket we can use the following code + // TODO: Need to determine better logic + *access_mode = WASI_LIBC_ACCESS_MODE_READ_WRITE; + return __WASI_ESUCCESS; + } + + GET_FILE_SYSTEM_DESCRIPTOR(handle->fd, ptr); + + if (ptr->is_dir) { + // DSK: is this actually the correct mode for a dir? + *access_mode = WASI_LIBC_ACCESS_MODE_READ_WRITE; + return __WASI_ESUCCESS; + } + + if ((ptr->file.flags & FS_O_RDWR) != 0) { + *access_mode = WASI_LIBC_ACCESS_MODE_READ_WRITE; + } + else if ((ptr->file.flags & FS_O_READ) != 0) { + *access_mode = WASI_LIBC_ACCESS_MODE_READ_ONLY; + } + else if ((ptr->file.flags & FS_O_WRITE) != 0) { + *access_mode = WASI_LIBC_ACCESS_MODE_WRITE_ONLY; + } + else { + // we return read/write by default + *access_mode = WASI_LIBC_ACCESS_MODE_READ_WRITE; + } + return __WASI_ESUCCESS; +} + +__wasi_errno_t +os_close(os_file_handle handle, bool is_stdio) +{ + int rc; + struct zephyr_fs_desc *ptr = NULL; + + if (is_stdio) + return __WASI_ESUCCESS; + + if (handle->is_sock) { + rc = zsock_close(handle->fd); + } + // Handle is assumed to be a file descriptor + else { + GET_FILE_SYSTEM_DESCRIPTOR(handle->fd, ptr); + + rc = ptr->is_dir ? fs_closedir(&ptr->dir) : fs_close(&ptr->file); + zephyr_fs_free_obj(ptr); // free in any case. + } + + BH_FREE(handle); + if (rc < 0) { + return convert_errno(-rc); + } + + return __WASI_ESUCCESS; +} + +__wasi_errno_t +os_preadv(os_file_handle handle, const struct __wasi_iovec_t *iov, int iovcnt, + __wasi_filesize_t offset, size_t *nread) +{ + if (handle->fd == STDIN_FILENO) { + return __WASI_ENOSYS; + } + + struct zephyr_fs_desc *ptr = NULL; + int rc; + ssize_t total_read = 0; + + GET_FILE_SYSTEM_DESCRIPTOR(handle->fd, ptr); + + // Seek to the offset + rc = fs_seek(&ptr->file, offset, FS_SEEK_SET); + if (rc < 0) { + return convert_errno(-rc); + } + + // Read data into each buffer + for (int i = 0; i < iovcnt; i++) { + ssize_t bytes_read = fs_read(&ptr->file, iov[i].buf, iov[i].buf_len); + if (bytes_read < 0) { + return convert_errno(-bytes_read); + } + + total_read += bytes_read; + + // If we read less than we asked for, stop reading + if (bytes_read < iov[i].buf_len) { + break; + } + } + + *nread = total_read; + + return __WASI_ESUCCESS; +} + +__wasi_errno_t +os_pwritev(os_file_handle handle, const struct __wasi_ciovec_t *iov, int iovcnt, + __wasi_filesize_t offset, size_t *nwritten) +{ + struct zephyr_fs_desc *ptr = NULL; + ssize_t total_written = 0; + + GET_FILE_SYSTEM_DESCRIPTOR(handle->fd, ptr); + + // Seek to the offset + int rc = fs_seek(&ptr->file, offset, FS_SEEK_SET); + if (rc < 0) { + return convert_errno(-rc); + } + + // Write data from each buffer + for (int i = 0; i < iovcnt; i++) { + ssize_t bytes_written = + fs_write(&ptr->file, iov[i].buf, iov[i].buf_len); + if (bytes_written < 0) { + return convert_errno(-bytes_written); + } + + total_written += bytes_written; + + // If we wrote less than we asked for, stop writing + if (bytes_written < iov[i].buf_len) { + break; + } + } + + *nwritten = total_written; + + return __WASI_ESUCCESS; +} + +__wasi_errno_t +os_readv(os_file_handle handle, const struct __wasi_iovec_t *iov, int iovcnt, + size_t *nread) +{ + struct zephyr_fs_desc *ptr = NULL; + ssize_t total_read = 0; + + GET_FILE_SYSTEM_DESCRIPTOR(handle->fd, ptr); + + // Read data into each buffer + for (int i = 0; i < iovcnt; i++) { + ssize_t bytes_read = fs_read(&ptr->file, iov[i].buf, iov[i].buf_len); + if (bytes_read < 0) { + // If an error occurred, return it + return convert_errno(-bytes_read); + } + + total_read += bytes_read; + + // If we read less than we asked for, stop reading + if (bytes_read < iov[i].buf_len) { + break; + } + } + + *nread = total_read; + + return __WASI_ESUCCESS; +} + +/* With wasi-libc we need to redirect write on stdout/err to printf */ +// TODO: handle write on stdin +__wasi_errno_t +os_writev(os_file_handle handle, const struct __wasi_ciovec_t *iov, int iovcnt, + size_t *nwritten) +{ + ssize_t total_written = 0; + + if (os_is_virtual_fd(handle->fd)) { + FILE *fd = (handle->fd == STDERR_FILENO) ? stderr : stdout; + for (int i = 0; i < iovcnt; i++) { + ssize_t bytes_written = fwrite(iov[i].buf, 1, iov[i].buf_len, fd); + if (bytes_written < 0) + return convert_errno(-bytes_written); + total_written += bytes_written; + } + + *nwritten = total_written; + return __WASI_ESUCCESS; + } + + struct zephyr_fs_desc *ptr = NULL; + GET_FILE_SYSTEM_DESCRIPTOR(handle->fd, ptr); + + // Write data from each buffer + for (int i = 0; i < iovcnt; i++) { + ssize_t bytes_written = + fs_write(&ptr->file, iov[i].buf, iov[i].buf_len); + if (bytes_written < 0) { + return convert_errno(-bytes_written); + } + + total_written += bytes_written; + + // If we wrote less than we asked for, stop writing + if (bytes_written < iov[i].buf_len) { + break; + } + } + + *nwritten = total_written; + + return __WASI_ESUCCESS; +} + +__wasi_errno_t +os_fallocate(os_file_handle handle, __wasi_filesize_t offset, + __wasi_filesize_t length) +{ + return __WASI_ENOSYS; +} + +__wasi_errno_t +os_ftruncate(os_file_handle handle, __wasi_filesize_t size) +{ + + if (os_is_virtual_fd(handle->fd)) { + return __WASI_EINVAL; + } + + struct zephyr_fs_desc *ptr = NULL; + GET_FILE_SYSTEM_DESCRIPTOR(handle->fd, ptr); + + int rc = fs_truncate(&ptr->file, (off_t)size); + if (rc < 0) { + return convert_errno(-rc); + } + + return __WASI_ESUCCESS; +} + +__wasi_errno_t +os_futimens(os_file_handle handle, __wasi_timestamp_t access_time, + __wasi_timestamp_t modification_time, __wasi_fstflags_t fstflags) +{ + return __WASI_ENOSYS; +} + +__wasi_errno_t +os_utimensat(os_file_handle handle, const char *path, + __wasi_timestamp_t access_time, + __wasi_timestamp_t modification_time, __wasi_fstflags_t fstflags, + __wasi_lookupflags_t lookup_flags) +{ + return __WASI_ENOSYS; +} + +__wasi_errno_t +os_readlinkat(os_file_handle handle, const char *path, char *buf, + size_t bufsize, size_t *nread) +{ + return __WASI_ENOSYS; +} + +__wasi_errno_t +os_linkat(os_file_handle from_handle, const char *from_path, + os_file_handle to_handle, const char *to_path, + __wasi_lookupflags_t lookup_flags) +{ + return __WASI_ENOSYS; +} + +__wasi_errno_t +os_symlinkat(const char *old_path, os_file_handle handle, const char *new_path) +{ + return __WASI_ENOSYS; +} + +__wasi_errno_t +os_mkdirat(os_file_handle handle, const char *path) +{ + struct zephyr_fs_desc *ptr = NULL; + int index, rc; + char abs_path[MAX_FILE_NAME + 1]; + + if (handle == NULL) { + return __WASI_EINVAL; // Or another appropriate error code + } + + if (!build_absolute_path(abs_path, sizeof(abs_path), path)) { + return __WASI_ENOMEM; + } + + rc = fs_mkdir(abs_path); + if (rc < 0) { + return convert_errno(-rc); + } + + ptr = zephyr_fs_alloc_obj(true, abs_path, &index); + if (!ptr) { + fs_unlink(abs_path); + return __WASI_EMFILE; + } + fs_dir_t_init(&ptr->dir); + + handle->fd = index; + handle->is_sock = false; + + return __WASI_ESUCCESS; +} + +// DSK: Somewhere along the WASI libc implementation path, the knowledge +// was lost that `old_handle` and `new_handle` refer to directories that +// contain the files to be renamed, rather than the file fds themselves: +// +// __wasilibc_nocwd_renameat(old_dirfd, old_relative_path, +// new_dirfd, new_relative_path); +// +// Therefore we won't mess with the supplied fd's, and work only off +// of the supplied paths. Note: this will change when more than one +// pre-opened dir is supported in the future. +__wasi_errno_t +os_renameat(os_file_handle old_handle, const char *old_path, + os_file_handle new_handle, const char *new_path) +{ + // directories, safe to ignore + (void)old_handle; + (void)new_handle; + + char abs_old_path[MAX_FILE_NAME + 1]; + char abs_new_path[MAX_FILE_NAME + 1]; + + if (!build_absolute_path(abs_old_path, sizeof(abs_old_path), old_path)) { + return __WASI_ENOMEM; + } + + if (!build_absolute_path(abs_new_path, sizeof(abs_new_path), new_path)) { + return __WASI_ENOMEM; + } + + // Attempt to perform the rename + int rc = fs_rename(abs_old_path, abs_new_path); + if (rc < 0) { + return convert_errno(-rc); + } + + // If there is an allocated fd in our table, update the descriptor table + // entry DSK: better approach here? + k_mutex_lock(&desc_array_mutex, K_FOREVER); + for (int i = 0; i < CONFIG_WASI_MAX_OPEN_FILES; i++) { + struct zephyr_fs_desc *ptr = &desc_array[i]; + if (ptr->used && ptr->path && strcmp(ptr->path, abs_old_path) == 0) { + char *new_path_copy = bh_strdup(new_path); + if (new_path_copy != NULL) { + BH_FREE(ptr->path); + ptr->path = new_path_copy; + } + break; // Only one descriptor should match + } + } + k_mutex_unlock(&desc_array_mutex); + + return __WASI_ESUCCESS; +} + +// DSK: Same thing as renameat: `handle` refers to the containing directory, +// not the file handle to unlink. We ignore the handle and use the path +// exclusively. +// +// TODO: is there anything we need to do in case is_dir=true? +__wasi_errno_t +os_unlinkat(os_file_handle handle, const char *path, bool is_dir) +{ + (void)handle; + + char abs_path[MAX_FILE_NAME + 1]; + + if (!build_absolute_path(abs_path, sizeof(abs_path), path)) { + return __WASI_ENOMEM; + } + + int rc = fs_unlink(abs_path); + if (rc < 0) { + return convert_errno(-rc); + } + + // Search for any active descriptor referencing this path and free it. + k_mutex_lock(&desc_array_mutex, K_FOREVER); + for (int i = 0; i < CONFIG_WASI_MAX_OPEN_FILES; i++) { + struct zephyr_fs_desc *ptr = &desc_array[i]; + if (ptr->used && ptr->path && strcmp(ptr->path, abs_path) == 0) { + zephyr_fs_free_obj(ptr); + break; + } + } + k_mutex_unlock(&desc_array_mutex); + + return __WASI_ESUCCESS; +} + +__wasi_errno_t +os_lseek(os_file_handle handle, __wasi_filedelta_t offset, + __wasi_whence_t whence, __wasi_filesize_t *new_offset) +{ + + if (os_is_virtual_fd(handle->fd)) { + return __WASI_ESPIPE; // Seeking not supported on character streams + } + + struct zephyr_fs_desc *ptr = NULL; + int zwhence; + + GET_FILE_SYSTEM_DESCRIPTOR(handle->fd, ptr); + + // They have the same value but this is more explicit + switch (whence) { + case __WASI_WHENCE_SET: + zwhence = FS_SEEK_SET; + break; + case __WASI_WHENCE_CUR: + zwhence = FS_SEEK_CUR; + break; + case __WASI_WHENCE_END: + zwhence = FS_SEEK_END; + break; + default: + return __WASI_EINVAL; + } + + off_t rc = fs_seek(&ptr->file, (off_t)offset, zwhence); + if (rc < 0) { + return convert_errno(-rc); + } + + *new_offset = (__wasi_filesize_t)rc; + + return __WASI_ESUCCESS; +} + +__wasi_errno_t +os_fadvise(os_file_handle handle, __wasi_filesize_t offset, + __wasi_filesize_t length, __wasi_advice_t advice) +{ + return __WASI_ENOSYS; +} + +__wasi_errno_t +os_isatty(os_file_handle handle) +{ + if (os_is_virtual_fd(handle->fd)) { + return __WASI_ESUCCESS; + } + + return __WASI_ENOTTY; +} + +os_file_handle +os_convert_stdin_handle(os_raw_file_handle raw_stdin) +{ + os_file_handle handle = BH_MALLOC(sizeof(struct zephyr_handle)); + if (!handle) + return NULL; + + handle->fd = STDIN_FILENO; + handle->is_sock = false; + return handle; +} + +os_file_handle +os_convert_stdout_handle(os_raw_file_handle raw_stdout) +{ + os_file_handle handle = BH_MALLOC(sizeof(struct zephyr_handle)); + if (!handle) + return NULL; + + handle->fd = STDOUT_FILENO; + handle->is_sock = false; + return handle; +} + +os_file_handle +os_convert_stderr_handle(os_raw_file_handle raw_stderr) +{ + os_file_handle handle = BH_MALLOC(sizeof(struct zephyr_handle)); + if (!handle) + return NULL; + + handle->fd = STDERR_FILENO; + handle->is_sock = false; + return handle; +} + +__wasi_errno_t +os_fdopendir(os_file_handle handle, os_dir_stream *dir_stream) +{ + /* Here we assume that either mdkdir or preopendir was called + * before otherwise function will fail. + */ + struct zephyr_fs_desc *ptr = NULL; + + GET_FILE_SYSTEM_DESCRIPTOR(handle->fd, ptr); + if (!ptr->is_dir) { + return __WASI_ENOTDIR; + } + + int rc = fs_opendir(&ptr->dir, ptr->path); + if (rc < 0) { + return convert_errno(-rc); + } + + /* we store the fd in the `os_dir_stream` to use other function */ + *dir_stream = handle->fd; + + return __WASI_ESUCCESS; +} + +// DSK: simple open and close to rewind index. +__wasi_errno_t +os_rewinddir(os_dir_stream dir_stream) +{ + struct zephyr_fs_desc *ptr = NULL; + GET_FILE_SYSTEM_DESCRIPTOR(dir_stream, ptr); + + if (!ptr->is_dir) + return __WASI_ENOTDIR; + + int rc = fs_closedir(&ptr->dir); // Close current stream + if (rc < 0) + return convert_errno(-rc); + + rc = fs_opendir(&ptr->dir, ptr->path); // Reopen from start + if (rc < 0) + return convert_errno(-rc); + + ptr->dir_index = 0; // Reset virtual position tracker + return __WASI_ESUCCESS; +} + +// DSK: start from 0 and linear seek since there's no cookies in the zephyr fs +// TODO: duplicated code with rewinddir +__wasi_errno_t +os_seekdir(os_dir_stream dir_stream, __wasi_dircookie_t position) +{ + struct zephyr_fs_desc *ptr = NULL; + GET_FILE_SYSTEM_DESCRIPTOR(dir_stream, ptr); + + if (!ptr->is_dir) + return __WASI_ENOTDIR; + + int rc = fs_closedir(&ptr->dir); + if (rc < 0) + return convert_errno(-rc); + + rc = fs_opendir(&ptr->dir, ptr->path); + if (rc < 0) + return convert_errno(-rc); + + // Emulate seek by re-reading entries up to 'position' + struct fs_dirent tmp; + for (__wasi_dircookie_t i = 0; i < position; i++) { + rc = fs_readdir(&ptr->dir, &tmp); + if (rc < 0) + return convert_errno(-rc); + if (tmp.name[0] == '\0') + break; // End of directory + } + + ptr->dir_index = position; + return __WASI_ESUCCESS; +} + +__wasi_errno_t +os_readdir(os_dir_stream dir_stream, __wasi_dirent_t *entry, + const char **d_name) +{ + struct fs_dirent fs_entry; + struct zephyr_fs_desc *ptr = NULL; + GET_FILE_SYSTEM_DESCRIPTOR(dir_stream, ptr); + if (!ptr->is_dir) { + return __WASI_ENOTDIR; + } + + int rc = fs_readdir(&ptr->dir, &fs_entry); + if (rc < 0) { + return convert_errno(-rc); + } + + if (fs_entry.name[0] == '\0') { + // DSK: the caller expects the name buffer to be null + // when we've reached the end of the directory. + *d_name = NULL; + return __WASI_ESUCCESS; + } + + // DSK: emulated increasing value for rewinddir and seekdir + entry->d_next = ++ptr->dir_index; + + // DSK: A hack to get readdir working. This needs to be non-zero along with + // st_ino for the libc side of readdir to work correctly. + entry->d_ino = 1 + ptr->dir_index; + + entry->d_namlen = strlen(fs_entry.name); + entry->d_type = fs_entry.type == FS_DIR_ENTRY_DIR + ? __WASI_FILETYPE_DIRECTORY + : __WASI_FILETYPE_REGULAR_FILE; + + // DSK: name exists in fs_entry and we need to return it + static char name_buf[MAX_FILE_NAME + 1]; + strncpy(name_buf, fs_entry.name, MAX_FILE_NAME); + name_buf[MAX_FILE_NAME] = '\0'; + *d_name = name_buf; + + return __WASI_ESUCCESS; +} + +__wasi_errno_t +os_closedir(os_dir_stream dir_stream) +{ + struct zephyr_fs_desc *ptr = NULL; + + GET_FILE_SYSTEM_DESCRIPTOR(dir_stream, ptr); + if (!ptr->is_dir) { + return __WASI_ENOTDIR; + } + + int rc = fs_closedir(&ptr->dir); + zephyr_fs_free_obj(ptr); // free in any case. + if (rc < 0) { + return convert_errno(-rc); + } + + return __WASI_ESUCCESS; +} + +os_dir_stream +os_get_invalid_dir_stream() +{ + return OS_DIR_STREAM_INVALID; +} + +bool +os_is_dir_stream_valid(os_dir_stream *dir_stream) +{ + // DSK: this probably needs a check... + return false; +} + +bool +os_is_handle_valid(os_file_handle *handle) +{ + if (handle == NULL || *handle == NULL) { + return false; + } + return (*handle)->fd > -1; +} + +char * +os_realpath(const char *path, char *resolved_path) +{ + /* In fact we could implement a path resolving method, because every paths + * are at one point put into memory. + * We could then maintain a 'tree' to represent the file system. + * --> The file system root is easily accessable with: + * * (fs_dir_t) dir.mp->mnt_point + * * (fs_file_t) file.mp->mnt_point + * But we will just use absolute path for now. + */ + if ((!path) || (strlen(path) > PATH_MAX)) { + // Invalid input, path has to be valid and less than PATH_MAX + return NULL; + } + + return strncpy(resolved_path, path, PATH_MAX); +} + +bool +os_compare_file_handle(os_file_handle handle1, os_file_handle handle2) +{ + return handle1->fd == handle2->fd && handle1->is_sock == handle2->is_sock; +} + +bool +os_is_stdin_handle(os_file_handle handle) +{ + return (handle == (os_file_handle)stdin); +} + +bool +os_is_stdout_handle(os_file_handle handle) +{ + return (handle == (os_file_handle)stdout); +} + +bool +os_is_stderr_handle(os_file_handle handle) +{ + return (handle == (os_file_handle)stderr); +} \ No newline at end of file diff --git a/core/shared/platform/zephyr/zephyr_socket.c b/core/shared/platform/zephyr/zephyr_socket.c new file mode 100644 index 0000000000..6d108623e3 --- /dev/null +++ b/core/shared/platform/zephyr/zephyr_socket.c @@ -0,0 +1,1062 @@ +/* + * Copyright (C) 2024 Grenoble INP - ESISAR. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception + */ + +#include "platform_api_extension.h" +#include "platform_api_vmcore.h" + +#include +#include +#include + +#include +#include + +#include "libc_errno.h" +#include +#include + +// Static functions +static bool +textual_addr_to_sockaddr(const char *textual, int port, struct sockaddr *out, + socklen_t *out_len) +{ + struct sockaddr_in *v4; +#ifdef IPPROTO_IPV6 + struct sockaddr_in *v6; +#endif + + assert(textual); + + v4 = (struct sockaddr_in *)out; + if (zsock_inet_pton(AF_INET, textual, &v4->sin_addr.s_addr) == 1) { + v4->sin_family = AF_INET; + v4->sin_port = htons(port); + *out_len = sizeof(struct sockaddr_in); + return true; + } + +#ifdef IPPROTO_IPV6 + v6 = (struct sockaddr_in *)out; + if (zsock_inet_pton(AF_INET6, textual, &v6->sin6_addr.s6_addr) == 1) { + v6->sin6_family = AF_INET6; + v6->sin6_port = htons(port); + *out_len = sizeof(struct sockaddr_in); + return true; + } +#endif + + return false; +} + +static int +sockaddr_to_bh_sockaddr(const struct sockaddr *sockaddr, + bh_sockaddr_t *bh_sockaddr) +{ + switch (sockaddr->sa_family) { + case AF_INET: + { + struct sockaddr_in *addr = (struct sockaddr_in *)sockaddr; + + bh_sockaddr->port = ntohs(addr->sin_port); + bh_sockaddr->addr_buffer.ipv4 = ntohl(addr->sin_addr.s_addr); + bh_sockaddr->is_ipv4 = true; + return BHT_OK; + } +#ifdef IPPROTO_IPV6 + case AF_INET6: + { + struct sockaddr_in *addr = (struct sockaddr_in *)sockaddr; + size_t i; + + bh_sockaddr->port = ntohs(addr->sin6_port); + + for (i = 0; i < sizeof(bh_sockaddr->addr_buffer.ipv6) + / sizeof(bh_sockaddr->addr_buffer.ipv6[0]); + i++) { + uint16 part_addr = addr->sin6_addr.s6_addr[i * 2] + | (addr->sin6_addr.s6_addr[i * 2 + 1] << 8); + bh_sockaddr->addr_buffer.ipv6[i] = ntohs(part_addr); + } + + bh_sockaddr->is_ipv4 = false; + return BHT_OK; + } +#endif + default: + errno = EAFNOSUPPORT; + return BHT_ERROR; + } +} + +static void +bh_sockaddr_to_sockaddr(const bh_sockaddr_t *bh_sockaddr, + struct sockaddr_storage *sockaddr, socklen_t *socklen) +{ + if (bh_sockaddr->is_ipv4) { + struct sockaddr_in *addr = (struct sockaddr_in *)sockaddr; + addr->sin_port = htons(bh_sockaddr->port); + addr->sin_family = AF_INET; + addr->sin_addr.s_addr = htonl(bh_sockaddr->addr_buffer.ipv4); + *socklen = sizeof(*addr); + } +#ifdef IPPROTO_IPV6 + else { + struct sockaddr_in6 *addr = (struct sockaddr_in6 *)sockaddr; + size_t i; + addr->sin6_port = htons(bh_sockaddr->port); + addr->sin6_family = AF_INET6; + + for (i = 0; i < sizeof(bh_sockaddr->addr_buffer.ipv6) + / sizeof(bh_sockaddr->addr_buffer.ipv6[0]); + i++) { + uint16 part_addr = htons(bh_sockaddr->addr_buffer.ipv6[i]); + addr->sin6_addr.s6_addr[i * 2] = 0xff & part_addr; + addr->sin6_addr.s6_addr[i * 2 + 1] = (0xff00 & part_addr) >> 8; + } + + *socklen = sizeof(*addr); + } +#endif +} + +static int +getaddrinfo_error_to_errno(int error) +{ + switch (error) { + case DNS_EAI_AGAIN: + return EAGAIN; + case DNS_EAI_FAIL: + return EFAULT; + case DNS_EAI_MEMORY: + return ENOMEM; + case DNS_EAI_SYSTEM: + return errno; + default: + return EINVAL; + } +} + +static int +is_addrinfo_supported(struct zsock_addrinfo *info) +{ + return + // Allow only IPv4 and IPv6 + (info->ai_family == AF_INET || info->ai_family == AF_INET6) + // Allow only UDP and TCP + && (info->ai_socktype == SOCK_DGRAM || info->ai_socktype == SOCK_STREAM) + && (info->ai_protocol == IPPROTO_TCP + || info->ai_protocol == IPPROTO_UDP); +} + +static int +os_socket_setbooloption(bh_socket_t socket, int level, int optname, + bool is_enabled) +{ + int option = (int)is_enabled; + + if (zsock_setsockopt(socket->fd, level, optname, &option, sizeof(option)) + != 0) { + return BHT_ERROR; + } + + return BHT_OK; +} + +static int +os_socket_getbooloption(bh_socket_t socket, int level, int optname, + bool *is_enabled) +{ + assert(is_enabled); + + int optval; + socklen_t optval_size = sizeof(optval); + + if (zsock_setsockopt(socket->fd, level, optname, &optval, optval_size) + != 0) { + return BHT_ERROR; + } + *is_enabled = (bool)optval; + return BHT_OK; +} + +// Platform API implementation +int +os_socket_create(bh_socket_t *sock, bool is_ipv4, bool is_tcp) +{ + int af = is_ipv4 ? AF_INET : AF_INET6; + // now socket is a struct try *(sock)->fd + + *(sock) = BH_MALLOC(sizeof(zephyr_handle)); + + if (!sock) { + return BHT_ERROR; + } + + if (is_tcp) { + (*sock)->fd = zsock_socket(af, SOCK_STREAM, IPPROTO_TCP); + } + else { + (*sock)->fd = + zsock_socket(af, SOCK_DGRAM, IPPROTO_UDP); // IPPROTO_UDP or 0 + } + + (*sock)->is_sock = true; + + if ((*sock)->fd == -1) { + BH_FREE(*sock); + return BHT_ERROR; + } + + return BHT_OK; +} + +int +os_socket_bind(bh_socket_t socket, const char *host, int *port) +{ + struct sockaddr_storage addr = { 0 }; + socklen_t socklen; + int ret; + + assert(host); + assert(port); + + if (!textual_addr_to_sockaddr(host, *port, (struct sockaddr *)&addr, + &socklen)) { + return BHT_ERROR; + } + + // F_SETF_SETFD and FD_CLOEXEC are not defined in zephyr. + // SO_LINGER: Socket lingers on close (ignored, for compatibility) + + ret = zsock_bind(socket->fd, (struct sockaddr *)&addr, socklen); + if (ret < 0) { + return BHT_ERROR; + } + + socklen = sizeof(addr); + if (zsock_getsockname(socket->fd, (void *)&addr, &socklen) == -1) { + return BHT_ERROR; + } + + if (addr.ss_family == AF_INET) { // addr.sin_family + *port = ntohs(((struct sockaddr_in *)&addr)->sin_port); + } + else { +#ifdef IPPROTO_IPV6 + *port = ntohs(((struct sockaddr_in *)&addr)->sin6_port); +#else + return BHT_ERROR; +#endif + } + + return BHT_OK; +} + +int +os_socket_settimeout(bh_socket_t socket, uint64 timeout_us) +{ + struct timeval timeout = { 0 }; + + timeout.tv_sec = timeout_us / 1000000; + timeout.tv_usec = timeout_us % 1000000; + + return zsock_setsockopt(socket->fd, SOL_SOCKET, SO_RCVTIMEO, &timeout, + sizeof(timeout)); +} + +int +os_socket_listen(bh_socket_t socket, int max_client) +{ + return zsock_listen(socket->fd, max_client) != 0 ? BHT_ERROR : BHT_OK; +} + +int +os_socket_accept(bh_socket_t server_sock, bh_socket_t *sock, void *addr, + unsigned int *addrlen) +{ + *sock = BH_MALLOC(sizeof(zephyr_handle)); + if (!sock) { + return BHT_ERROR; + } + + (*sock)->fd = zsock_accept(server_sock->fd, addr, addrlen); + + if ((*sock)->fd < 0) { + BH_FREE(*sock); + return BHT_ERROR; + } + + (*sock)->is_sock = true; + + return BHT_OK; +} + +int +os_socket_connect(bh_socket_t socket, const char *addr, int port) +{ + struct sockaddr_storage addr_in = { 0 }; + socklen_t socklen; + int ret; + + assert(addr); + + if (!textual_addr_to_sockaddr(addr, port, (struct sockaddr *)&addr_in, + &socklen)) { + return BHT_ERROR; + } + + ret = zsock_connect(socket->fd, (struct sockaddr *)&addr_in, socklen); + if (ret < 0) { + return BHT_ERROR; + } + + return BHT_OK; +} + +int +os_socket_recv(bh_socket_t socket, void *buf, unsigned int len) +{ + return zsock_recv(socket->fd, buf, len, 0); +} + +int +os_socket_recv_from(bh_socket_t socket, void *buf, unsigned int len, int flags, + bh_sockaddr_t *src_addr) +{ + struct sockaddr_storage sock_addr = { 0 }; + socklen_t socklen = sizeof(sock_addr); + int ret; + + ret = zsock_recvfrom(socket->fd, buf, len, flags, + (struct sockaddr *)&sock_addr, &socklen); + + if (ret < 0) { + return BHT_ERROR; + } + + if (src_addr && socklen > 0) { + // zsock_recvfrom doesn't seem to set `addr->sa_family`, + // so we set it manually. + ((struct sockaddr *)&sock_addr)->sa_family = + src_addr->is_ipv4 == true ? AF_INET : AF_INET6; + + if (sockaddr_to_bh_sockaddr((struct sockaddr *)&sock_addr, src_addr) + == BHT_ERROR) { + return -1; + } + } + else if (src_addr) { + memset(src_addr, 0, sizeof(*src_addr)); + } + + return ret; +} + +int +os_socket_send(bh_socket_t socket, const void *buf, unsigned int len) +{ + return zsock_send(socket->fd, buf, len, 0); +} + +int +os_socket_send_to(bh_socket_t socket, const void *buf, unsigned int len, + int flags, const bh_sockaddr_t *dest_addr) +{ + struct sockaddr_storage addr = { 0 }; + socklen_t socklen; + + (void)bh_sockaddr_to_sockaddr(dest_addr, &addr, &socklen); + + return zsock_sendto(socket->fd, buf, len, flags, (struct sockaddr *)&addr, + socklen); +} + +int +os_socket_close(bh_socket_t socket) +{ + zsock_close(socket->fd); + + BH_FREE(socket); + + return BHT_OK; +} + +__wasi_errno_t +os_socket_shutdown(bh_socket_t socket) +{ + if (zsock_shutdown(socket->fd, ZSOCK_SHUT_RDWR) == -1) { + return convert_errno(errno); + } + return __WASI_ESUCCESS; +} + +int +os_socket_inet_network(bool is_ipv4, const char *cp, bh_ip_addr_buffer_t *out) +{ + if (!cp) + return BHT_ERROR; + + if (is_ipv4) { + if (zsock_inet_pton(AF_INET, cp, &out->ipv4) != 1) { + return BHT_ERROR; + } + /* Note: ntohl(INADDR_NONE) == INADDR_NONE */ + out->ipv4 = ntohl(out->ipv4); + } + else { +#ifdef IPPROTO_IPV6 + if (zsock_inet_pton(AF_INET6, cp, out->ipv6) != 1) { + return BHT_ERROR; + } + for (int i = 0; i < 8; i++) { + out->ipv6[i] = ntohs(out->ipv6[i]); + } +#else + errno = EAFNOSUPPORT; + return BHT_ERROR; +#endif + } + + return BHT_OK; +} + +int +os_socket_addr_resolve(const char *host, const char *service, + uint8_t *hint_is_tcp, uint8_t *hint_is_ipv4, + bh_addr_info_t *addr_info, size_t addr_info_size, + size_t *max_info_size) +{ + struct zsock_addrinfo hints = { 0 }, *res, *result; + int hints_enabled = hint_is_tcp || hint_is_ipv4; + int ret; + size_t pos = 0; + + if (hints_enabled) { + if (hint_is_ipv4) { + hints.ai_family = *hint_is_ipv4 ? AF_INET : AF_INET6; + } + if (hint_is_tcp) { + hints.ai_socktype = *hint_is_tcp ? SOCK_STREAM : SOCK_DGRAM; + } + } + + ret = zsock_getaddrinfo(host, strlen(service) == 0 ? NULL : service, + hints_enabled ? &hints : NULL, &result); + if (ret != BHT_OK) { + errno = getaddrinfo_error_to_errno(ret); + return BHT_ERROR; + } + + res = result; + + while (res) { + if (addr_info_size > pos) { + if (!is_addrinfo_supported(res)) { + res = res->ai_next; + continue; + } + + ret = + sockaddr_to_bh_sockaddr(res->ai_addr, &addr_info[pos].sockaddr); + + if (ret == BHT_ERROR) { + zsock_freeaddrinfo(result); + return BHT_ERROR; + } + + addr_info[pos].is_tcp = res->ai_socktype == SOCK_STREAM; + } + + pos++; + res = res->ai_next; + } + + *max_info_size = pos; + zsock_freeaddrinfo(result); + + return BHT_OK; +} + +int +os_socket_addr_local(bh_socket_t socket, bh_sockaddr_t *sockaddr) +{ + struct sockaddr_storage addr_storage = { 0 }; + socklen_t addr_len = sizeof(addr_storage); + int ret; + + ret = zsock_getsockname(socket->fd, (struct sockaddr *)&addr_storage, + &addr_len); + + if (ret != BHT_OK) { + return BHT_ERROR; + } + + return sockaddr_to_bh_sockaddr((struct sockaddr *)&addr_storage, sockaddr); +} + +int +os_socket_addr_remote(bh_socket_t socket, bh_sockaddr_t *sockaddr) +{ + struct sockaddr_storage addr_storage = { 0 }; + socklen_t addr_len = sizeof(addr_storage); + int ret; + + ret = zsock_getpeername(socket->fd, (struct sockaddr *)&addr_storage, + &addr_len); + + if (ret != BHT_OK) { + return BHT_ERROR; + } + + return sockaddr_to_bh_sockaddr((struct sockaddr *)&addr_storage, sockaddr); +} + +int +os_socket_set_send_buf_size(bh_socket_t socket, size_t bufsiz) +{ + int buf_size_int = (int)bufsiz; + + if (zsock_setsockopt(socket->fd, SOL_SOCKET, SO_SNDBUF, &buf_size_int, + sizeof(buf_size_int)) + != 0) { + return BHT_ERROR; + } + + return BHT_OK; +} + +int +os_socket_get_send_buf_size(bh_socket_t socket, size_t *bufsiz) +{ + assert(bufsiz); + + int buf_size_int; + socklen_t bufsiz_len = sizeof(buf_size_int); + + if (zsock_getsockopt(socket->fd, SOL_SOCKET, SO_SNDBUF, &buf_size_int, + &bufsiz_len) + != 0) { + return BHT_ERROR; + } + + *bufsiz = (size_t)buf_size_int; + return BHT_OK; +} + +int +os_socket_set_recv_buf_size(bh_socket_t socket, size_t bufsiz) +{ + if (zsock_setsockopt(socket->fd, SOL_SOCKET, SO_RCVBUF, &bufsiz, + sizeof(bufsiz)) + != 0) { + return BHT_ERROR; + } + + return BHT_OK; +} + +int +os_socket_get_recv_buf_size(bh_socket_t socket, size_t *bufsiz) +{ + assert(bufsiz); + + int buf_size_int; + socklen_t bufsiz_len = sizeof(buf_size_int); + + if (zsock_getsockopt(socket->fd, SOL_SOCKET, SO_RCVBUF, &buf_size_int, + &bufsiz_len) + != 0) { + return BHT_ERROR; + } + *bufsiz = (size_t)buf_size_int; + + return BHT_OK; +} + +int +os_socket_set_keep_alive(bh_socket_t socket, bool is_enabled) +{ + return os_socket_setbooloption(socket, SOL_SOCKET, SO_KEEPALIVE, + is_enabled); +} + +int +os_socket_get_keep_alive(bh_socket_t socket, bool *is_enabled) +{ + return os_socket_getbooloption(socket, SOL_SOCKET, SO_KEEPALIVE, + is_enabled); +} + +int +os_socket_set_send_timeout(bh_socket_t socket, uint64 timeout_us) +{ + struct timeval tv; + tv.tv_sec = timeout_us / 1000000UL; + tv.tv_usec = timeout_us % 1000000UL; + + if (zsock_setsockopt(socket->fd, SOL_SOCKET, SO_SNDTIMEO, &tv, sizeof(tv)) + != 0) { + return BHT_ERROR; + } + return BHT_OK; +} + +int +os_socket_get_send_timeout(bh_socket_t socket, uint64 *timeout_us) +{ + struct timeval tv; + socklen_t tv_len = sizeof(tv); + + if (zsock_setsockopt(socket->fd, SOL_SOCKET, SO_SNDTIMEO, &tv, tv_len) + != 0) { + return BHT_ERROR; + } + *timeout_us = (tv.tv_sec * 1000000UL) + tv.tv_usec; + + return BHT_OK; +} + +int +os_socket_set_recv_timeout(bh_socket_t socket, uint64 timeout_us) +{ + struct timeval tv; + tv.tv_sec = timeout_us / 1000000UL; + tv.tv_usec = timeout_us % 1000000UL; + + if (zsock_setsockopt(socket->fd, SOL_SOCKET, SO_RCVTIMEO, &tv, sizeof(tv)) + != 0) { + return BHT_ERROR; + } + + return BHT_OK; +} + +int +os_socket_get_recv_timeout(bh_socket_t socket, uint64 *timeout_us) +{ + struct timeval tv; + socklen_t tv_len = sizeof(tv); + + if (zsock_setsockopt(socket->fd, SOL_SOCKET, SO_RCVTIMEO, &tv, tv_len) + != 0) { + return BHT_ERROR; + } + *timeout_us = (tv.tv_sec * 1000000UL) + tv.tv_usec; + + return BHT_OK; +} + +int +os_socket_set_reuse_addr(bh_socket_t socket, bool is_enabled) +{ + return os_socket_setbooloption(socket, SOL_SOCKET, SO_REUSEADDR, + is_enabled); +} + +int +os_socket_get_reuse_addr(bh_socket_t socket, bool *is_enabled) +{ + return os_socket_getbooloption(socket, SOL_SOCKET, SO_REUSEADDR, + is_enabled); +} + +int +os_socket_set_reuse_port(bh_socket_t socket, bool is_enabled) +{ + return os_socket_setbooloption(socket, SOL_SOCKET, SO_REUSEPORT, + is_enabled); +} + +int +os_socket_get_reuse_port(bh_socket_t socket, bool *is_enabled) +{ + return os_socket_getbooloption(socket, SOL_SOCKET, SO_REUSEPORT, + is_enabled); +} + +// SO_LINGER Socket lingers on close (ignored, for compatibility) +int +os_socket_set_linger(bh_socket_t socket, bool is_enabled, int linger_s) +{ + errno = ENOSYS; + + return BHT_ERROR; +} + +int +os_socket_get_linger(bh_socket_t socket, bool *is_enabled, int *linger_s) +{ + errno = ENOSYS; + + return BHT_ERROR; +} + +// TCP_NODELAY Disable TCP buffering (ignored, for compatibility) +int +os_socket_set_tcp_no_delay(bh_socket_t socket, bool is_enabled) +{ + errno = ENOSYS; + + return BHT_ERROR; +} + +int +os_socket_get_tcp_no_delay(bh_socket_t socket, bool *is_enabled) +{ + errno = ENOSYS; + + return BHT_ERROR; +} + +int +os_socket_set_tcp_quick_ack(bh_socket_t socket, bool is_enabled) +{ + errno = ENOSYS; + + return BHT_ERROR; +} + +int +os_socket_get_tcp_quick_ack(bh_socket_t socket, bool *is_enabled) +{ + errno = ENOSYS; + + return BHT_ERROR; +} + +int +os_socket_set_tcp_keep_idle(bh_socket_t socket, uint32_t time_s) +{ + int time_s_int = (int)time_s; + +#ifdef TCP_KEEPIDLE + if (zsock_setsockopt(socket->fd, IPPROTO_TCP, TCP_KEEPIDLE, &time_s_int, + sizeof(time_s_int)) + != 0) { + return BHT_ERROR; + } + return BHT_OK; +#elif defined(TCP_KEEPALIVE) + if (zsock_setsockopt(socket->fd, IPPROTO_TCP, TCP_KEEPALIVE, &time_s_int, + sizeof(time_s_int)) + != 0) { + return BHT_ERROR; + } + return BHT_OK; +#else + errno = ENOSYS; + + return BHT_ERROR; +#endif +} + +int +os_socket_get_tcp_keep_idle(bh_socket_t socket, uint32_t *time_s) +{ + assert(time_s); + int time_s_int; + socklen_t time_s_len = sizeof(time_s_int); + +#ifdef TCP_KEEPIDLE + if (zsock_setsockopt(socket->fd, IPPROTO_TCP, TCP_KEEPIDLE, &time_s_int, + time_s_len) + != 0) { + return BHT_ERROR; + } + *time_s = (uint32)time_s_int; + + return BHT_OK; +#elif defined(TCP_KEEPALIVE) + if (zsock_setsockopt(socket->fd, IPPROTO_TCP, TCP_KEEPALIVE, &time_s_int, + time_s_len) + != 0) { + return BHT_ERROR; + } + *time_s = (uint32)time_s_int; + + return BHT_OK; +#else + errno = ENOSYS; + + return BHT_ERROR; +#endif +} + +int +os_socket_set_tcp_keep_intvl(bh_socket_t socket, uint32_t time_s) +{ + int time_s_int = (int)time_s; + +#ifdef TCP_KEEPINTVL + if (zsock_setsockopt(socket->fd, IPPROTO_TCP, TCP_KEEPINTVL, &time_s_int, + sizeof(time_s_int)) + != 0) { + return BHT_ERROR; + } + + return BHT_OK; +#else + errno = ENOSYS; + + return BHT_ERROR; +#endif +} + +int +os_socket_get_tcp_keep_intvl(bh_socket_t socket, uint32_t *time_s) +{ +#ifdef TCP_KEEPINTVL + if (!socket || !time_s || socket->fd < 0) { + errno = EINVAL; + return BHT_ERROR; + } + + int time_s_int; + socklen_t time_s_len = sizeof(time_s_int); + + if (zsock_getsockopt(socket->fd, IPPROTO_TCP, TCP_KEEPINTVL, &time_s_int, + &time_s_len) + != 0) { + return BHT_ERROR; + } + + if (time_s_int < 0) { + errno = EINVAL; + return BHT_ERROR; + } + + *time_s = (uint32_t)time_s_int; + + return BHT_OK; +#else + errno = ENOSYS; + + return BHT_ERROR; +#endif +} + +int +os_socket_set_tcp_fastopen_connect(bh_socket_t socket, bool is_enabled) +{ + errno = ENOSYS; + + return BHT_ERROR; +} + +int +os_socket_get_tcp_fastopen_connect(bh_socket_t socket, bool *is_enabled) +{ + errno = ENOSYS; + + return BHT_ERROR; +} + +int +os_socket_set_ip_multicast_loop(bh_socket_t socket, bool ipv6, bool is_enabled) +{ + errno = ENOSYS; + + return BHT_ERROR; +} + +int +os_socket_get_ip_multicast_loop(bh_socket_t socket, bool ipv6, bool *is_enabled) +{ + errno = ENOSYS; + + return BHT_ERROR; +} + +int +os_socket_set_ip_add_membership(bh_socket_t socket, + bh_ip_addr_buffer_t *imr_multiaddr, + uint32_t imr_interface, bool is_ipv6) +{ + assert(imr_multiaddr); + + if (is_ipv6) { +#if defined(IPPROTO_IPV6) && !defined(BH_PLATFORM_COSMOPOLITAN) + struct ipv6_mreq mreq; + + for (int i = 0; i < 8; i++) { + ((uint16_t *)mreq.ipv6mr_multiaddr.s6_addr)[i] = + imr_multiaddr->ipv6[i]; + } + mreq.ipv6mr_interface = imr_interface; + + if (setsockopt(socket->fd, IPPROTO_IPV6, IPV6_ADD_MEMBERSHIP, &mreq, + sizeof(mreq)) + != 0) { + return BHT_ERROR; + } +#else + errno = EAFNOSUPPORT; + return BHT_ERROR; +#endif + } + else { + struct ip_mreqn mreq; + mreq.imr_multiaddr.s_addr = imr_multiaddr->ipv4; + mreq.imr_address.s_addr = imr_interface; + + if (zsock_setsockopt(socket->fd, IPPROTO_IP, IP_ADD_MEMBERSHIP, &mreq, + sizeof(mreq)) + != 0) { + return BHT_ERROR; + } + } + return BHT_OK; +} + +int +os_socket_set_ip_drop_membership(bh_socket_t socket, + bh_ip_addr_buffer_t *imr_multiaddr, + uint32_t imr_interface, bool is_ipv6) +{ + assert(imr_multiaddr); + + if (is_ipv6) { +#if defined(IPPROTO_IPV6) && !defined(BH_PLATFORM_COSMOPOLITAN) + struct ipv6_mreq mreq; + + for (int i = 0; i < 8; i++) { + ((uint16_t *)mreq.ipv6mr_multiaddr.s6_addr)[i] = + imr_multiaddr->ipv6[i]; + } + mreq.ipv6mr_interface = imr_interface; + + if (zsock_setsockopt(socket->fd, IPPROTO_IPV6, IPV6_DROP_MEMBERSHIP, + &mreq, sizeof(mreq)) + != 0) { + return BHT_ERROR; + } +#else + errno = EAFNOSUPPORT; + return BHT_ERROR; +#endif + } + else { + struct ip_mreqn mreq; + mreq.imr_multiaddr.s_addr = imr_multiaddr->ipv4; + mreq.imr_address.s_addr = imr_interface; + + if (zsock_setsockopt(socket->fd, IPPROTO_IP, IP_DROP_MEMBERSHIP, &mreq, + sizeof(mreq)) + != 0) { + return BHT_ERROR; + } + } + return BHT_OK; +} + +int +os_socket_set_ip_ttl(bh_socket_t socket, uint8_t ttl_s) +{ + if (zsock_setsockopt(socket->fd, IPPROTO_IP, IP_TTL, &ttl_s, sizeof(ttl_s)) + != 0) { + return BHT_ERROR; + } + + return BHT_OK; +} + +int +os_socket_get_ip_ttl(bh_socket_t socket, uint8_t *ttl_s) +{ + socklen_t opt_len = sizeof(*ttl_s); + + if (zsock_setsockopt(socket->fd, IPPROTO_IP, IP_MULTICAST_TTL, ttl_s, + opt_len) + != 0) { + return BHT_ERROR; + } + + return BHT_OK; +} + +int +os_socket_set_ip_multicast_ttl(bh_socket_t socket, uint8_t ttl_s) +{ + if (zsock_setsockopt(socket->fd, IPPROTO_IP, IP_MULTICAST_TTL, &ttl_s, + sizeof(ttl_s)) + != 0) { + return BHT_ERROR; + } + + return BHT_OK; +} + +int +os_socket_get_ip_multicast_ttl(bh_socket_t socket, uint8_t *ttl_s) +{ + socklen_t opt_len = sizeof(*ttl_s); + + if (zsock_setsockopt(socket->fd, IPPROTO_IP, IP_MULTICAST_TTL, ttl_s, + opt_len) + != 0) { + return BHT_ERROR; + } + + return BHT_OK; +} + +int +os_socket_set_ipv6_only(bh_socket_t socket, bool is_enabled) +{ +#ifdef IPPROTO_IPV6 + return os_socket_setbooloption(socket, IPPROTO_IPV6, IPV6_V6ONLY, + is_enabled); +#else + errno = EAFNOSUPPORT; + return BHT_ERROR; +#endif +} + +int +os_socket_get_ipv6_only(bh_socket_t socket, bool *is_enabled) +{ +#ifdef IPPROTO_IPV6 + return os_socket_getbooloption(socket, IPPROTO_IPV6, IPV6_V6ONLY, + is_enabled); +#else + errno = EAFNOSUPPORT; + return BHT_ERROR; +#endif +} + +int +os_socket_set_broadcast(bh_socket_t socket, bool is_enabled) +{ + return os_socket_setbooloption(socket, SOL_SOCKET, SO_BROADCAST, + is_enabled); +} + +int +os_socket_get_broadcast(bh_socket_t socket, bool *is_enabled) +{ + return os_socket_getbooloption(socket, SOL_SOCKET, SO_BROADCAST, + is_enabled); +} + +// Experimental : +int +os_ioctl(os_file_handle handle, int request, ...) +{ + return __WASI_ENOSYS; + // int ret = -1; + // va_list args; + + // va_start(args, request); + // ret = zsock_ioctl(handle->fd, request, args); + // va_end(args); + + // return ret; +} + +int +os_poll(os_poll_file_handle *fds, os_nfds_t nfs, int timeout) +{ + return zsock_poll(fds, nfs, timeout); +} \ No newline at end of file diff --git a/core/shared/platform/zephyr/zephyr_thread.c b/core/shared/platform/zephyr/zephyr_thread.c index 31aaad7a93..af864e417e 100644 --- a/core/shared/platform/zephyr/zephyr_thread.c +++ b/core/shared/platform/zephyr/zephyr_thread.c @@ -34,22 +34,22 @@ static K_THREAD_STACK_ARRAY_DEFINE(mpu_stacks, BH_ZEPHYR_MPU_STACK_COUNT, BH_ZEPHYR_MPU_STACK_SIZE); static bool mpu_stack_allocated[BH_ZEPHYR_MPU_STACK_COUNT]; -static mutex_t mpu_stack_lock; +static zmutex_t mpu_stack_lock; static char * mpu_stack_alloc() { int i; - mutex_lock(&mpu_stack_lock, K_FOREVER); + zmutex_lock(&mpu_stack_lock, K_FOREVER); for (i = 0; i < BH_ZEPHYR_MPU_STACK_COUNT; i++) { if (!mpu_stack_allocated[i]) { mpu_stack_allocated[i] = true; - mutex_unlock(&mpu_stack_lock); + zmutex_unlock(&mpu_stack_lock); return (char *)mpu_stacks[i]; } } - mutex_unlock(&mpu_stack_lock); + zmutex_unlock(&mpu_stack_lock); return NULL; } @@ -58,17 +58,17 @@ mpu_stack_free(char *stack) { int i; - mutex_lock(&mpu_stack_lock, K_FOREVER); + zmutex_lock(&mpu_stack_lock, K_FOREVER); for (i = 0; i < BH_ZEPHYR_MPU_STACK_COUNT; i++) { if ((char *)mpu_stacks[i] == stack) mpu_stack_allocated[i] = false; } - mutex_unlock(&mpu_stack_lock); + zmutex_unlock(&mpu_stack_lock); } #endif typedef struct os_thread_wait_node { - sem_t sem; + zsem_t sem; os_thread_wait_list next; } os_thread_wait_node; @@ -80,7 +80,7 @@ typedef struct os_thread_data { /* Jeff thread local root */ void *tlr; /* Lock for waiting list */ - mutex_t wait_list_lock; + zmutex_t wait_list_lock; /* Waiting list of other threads who are joining this thread */ os_thread_wait_list thread_wait_list; /* Thread stack size */ @@ -107,13 +107,13 @@ static bool is_thread_sys_inited = false; static os_thread_data supervisor_thread_data; /* Lock for thread data list */ -static mutex_t thread_data_lock; +static zmutex_t thread_data_lock; /* Thread data list */ static os_thread_data *thread_data_list = NULL; /* Lock for thread object list */ -static mutex_t thread_obj_lock; +static zmutex_t thread_obj_lock; /* Thread object list */ static os_thread_obj *thread_obj_list = NULL; @@ -121,7 +121,7 @@ static os_thread_obj *thread_obj_list = NULL; static void thread_data_list_add(os_thread_data *thread_data) { - mutex_lock(&thread_data_lock, K_FOREVER); + zmutex_lock(&thread_data_lock, K_FOREVER); if (!thread_data_list) thread_data_list = thread_data; else { @@ -129,7 +129,7 @@ thread_data_list_add(os_thread_data *thread_data) os_thread_data *p = thread_data_list; while (p) { if (p == thread_data) { - mutex_unlock(&thread_data_lock); + zmutex_unlock(&thread_data_lock); return; } p = p->next; @@ -139,13 +139,13 @@ thread_data_list_add(os_thread_data *thread_data) thread_data->next = thread_data_list; thread_data_list = thread_data; } - mutex_unlock(&thread_data_lock); + zmutex_unlock(&thread_data_lock); } static void thread_data_list_remove(os_thread_data *thread_data) { - mutex_lock(&thread_data_lock, K_FOREVER); + zmutex_lock(&thread_data_lock, K_FOREVER); if (thread_data_list) { if (thread_data_list == thread_data) thread_data_list = thread_data_list->next; @@ -158,32 +158,32 @@ thread_data_list_remove(os_thread_data *thread_data) p->next = p->next->next; } } - mutex_unlock(&thread_data_lock); + zmutex_unlock(&thread_data_lock); } static os_thread_data * thread_data_list_lookup(k_tid_t tid) { - mutex_lock(&thread_data_lock, K_FOREVER); + zmutex_lock(&thread_data_lock, K_FOREVER); if (thread_data_list) { os_thread_data *p = thread_data_list; while (p) { if (p->tid == tid) { /* Found */ - mutex_unlock(&thread_data_lock); + zmutex_unlock(&thread_data_lock); return p; } p = p->next; } } - mutex_unlock(&thread_data_lock); + zmutex_unlock(&thread_data_lock); return NULL; } static void thread_obj_list_add(os_thread_obj *thread_obj) { - mutex_lock(&thread_obj_lock, K_FOREVER); + zmutex_lock(&thread_obj_lock, K_FOREVER); if (!thread_obj_list) thread_obj_list = thread_obj; else { @@ -191,14 +191,14 @@ thread_obj_list_add(os_thread_obj *thread_obj) thread_obj->next = thread_obj_list; thread_obj_list = thread_obj; } - mutex_unlock(&thread_obj_lock); + zmutex_unlock(&thread_obj_lock); } static void thread_obj_list_reclaim() { os_thread_obj *p, *p_prev; - mutex_lock(&thread_obj_lock, K_FOREVER); + zmutex_lock(&thread_obj_lock, K_FOREVER); p_prev = NULL; p = thread_obj_list; while (p) { @@ -219,7 +219,7 @@ thread_obj_list_reclaim() p = p->next; } } - mutex_unlock(&thread_obj_lock); + zmutex_unlock(&thread_obj_lock); } int @@ -229,10 +229,10 @@ os_thread_sys_init() return BHT_OK; #if BH_ENABLE_ZEPHYR_MPU_STACK != 0 - mutex_init(&mpu_stack_lock); + zmutex_init(&mpu_stack_lock); #endif - mutex_init(&thread_data_lock); - mutex_init(&thread_obj_lock); + zmutex_init(&thread_data_lock); + zmutex_init(&thread_obj_lock); /* Initialize supervisor thread data */ memset(&supervisor_thread_data, 0, sizeof(supervisor_thread_data)); @@ -265,19 +265,19 @@ os_thread_cleanup(void) os_thread_data *thread_data = thread_data_current(); bh_assert(thread_data != NULL); - mutex_lock(&thread_data->wait_list_lock, K_FOREVER); + zmutex_lock(&thread_data->wait_list_lock, K_FOREVER); if (thread_data->thread_wait_list) { /* Signal each joining thread */ os_thread_wait_list head = thread_data->thread_wait_list; while (head) { os_thread_wait_list next = head->next; - sem_give(&head->sem); + zsem_give(&head->sem); /* head will be freed by joining thread */ head = next; } thread_data->thread_wait_list = NULL; } - mutex_unlock(&thread_data->wait_list_lock); + zmutex_unlock(&thread_data->wait_list_lock); thread_data_list_remove(thread_data); /* Set flag to true for the next thread creating to @@ -342,7 +342,7 @@ os_thread_create_with_prio(korp_tid *p_tid, thread_start_routine_t start, } memset(thread_data, 0, thread_data_size); - mutex_init(&thread_data->wait_list_lock); + zmutex_init(&thread_data->wait_list_lock); thread_data->stack_size = stack_size; thread_data->tid = tid; @@ -407,10 +407,10 @@ os_thread_join(korp_tid thread, void **value_ptr) if (!(node = BH_MALLOC(sizeof(os_thread_wait_node)))) return BHT_ERROR; - sem_init(&node->sem, 0, 1); + zsem_init(&node->sem, 0, 1); node->next = NULL; - mutex_lock(&thread_data->wait_list_lock, K_FOREVER); + zmutex_lock(&thread_data->wait_list_lock, K_FOREVER); if (!thread_data->thread_wait_list) thread_data->thread_wait_list = node; else { @@ -420,10 +420,10 @@ os_thread_join(korp_tid thread, void **value_ptr) p = p->next; p->next = node; } - mutex_unlock(&thread_data->wait_list_lock); + zmutex_unlock(&thread_data->wait_list_lock); /* Wait the sem */ - sem_take(&node->sem, K_FOREVER); + zsem_take(&node->sem, K_FOREVER); /* Wait some time for the thread to be actually terminated */ k_sleep(Z_TIMEOUT_MS(100)); @@ -436,14 +436,14 @@ os_thread_join(korp_tid thread, void **value_ptr) int os_mutex_init(korp_mutex *mutex) { - mutex_init(mutex); + zmutex_init(mutex); return BHT_OK; } int os_recursive_mutex_init(korp_mutex *mutex) { - mutex_init(mutex); + zmutex_init(mutex); return BHT_OK; } @@ -457,16 +457,16 @@ os_mutex_destroy(korp_mutex *mutex) int os_mutex_lock(korp_mutex *mutex) { - return mutex_lock(mutex, K_FOREVER); + return zmutex_lock(mutex, K_FOREVER); } int os_mutex_unlock(korp_mutex *mutex) { #if KERNEL_VERSION_NUMBER >= 0x020200 /* version 2.2.0 */ - return mutex_unlock(mutex); + return zmutex_unlock(mutex); #else - mutex_unlock(mutex); + zmutex_unlock(mutex); return 0; #endif } @@ -474,7 +474,7 @@ os_mutex_unlock(korp_mutex *mutex) int os_cond_init(korp_cond *cond) { - mutex_init(&cond->wait_list_lock); + zmutex_init(&cond->wait_list_lock); cond->thread_wait_list = NULL; return BHT_OK; } @@ -495,10 +495,10 @@ os_cond_wait_internal(korp_cond *cond, korp_mutex *mutex, bool timed, int mills) if (!(node = BH_MALLOC(sizeof(os_thread_wait_node)))) return BHT_ERROR; - sem_init(&node->sem, 0, 1); + zsem_init(&node->sem, 0, 1); node->next = NULL; - mutex_lock(&cond->wait_list_lock, K_FOREVER); + zmutex_lock(&cond->wait_list_lock, K_FOREVER); if (!cond->thread_wait_list) cond->thread_wait_list = node; else { @@ -508,15 +508,15 @@ os_cond_wait_internal(korp_cond *cond, korp_mutex *mutex, bool timed, int mills) p = p->next; p->next = node; } - mutex_unlock(&cond->wait_list_lock); + zmutex_unlock(&cond->wait_list_lock); /* Unlock mutex, wait sem and lock mutex again */ - mutex_unlock(mutex); - sem_take(&node->sem, timed ? Z_TIMEOUT_MS(mills) : K_FOREVER); - mutex_lock(mutex, K_FOREVER); + zmutex_unlock(mutex); + zsem_take(&node->sem, timed ? Z_TIMEOUT_MS(mills) : K_FOREVER); + zmutex_lock(mutex, K_FOREVER); /* Remove wait node from wait list */ - mutex_lock(&cond->wait_list_lock, K_FOREVER); + zmutex_lock(&cond->wait_list_lock, K_FOREVER); if (cond->thread_wait_list == node) cond->thread_wait_list = node->next; else { @@ -527,7 +527,7 @@ os_cond_wait_internal(korp_cond *cond, korp_mutex *mutex, bool timed, int mills) p->next = node->next; } BH_FREE(node); - mutex_unlock(&cond->wait_list_lock); + zmutex_unlock(&cond->wait_list_lock); return BHT_OK; } @@ -565,10 +565,10 @@ int os_cond_signal(korp_cond *cond) { /* Signal the head wait node of wait list */ - mutex_lock(&cond->wait_list_lock, K_FOREVER); + zmutex_lock(&cond->wait_list_lock, K_FOREVER); if (cond->thread_wait_list) - sem_give(&cond->thread_wait_list->sem); - mutex_unlock(&cond->wait_list_lock); + zsem_give(&cond->thread_wait_list->sem); + zmutex_unlock(&cond->wait_list_lock); return BHT_OK; } @@ -588,6 +588,67 @@ void os_thread_jit_write_protect_np(bool enabled) {} +int +os_rwlock_init(korp_rwlock *lock) +{ + if (!lock) { + return BHT_ERROR; + } + + k_mutex_init(&lock->mtx); + k_sem_init(&lock->sem, 0, K_SEM_MAX_LIMIT); + lock->read_count = 0; + + return BHT_OK; +} + +int +os_rwlock_rdlock(korp_rwlock *lock) +{ + /* Not implemented */ + return BHT_ERROR; +} + +int +os_rwlock_wrlock(korp_rwlock *lock) +{ + // Acquire the mutex to ensure exclusive access + if (k_mutex_lock(&lock->mtx, K_FOREVER) != 0) { + return BHT_ERROR; + } + + // Wait until there are no readers + while (lock->read_count > 0) { + // Release the mutex while we're waiting + k_mutex_unlock(&lock->mtx); + + // Wait for a short time + k_sleep(K_MSEC(1)); + + // Re-acquire the mutex + if (k_mutex_lock(&lock->mtx, K_FOREVER) != 0) { + return BHT_ERROR; + } + } + // At this point, we hold the mutex and there are no readers, so we have the + // write lock + return BHT_OK; +} + +int +os_rwlock_unlock(korp_rwlock *lock) +{ + k_mutex_unlock(&lock->mtx); + return BHT_OK; +} + +int +os_rwlock_destroy(korp_rwlock *lock) +{ + /* Not implemented */ + return BHT_ERROR; +} + int os_thread_detach(korp_tid thread) { @@ -607,13 +668,88 @@ int os_cond_broadcast(korp_cond *cond) { os_thread_wait_node *node; - mutex_lock(&cond->wait_list_lock, K_FOREVER); + zmutex_lock(&cond->wait_list_lock, K_FOREVER); node = cond->thread_wait_list; while (node) { os_thread_wait_node *next = node->next; - sem_give(&node->sem); + zsem_give(&node->sem); node = next; } - mutex_unlock(&cond->wait_list_lock); + zmutex_unlock(&cond->wait_list_lock); return BHT_OK; } + +korp_sem * +os_sem_open(const char *name, int oflags, int mode, int val) +{ + /* Not implemented */ + return NULL; +} + +int +os_sem_close(korp_sem *sem) +{ + /* Not implemented */ + return BHT_ERROR; +} + +int +os_sem_wait(korp_sem *sem) +{ + /* Not implemented */ + return BHT_ERROR; +} + +int +os_sem_trywait(korp_sem *sem) +{ + /* Not implemented */ + return BHT_ERROR; +} + +int +os_sem_post(korp_sem *sem) +{ + /* Not implemented */ + return BHT_ERROR; +} + +int +os_sem_getvalue(korp_sem *sem, int *sval) +{ + /* Not implemented */ + return BHT_ERROR; +} + +int +os_sem_unlink(const char *name) +{ + /* Not implemented */ + return BHT_ERROR; +} + +int +os_blocking_op_init() +{ + /* Not implemented */ + return BHT_ERROR; +} + +void +os_begin_blocking_op() +{ + /* Not implemented */ +} + +void +os_end_blocking_op() +{ + /* Not implemented */ +} + +int +os_wakeup_blocking_op(korp_tid tid) +{ + /* Not implemented */ + return BHT_ERROR; +} \ No newline at end of file diff --git a/product-mini/platforms/zephyr/simple-file/CMakeLists.txt b/product-mini/platforms/zephyr/simple-file/CMakeLists.txt new file mode 100644 index 0000000000..409bafa4d7 --- /dev/null +++ b/product-mini/platforms/zephyr/simple-file/CMakeLists.txt @@ -0,0 +1,91 @@ +# Copyright (C) 2019 Intel Corporation. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception + +cmake_minimum_required(VERSION 3.8.2) + +find_package(Zephyr REQUIRED HINTS $ENV{ZEPHYR_BASE}) +project(wamr) + +enable_language (ASM) + +set (WAMR_BUILD_PLATFORM "zephyr") + +# WAMR Configuration: +set (WAMR_BUILD_TARGET "THUMB") +set (WAMR_BUILD_INTERP 1) +set (WAMR_BUILD_FAST_INTERP 0) +set (WAMR_BUILD_AOT 1) +set (WAMR_BUILD_LIBC_BUILTIN 1) # printf +set (WAMR_BUILD_LIBC_WASI 1) +set (WAMR_BUILD_LIB_PTHREAD 0) +set (WAMR_BUILD_GLOBAL_HEAP_POOL 1) +set (WAMR_BUILD_GLOBAL_HEAP_SIZE 131072) # 128 KB +# set (WAMR_BUILD_GLOBAL_HEAP_SIZE 65536) # 64 KB + +# Environment variables: + +# Check if WAMR_ROOT_DIR is set +if(DEFINED ENV{WAMR_ROOT_DIR}) + set(WAMR_ROOT_DIR $ENV{WAMR_ROOT_DIR}) +else() + message(FATAL_ERROR "'WAMR_ROOT_DIR' need to be specified") +endif() +message("wasi-sdk was found at ${WAMR_ROOT_DIR}") + +# Check if WASI_SDK_PATH is set +if(NOT $ENV{WASI_SDK_PATH} STREQUAL "") + set(WASI_SDK_PATH $ENV{WASI_SDK_PATH}) +else() + find_program(WASM_C_COMPILER clang /opt/wasi-sdk/bin NO_DEFAULT_PATH) + if(NOT WASM_C_COMPILER) + message(FATAL_ERROR "'wasi-sdk' not found, please ensure wasi-sdk is installed.\ + You can download and install it from\ + https://github.com/WebAssembly/wasi-sdk/releases") + else() + set(WASI_SDK_PATH /opt/wasi-sdk) + endif() +endif() +message("wasi-sdk was found at ${WASI_SDK_PATH}") + +# Check if WAMR_APP_FRAMEWORK_DIR is set +if (DEFINED ENV{WAMR_APP_FRAMEWORK_DIR}) + set(WAMR_APP_FRAMEWORK_DIR $ENV{WAMR_APP_FRAMEWORK_DIR}) +else() + message(FATAL_ERROR "'wamr-app-framework' not found, please ensure they are installed.\ + You can download and install them from\ + https://github.com/bytecodealliance/wamr-app-framework") +endif() +message("wamr-app-framework was found at ${WAMR_APP_FRAMEWORK_DIR}") + +# set the WAMR_SDK_DIR with the path specified in the environment variable +set(WAMR_SDK_DIR + ${WAMR_APP_FRAMEWORK_DIR}/wamr-sdk +) + +# set the WAMR_LIBC_BUILTIN_DIR +set(WAMR_LIBC_BUILTIN_DIR + ${WAMR_SDK_DIR}/wamr-sdk/app/libc-builtin-sysroot +) + +# set the WAMR_SDK_PACKAGE_OUT_DIR +set(WAMR_SDK_PACKAGE_OUT_DIR + ${CMAKE_CURRENT_BINARY_DIR}/wamr-sdk/app-sdk/wamr-app-framework +) + +# # Reset linker flags +# set(CMAKE_SHARED_LIBRARY_LINK_C_FLAGS "") +# set(CMAKE_SHARED_LIBRARY_LINK_CXX_FLAGS "") + +include (${WAMR_ROOT_DIR}/build-scripts/runtime_lib.cmake) +# include (${SHARED_DIR}/utils/uncommon/shared_uncommon.cmake) # in socket-api sample + +# Build the WAMR runtime +target_sources(app PRIVATE + ${WAMR_RUNTIME_LIB_SOURCE} + src/main.c) + +# Link libraries like in samples. +set(WASI_LIBM "${WASI_SDK_PATH}/share/wasi-sysroot/lib/wasm32-wasi/libm.a") +set(WASI_LIBDL "${WASI_SDK_PATH}/share/wasi-sysroot/lib/wasm32-wasi/libdl.a") + +target_link_libraries(app PUBLIC ${WASI_LIBM} ${WASI_LIBDL}) \ No newline at end of file diff --git a/product-mini/platforms/zephyr/simple-file/README.md b/product-mini/platforms/zephyr/simple-file/README.md new file mode 100644 index 0000000000..a00aecb3a1 --- /dev/null +++ b/product-mini/platforms/zephyr/simple-file/README.md @@ -0,0 +1,91 @@ +# File sample +This sample demonstrates the use of WASI API to interact with the file system. + +> 🛠️ **Work in progress:** The sample is functional but be aware that just a small part of WASI File System API was tested. +> Actual Zephyr APIs: +> * directory creation = `fs_mkdir` +> * file opening/creation = `fs_open` +> * file write = `fs_write` +> * file offset = `fs_seek` +> * file read = `fs_read` +> * file close = `fs_close` +> * directory close = `fs_closedir` + +## Run Command +* **Zephyr Build** + 1. **Build:** Replace `nucleo_h743zi` with your board name and the `WAMR_BUILD_TARGET` in `CMakeList.txt` with your target architecture. + ```bash + ZEPHYR_BASE=~/zephyrproject/zephyr \ + WAMR_ROOT_DIR=~/wasm-micro-runtime \ + WASI_SDK_PATH=~/wasi-sdk-21.0 \ + WAMR_APP_FRAMEWORK_DIR=~/wamr-app-framework \ + west build . -b nucleo_h563zi -p always + ``` + ⚠️ **Warning:** The flags `ZEPHYR_BASE`, `WAMR_ROOT_DIR`, `WASI_SDK_PATH`, and `WAMR_APP_FRAMEWORK_DIR` need to be set otherwise the build will fail. + + 2. **Flash:** + ```bash + ZEPHYR_BASE=~/zephyrproject/zephyr west flash + ``` + + 3. **Monitor:** Use a serial link to monitor the output. Personally, I use minicom. + ```bash + minicom -D /dev/ttyACM0 + ``` + + 4. **Debug:** Curently investigating. + +* **WebAssembly Module** + + ❗ **Important:** I used wasi-sdk 21 to compile the module. I still haven't tried the module with the new wasi-sdk 22. + + 1. **Compile:** in the `wasm-apps` folder. + ```bash + ~/wasi-sdk-21.0/bin/clang --sysroot=/home/user/wasi-sdk-21.0/share/wasi-sysroot -nodefaultlibs -lc -o file.wasm file.c -z stack-size=8192 -Wl,--initial-memory=65536 -Wl,--export=__heap_base -Wl,--export=__data_end + ``` + 2. **generate a C header:** Use `xxd` or other tool, I also put simple python script. At application root `simple-file/`. + ```bash + python3 to_c_header.py + ``` + Be free to modify the script to fit your needs. + +## Output +The output should be similar to the following: +```bash +*** Booting Zephyr OS build v3.6.0-4305-g2ec8f442a505 *** +Area 3 at 0x1f0000 on flash-controller@40022000 for 65536 bytes +[00:00:00.067,000] littlefs: LittleFS version 2.8, disk version 2.1 +[00:00:00.074,000] littlefs: FS at flash-controller@40022000:0x1f0000 is 8 0x2000-byte blocks with 512 cycle +[00:00:00.085,000] littlefs: sizes: rd 16 ; pr 16 ; ca 64 ; la 32 +[00:00:00.092,000] littlefs: WEST_TOPDIR/modules/fs/littlefs/lfs.c:1351: Corrupted dir pair at {0x0, 0x1} +[00:00:00.103,000] littlefs: can't mount (LFS -84); formatting +[00:00:00.114,000] littlefs: /lfs mounted +/lfs mount: 0 +[00:00:00.120,000] main: stdin = 0 +[00:00:00.124,000] main: stdout = 1 +[00:00:00.128,000] main: stderr = 2 +[00:00:00.133,000] main: global heap size: 131072 +[00:00:00.142,000] main: Wasm file size: 34682 +[00:00:00:000 - 2000AFE0]: WASI context initialization: START + +[OS] os_rwlock_init +[OS] os_rwlock_init +[00:00:00:000 - 2000AFE0]: WASI context initialization: END + +[00:00:00.190,000] main: main found +Hello WebAssembly Module ! + +mkdir returned 0 +fopen Succeed +fwrite returned 13 +fseek returned 0 +fread returned 13 +buffer read = Hello, World! + +[00:00:00.225,000] main: main executed +[00:00:00.230,000] main: wasi exit code: 0 +[00:00:00.239,000] main: elapsed: 178ms +[00:00:03.158,000] phy_mii: PHY (0) Link speed 100 Mb, full duplex + +[00:00:00.051,000] phy_mii: PHY (0) ID 7C131 +``` \ No newline at end of file diff --git a/product-mini/platforms/zephyr/simple-file/prj.conf b/product-mini/platforms/zephyr/simple-file/prj.conf new file mode 100644 index 0000000000..ca9d2fc373 --- /dev/null +++ b/product-mini/platforms/zephyr/simple-file/prj.conf @@ -0,0 +1,40 @@ +# Copyright (C) 2019 Intel Corporation. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception + +# Log config +CONFIG_PRINTK=y +CONFIG_LOG=y +CONFIG_LOG_MODE_IMMEDIATE=y +# CONFIG_LOG_MODE_DEFERRED=y + +CONFIG_MAIN_STACK_SIZE=8192 +# CONFIG_HEAP_MEM_POOL_SIZE=32768 +CONFIG_REQUIRES_FULL_LIBC=y + +# Config File System +CONFIG_POSIX_API=n +CONFIG_FILE_SYSTEM=y +CONFIG_FILE_SYSTEM_LITTLEFS=y +# CONFIG_FS_LITTLEFS_BLK_DEV=y + +# Temp Build Network stack to compile. +CONFIG_NETWORKING=y +CONFIG_NET_IPV4=y +CONFIG_NET_IPV6=y +CONFIG_NET_TCP=y +CONFIG_NET_SOCKETS=y + + +# Random generator +CONFIG_TEST_RANDOM_GENERATOR=y + +# Stack conf +CONFIG_STACK_SENTINEL=y +CONFIG_HW_STACK_PROTECTION=y + +# Flash +CONFIG_FLASH=y +CONFIG_FLASH_MAP=y + +# Debug +CONFIG_DEBUG=y \ No newline at end of file diff --git a/product-mini/platforms/zephyr/simple-file/src/file.h b/product-mini/platforms/zephyr/simple-file/src/file.h new file mode 100644 index 0000000000..eba5266809 --- /dev/null +++ b/product-mini/platforms/zephyr/simple-file/src/file.h @@ -0,0 +1,2898 @@ +/* + * Copyright (C) 2024 Grenoble INP - ESISAR. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception + */ + +unsigned char __aligned(4) wasm_test_file[] = { + 0x00, 0x61, 0x73, 0x6d, 0x01, 0x00, 0x00, 0x00, 0x01, 0x6b, 0x0f, 0x60, + 0x03, 0x7f, 0x7f, 0x7f, 0x01, 0x7f, 0x60, 0x03, 0x7f, 0x7e, 0x7f, 0x01, + 0x7e, 0x60, 0x01, 0x7f, 0x01, 0x7f, 0x60, 0x02, 0x7f, 0x7f, 0x01, 0x7f, + 0x60, 0x04, 0x7f, 0x7f, 0x7f, 0x7f, 0x01, 0x7f, 0x60, 0x04, 0x7f, 0x7e, + 0x7f, 0x7f, 0x01, 0x7f, 0x60, 0x09, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7e, + 0x7e, 0x7f, 0x7f, 0x01, 0x7f, 0x60, 0x01, 0x7f, 0x00, 0x60, 0x00, 0x00, + 0x60, 0x05, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x01, 0x7f, 0x60, 0x00, 0x01, + 0x7f, 0x60, 0x08, 0x7f, 0x7f, 0x7f, 0x7f, 0x7e, 0x7e, 0x7f, 0x7f, 0x01, + 0x7f, 0x60, 0x02, 0x7c, 0x7f, 0x01, 0x7c, 0x60, 0x03, 0x7f, 0x7f, 0x7f, + 0x00, 0x60, 0x05, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x00, 0x02, 0xef, 0x03, + 0x0d, 0x16, 0x77, 0x61, 0x73, 0x69, 0x5f, 0x73, 0x6e, 0x61, 0x70, 0x73, + 0x68, 0x6f, 0x74, 0x5f, 0x70, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x31, + 0x08, 0x61, 0x72, 0x67, 0x73, 0x5f, 0x67, 0x65, 0x74, 0x00, 0x03, 0x16, + 0x77, 0x61, 0x73, 0x69, 0x5f, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, + 0x74, 0x5f, 0x70, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x31, 0x0e, 0x61, + 0x72, 0x67, 0x73, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x73, 0x5f, 0x67, 0x65, + 0x74, 0x00, 0x03, 0x16, 0x77, 0x61, 0x73, 0x69, 0x5f, 0x73, 0x6e, 0x61, + 0x70, 0x73, 0x68, 0x6f, 0x74, 0x5f, 0x70, 0x72, 0x65, 0x76, 0x69, 0x65, + 0x77, 0x31, 0x08, 0x66, 0x64, 0x5f, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x00, + 0x02, 0x16, 0x77, 0x61, 0x73, 0x69, 0x5f, 0x73, 0x6e, 0x61, 0x70, 0x73, + 0x68, 0x6f, 0x74, 0x5f, 0x70, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x31, + 0x0d, 0x66, 0x64, 0x5f, 0x66, 0x64, 0x73, 0x74, 0x61, 0x74, 0x5f, 0x67, + 0x65, 0x74, 0x00, 0x03, 0x16, 0x77, 0x61, 0x73, 0x69, 0x5f, 0x73, 0x6e, + 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x5f, 0x70, 0x72, 0x65, 0x76, 0x69, + 0x65, 0x77, 0x31, 0x13, 0x66, 0x64, 0x5f, 0x66, 0x64, 0x73, 0x74, 0x61, + 0x74, 0x5f, 0x73, 0x65, 0x74, 0x5f, 0x66, 0x6c, 0x61, 0x67, 0x73, 0x00, + 0x03, 0x16, 0x77, 0x61, 0x73, 0x69, 0x5f, 0x73, 0x6e, 0x61, 0x70, 0x73, + 0x68, 0x6f, 0x74, 0x5f, 0x70, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x31, + 0x0e, 0x66, 0x64, 0x5f, 0x70, 0x72, 0x65, 0x73, 0x74, 0x61, 0x74, 0x5f, + 0x67, 0x65, 0x74, 0x00, 0x03, 0x16, 0x77, 0x61, 0x73, 0x69, 0x5f, 0x73, + 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x5f, 0x70, 0x72, 0x65, 0x76, + 0x69, 0x65, 0x77, 0x31, 0x13, 0x66, 0x64, 0x5f, 0x70, 0x72, 0x65, 0x73, + 0x74, 0x61, 0x74, 0x5f, 0x64, 0x69, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, + 0x00, 0x00, 0x16, 0x77, 0x61, 0x73, 0x69, 0x5f, 0x73, 0x6e, 0x61, 0x70, + 0x73, 0x68, 0x6f, 0x74, 0x5f, 0x70, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, + 0x31, 0x07, 0x66, 0x64, 0x5f, 0x72, 0x65, 0x61, 0x64, 0x00, 0x04, 0x16, + 0x77, 0x61, 0x73, 0x69, 0x5f, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, + 0x74, 0x5f, 0x70, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x31, 0x07, 0x66, + 0x64, 0x5f, 0x73, 0x65, 0x65, 0x6b, 0x00, 0x05, 0x16, 0x77, 0x61, 0x73, + 0x69, 0x5f, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x5f, 0x70, + 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x31, 0x08, 0x66, 0x64, 0x5f, 0x77, + 0x72, 0x69, 0x74, 0x65, 0x00, 0x04, 0x16, 0x77, 0x61, 0x73, 0x69, 0x5f, + 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x5f, 0x70, 0x72, 0x65, + 0x76, 0x69, 0x65, 0x77, 0x31, 0x15, 0x70, 0x61, 0x74, 0x68, 0x5f, 0x63, + 0x72, 0x65, 0x61, 0x74, 0x65, 0x5f, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, + 0x6f, 0x72, 0x79, 0x00, 0x00, 0x16, 0x77, 0x61, 0x73, 0x69, 0x5f, 0x73, + 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x5f, 0x70, 0x72, 0x65, 0x76, + 0x69, 0x65, 0x77, 0x31, 0x09, 0x70, 0x61, 0x74, 0x68, 0x5f, 0x6f, 0x70, + 0x65, 0x6e, 0x00, 0x06, 0x16, 0x77, 0x61, 0x73, 0x69, 0x5f, 0x73, 0x6e, + 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x5f, 0x70, 0x72, 0x65, 0x76, 0x69, + 0x65, 0x77, 0x31, 0x09, 0x70, 0x72, 0x6f, 0x63, 0x5f, 0x65, 0x78, 0x69, + 0x74, 0x00, 0x07, 0x03, 0x57, 0x56, 0x08, 0x09, 0x08, 0x02, 0x02, 0x07, + 0x07, 0x03, 0x07, 0x0a, 0x03, 0x03, 0x02, 0x03, 0x03, 0x03, 0x00, 0x04, + 0x05, 0x04, 0x03, 0x0b, 0x07, 0x08, 0x02, 0x08, 0x08, 0x00, 0x00, 0x02, + 0x02, 0x02, 0x00, 0x00, 0x02, 0x00, 0x01, 0x01, 0x0a, 0x08, 0x08, 0x02, + 0x00, 0x04, 0x03, 0x03, 0x02, 0x00, 0x03, 0x00, 0x03, 0x0c, 0x03, 0x00, + 0x09, 0x0d, 0x0e, 0x08, 0x03, 0x00, 0x02, 0x08, 0x03, 0x04, 0x00, 0x00, + 0x03, 0x03, 0x03, 0x03, 0x03, 0x02, 0x00, 0x00, 0x00, 0x00, 0x02, 0x03, + 0x03, 0x00, 0x02, 0x04, 0x02, 0x07, 0x02, 0x03, 0x04, 0x05, 0x01, 0x70, + 0x01, 0x06, 0x06, 0x05, 0x03, 0x01, 0x00, 0x01, 0x06, 0x1a, 0x04, 0x7f, + 0x01, 0x41, 0x80, 0xeb, 0x00, 0x0b, 0x7f, 0x00, 0x41, 0x00, 0x0b, 0x7f, + 0x00, 0x41, 0x80, 0xeb, 0x00, 0x0b, 0x7f, 0x00, 0x41, 0xfc, 0x2a, 0x0b, + 0x07, 0x2e, 0x04, 0x06, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x02, 0x00, + 0x06, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x00, 0x0f, 0x0b, 0x5f, 0x5f, + 0x68, 0x65, 0x61, 0x70, 0x5f, 0x62, 0x61, 0x73, 0x65, 0x03, 0x02, 0x0a, + 0x5f, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x65, 0x6e, 0x64, 0x03, 0x03, + 0x09, 0x0b, 0x01, 0x00, 0x41, 0x01, 0x0b, 0x05, 0x2e, 0x2c, 0x30, 0x32, + 0x58, 0x0a, 0xe0, 0xe2, 0x01, 0x56, 0x02, 0x00, 0x0b, 0x03, 0x00, 0x00, + 0x0b, 0x52, 0x01, 0x01, 0x7f, 0x02, 0x40, 0x02, 0x40, 0x23, 0x81, 0x80, + 0x80, 0x80, 0x00, 0x41, 0xb0, 0x9e, 0x80, 0x80, 0x00, 0x6a, 0x28, 0x02, + 0x00, 0x0d, 0x00, 0x23, 0x81, 0x80, 0x80, 0x80, 0x00, 0x41, 0xb0, 0x9e, + 0x80, 0x80, 0x00, 0x6a, 0x41, 0x01, 0x36, 0x02, 0x00, 0x10, 0x8d, 0x80, + 0x80, 0x80, 0x00, 0x10, 0x96, 0x80, 0x80, 0x80, 0x00, 0x21, 0x00, 0x10, + 0xa7, 0x80, 0x80, 0x80, 0x00, 0x20, 0x00, 0x0d, 0x01, 0x0f, 0x0b, 0x00, + 0x00, 0x0b, 0x20, 0x00, 0x10, 0xa3, 0x80, 0x80, 0x80, 0x00, 0x00, 0x0b, + 0x0a, 0x00, 0x20, 0x00, 0x10, 0x91, 0x80, 0x80, 0x80, 0x00, 0x0b, 0xab, + 0x32, 0x01, 0x0b, 0x7f, 0x23, 0x80, 0x80, 0x80, 0x80, 0x00, 0x41, 0x10, + 0x6b, 0x22, 0x01, 0x24, 0x80, 0x80, 0x80, 0x80, 0x00, 0x02, 0x40, 0x02, + 0x40, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, 0x02, + 0x40, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, 0x02, + 0x40, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, 0x41, 0x00, 0x28, 0x02, 0xd0, + 0x9e, 0x80, 0x80, 0x00, 0x22, 0x02, 0x0d, 0x00, 0x02, 0x40, 0x41, 0x00, + 0x28, 0x02, 0x90, 0xa2, 0x80, 0x80, 0x00, 0x22, 0x03, 0x0d, 0x00, 0x41, + 0x00, 0x42, 0x7f, 0x37, 0x02, 0x9c, 0xa2, 0x80, 0x80, 0x00, 0x41, 0x00, + 0x42, 0x80, 0x80, 0x84, 0x80, 0x80, 0x80, 0xc0, 0x00, 0x37, 0x02, 0x94, + 0xa2, 0x80, 0x80, 0x00, 0x41, 0x00, 0x20, 0x01, 0x41, 0x08, 0x6a, 0x41, + 0x70, 0x71, 0x41, 0xd8, 0xaa, 0xd5, 0xaa, 0x05, 0x73, 0x22, 0x03, 0x36, + 0x02, 0x90, 0xa2, 0x80, 0x80, 0x00, 0x41, 0x00, 0x41, 0x00, 0x36, 0x02, + 0xa4, 0xa2, 0x80, 0x80, 0x00, 0x41, 0x00, 0x41, 0x00, 0x36, 0x02, 0xf4, + 0xa1, 0x80, 0x80, 0x00, 0x0b, 0x41, 0x80, 0x80, 0x84, 0x80, 0x00, 0x41, + 0x80, 0xeb, 0x80, 0x80, 0x00, 0x49, 0x0d, 0x01, 0x41, 0x00, 0x21, 0x02, + 0x41, 0x80, 0x80, 0x84, 0x80, 0x00, 0x41, 0x80, 0xeb, 0x80, 0x80, 0x00, + 0x6b, 0x41, 0xd9, 0x00, 0x49, 0x0d, 0x00, 0x41, 0x00, 0x21, 0x04, 0x41, + 0x00, 0x41, 0x80, 0xeb, 0x80, 0x80, 0x00, 0x36, 0x02, 0xf8, 0xa1, 0x80, + 0x80, 0x00, 0x41, 0x00, 0x41, 0x80, 0xeb, 0x80, 0x80, 0x00, 0x36, 0x02, + 0xc8, 0x9e, 0x80, 0x80, 0x00, 0x41, 0x00, 0x20, 0x03, 0x36, 0x02, 0xdc, + 0x9e, 0x80, 0x80, 0x00, 0x41, 0x00, 0x41, 0x7f, 0x36, 0x02, 0xd8, 0x9e, + 0x80, 0x80, 0x00, 0x41, 0x00, 0x41, 0x80, 0x80, 0x84, 0x80, 0x00, 0x41, + 0x80, 0xeb, 0x80, 0x80, 0x00, 0x6b, 0x36, 0x02, 0xfc, 0xa1, 0x80, 0x80, + 0x00, 0x03, 0x40, 0x20, 0x04, 0x41, 0xf4, 0x9e, 0x80, 0x80, 0x00, 0x6a, + 0x20, 0x04, 0x41, 0xe8, 0x9e, 0x80, 0x80, 0x00, 0x6a, 0x22, 0x03, 0x36, + 0x02, 0x00, 0x20, 0x03, 0x20, 0x04, 0x41, 0xe0, 0x9e, 0x80, 0x80, 0x00, + 0x6a, 0x22, 0x05, 0x36, 0x02, 0x00, 0x20, 0x04, 0x41, 0xec, 0x9e, 0x80, + 0x80, 0x00, 0x6a, 0x20, 0x05, 0x36, 0x02, 0x00, 0x20, 0x04, 0x41, 0xfc, + 0x9e, 0x80, 0x80, 0x00, 0x6a, 0x20, 0x04, 0x41, 0xf0, 0x9e, 0x80, 0x80, + 0x00, 0x6a, 0x22, 0x05, 0x36, 0x02, 0x00, 0x20, 0x05, 0x20, 0x03, 0x36, + 0x02, 0x00, 0x20, 0x04, 0x41, 0x84, 0x9f, 0x80, 0x80, 0x00, 0x6a, 0x20, + 0x04, 0x41, 0xf8, 0x9e, 0x80, 0x80, 0x00, 0x6a, 0x22, 0x03, 0x36, 0x02, + 0x00, 0x20, 0x03, 0x20, 0x05, 0x36, 0x02, 0x00, 0x20, 0x04, 0x41, 0x80, + 0x9f, 0x80, 0x80, 0x00, 0x6a, 0x20, 0x03, 0x36, 0x02, 0x00, 0x20, 0x04, + 0x41, 0x20, 0x6a, 0x22, 0x04, 0x41, 0x80, 0x02, 0x47, 0x0d, 0x00, 0x0b, + 0x41, 0x80, 0xeb, 0x80, 0x80, 0x00, 0x41, 0x78, 0x41, 0x80, 0xeb, 0x80, + 0x80, 0x00, 0x6b, 0x41, 0x0f, 0x71, 0x22, 0x04, 0x6a, 0x22, 0x02, 0x41, + 0x04, 0x6a, 0x41, 0x80, 0x80, 0x84, 0x80, 0x00, 0x41, 0x80, 0xeb, 0x80, + 0x80, 0x00, 0x6b, 0x41, 0x48, 0x6a, 0x22, 0x03, 0x20, 0x04, 0x6b, 0x22, + 0x04, 0x41, 0x01, 0x72, 0x36, 0x02, 0x00, 0x41, 0x00, 0x41, 0x00, 0x28, + 0x02, 0xa0, 0xa2, 0x80, 0x80, 0x00, 0x36, 0x02, 0xd4, 0x9e, 0x80, 0x80, + 0x00, 0x41, 0x00, 0x20, 0x04, 0x36, 0x02, 0xc4, 0x9e, 0x80, 0x80, 0x00, + 0x41, 0x00, 0x20, 0x02, 0x36, 0x02, 0xd0, 0x9e, 0x80, 0x80, 0x00, 0x20, + 0x03, 0x41, 0x80, 0xeb, 0x80, 0x80, 0x00, 0x6a, 0x41, 0x04, 0x6a, 0x41, + 0x38, 0x36, 0x02, 0x00, 0x0b, 0x02, 0x40, 0x02, 0x40, 0x20, 0x00, 0x41, + 0xec, 0x01, 0x4b, 0x0d, 0x00, 0x02, 0x40, 0x41, 0x00, 0x28, 0x02, 0xb8, + 0x9e, 0x80, 0x80, 0x00, 0x22, 0x06, 0x41, 0x10, 0x20, 0x00, 0x41, 0x13, + 0x6a, 0x41, 0x70, 0x71, 0x20, 0x00, 0x41, 0x0b, 0x49, 0x1b, 0x22, 0x07, + 0x41, 0x03, 0x76, 0x22, 0x03, 0x76, 0x22, 0x04, 0x41, 0x03, 0x71, 0x45, + 0x0d, 0x00, 0x02, 0x40, 0x02, 0x40, 0x20, 0x04, 0x41, 0x01, 0x71, 0x20, + 0x03, 0x72, 0x41, 0x01, 0x73, 0x22, 0x05, 0x41, 0x03, 0x74, 0x22, 0x03, + 0x41, 0xe0, 0x9e, 0x80, 0x80, 0x00, 0x6a, 0x22, 0x04, 0x20, 0x03, 0x41, + 0xe8, 0x9e, 0x80, 0x80, 0x00, 0x6a, 0x28, 0x02, 0x00, 0x22, 0x03, 0x28, + 0x02, 0x08, 0x22, 0x07, 0x47, 0x0d, 0x00, 0x41, 0x00, 0x20, 0x06, 0x41, + 0x7e, 0x20, 0x05, 0x77, 0x71, 0x36, 0x02, 0xb8, 0x9e, 0x80, 0x80, 0x00, + 0x0c, 0x01, 0x0b, 0x20, 0x04, 0x20, 0x07, 0x36, 0x02, 0x08, 0x20, 0x07, + 0x20, 0x04, 0x36, 0x02, 0x0c, 0x0b, 0x20, 0x03, 0x41, 0x08, 0x6a, 0x21, + 0x04, 0x20, 0x03, 0x20, 0x05, 0x41, 0x03, 0x74, 0x22, 0x05, 0x41, 0x03, + 0x72, 0x36, 0x02, 0x04, 0x20, 0x03, 0x20, 0x05, 0x6a, 0x22, 0x03, 0x20, + 0x03, 0x28, 0x02, 0x04, 0x41, 0x01, 0x72, 0x36, 0x02, 0x04, 0x0c, 0x12, + 0x0b, 0x20, 0x07, 0x41, 0x00, 0x28, 0x02, 0xc0, 0x9e, 0x80, 0x80, 0x00, + 0x22, 0x08, 0x4d, 0x0d, 0x01, 0x02, 0x40, 0x20, 0x04, 0x45, 0x0d, 0x00, + 0x02, 0x40, 0x02, 0x40, 0x20, 0x04, 0x20, 0x03, 0x74, 0x41, 0x02, 0x20, + 0x03, 0x74, 0x22, 0x04, 0x41, 0x00, 0x20, 0x04, 0x6b, 0x72, 0x71, 0x68, + 0x22, 0x03, 0x41, 0x03, 0x74, 0x22, 0x04, 0x41, 0xe0, 0x9e, 0x80, 0x80, + 0x00, 0x6a, 0x22, 0x05, 0x20, 0x04, 0x41, 0xe8, 0x9e, 0x80, 0x80, 0x00, + 0x6a, 0x28, 0x02, 0x00, 0x22, 0x04, 0x28, 0x02, 0x08, 0x22, 0x00, 0x47, + 0x0d, 0x00, 0x41, 0x00, 0x20, 0x06, 0x41, 0x7e, 0x20, 0x03, 0x77, 0x71, + 0x22, 0x06, 0x36, 0x02, 0xb8, 0x9e, 0x80, 0x80, 0x00, 0x0c, 0x01, 0x0b, + 0x20, 0x05, 0x20, 0x00, 0x36, 0x02, 0x08, 0x20, 0x00, 0x20, 0x05, 0x36, + 0x02, 0x0c, 0x0b, 0x20, 0x04, 0x20, 0x07, 0x41, 0x03, 0x72, 0x36, 0x02, + 0x04, 0x20, 0x04, 0x20, 0x03, 0x41, 0x03, 0x74, 0x22, 0x03, 0x6a, 0x20, + 0x03, 0x20, 0x07, 0x6b, 0x22, 0x05, 0x36, 0x02, 0x00, 0x20, 0x04, 0x20, + 0x07, 0x6a, 0x22, 0x00, 0x20, 0x05, 0x41, 0x01, 0x72, 0x36, 0x02, 0x04, + 0x02, 0x40, 0x20, 0x08, 0x45, 0x0d, 0x00, 0x20, 0x08, 0x41, 0x78, 0x71, + 0x41, 0xe0, 0x9e, 0x80, 0x80, 0x00, 0x6a, 0x21, 0x07, 0x41, 0x00, 0x28, + 0x02, 0xcc, 0x9e, 0x80, 0x80, 0x00, 0x21, 0x03, 0x02, 0x40, 0x02, 0x40, + 0x20, 0x06, 0x41, 0x01, 0x20, 0x08, 0x41, 0x03, 0x76, 0x74, 0x22, 0x09, + 0x71, 0x0d, 0x00, 0x41, 0x00, 0x20, 0x06, 0x20, 0x09, 0x72, 0x36, 0x02, + 0xb8, 0x9e, 0x80, 0x80, 0x00, 0x20, 0x07, 0x21, 0x09, 0x0c, 0x01, 0x0b, + 0x20, 0x07, 0x28, 0x02, 0x08, 0x21, 0x09, 0x0b, 0x20, 0x09, 0x20, 0x03, + 0x36, 0x02, 0x0c, 0x20, 0x07, 0x20, 0x03, 0x36, 0x02, 0x08, 0x20, 0x03, + 0x20, 0x07, 0x36, 0x02, 0x0c, 0x20, 0x03, 0x20, 0x09, 0x36, 0x02, 0x08, + 0x0b, 0x20, 0x04, 0x41, 0x08, 0x6a, 0x21, 0x04, 0x41, 0x00, 0x20, 0x00, + 0x36, 0x02, 0xcc, 0x9e, 0x80, 0x80, 0x00, 0x41, 0x00, 0x20, 0x05, 0x36, + 0x02, 0xc0, 0x9e, 0x80, 0x80, 0x00, 0x0c, 0x12, 0x0b, 0x41, 0x00, 0x28, + 0x02, 0xbc, 0x9e, 0x80, 0x80, 0x00, 0x22, 0x0a, 0x45, 0x0d, 0x01, 0x20, + 0x0a, 0x68, 0x41, 0x02, 0x74, 0x41, 0xe8, 0xa0, 0x80, 0x80, 0x00, 0x6a, + 0x28, 0x02, 0x00, 0x22, 0x00, 0x28, 0x02, 0x04, 0x41, 0x78, 0x71, 0x20, + 0x07, 0x6b, 0x21, 0x03, 0x20, 0x00, 0x21, 0x05, 0x02, 0x40, 0x03, 0x40, + 0x02, 0x40, 0x20, 0x05, 0x28, 0x02, 0x10, 0x22, 0x04, 0x0d, 0x00, 0x20, + 0x05, 0x41, 0x14, 0x6a, 0x28, 0x02, 0x00, 0x22, 0x04, 0x45, 0x0d, 0x02, + 0x0b, 0x20, 0x04, 0x28, 0x02, 0x04, 0x41, 0x78, 0x71, 0x20, 0x07, 0x6b, + 0x22, 0x05, 0x20, 0x03, 0x20, 0x05, 0x20, 0x03, 0x49, 0x22, 0x05, 0x1b, + 0x21, 0x03, 0x20, 0x04, 0x20, 0x00, 0x20, 0x05, 0x1b, 0x21, 0x00, 0x20, + 0x04, 0x21, 0x05, 0x0c, 0x00, 0x0b, 0x0b, 0x20, 0x00, 0x28, 0x02, 0x18, + 0x21, 0x0b, 0x02, 0x40, 0x20, 0x00, 0x28, 0x02, 0x0c, 0x22, 0x09, 0x20, + 0x00, 0x46, 0x0d, 0x00, 0x20, 0x00, 0x28, 0x02, 0x08, 0x22, 0x04, 0x41, + 0x00, 0x28, 0x02, 0xc8, 0x9e, 0x80, 0x80, 0x00, 0x49, 0x1a, 0x20, 0x09, + 0x20, 0x04, 0x36, 0x02, 0x08, 0x20, 0x04, 0x20, 0x09, 0x36, 0x02, 0x0c, + 0x0c, 0x11, 0x0b, 0x02, 0x40, 0x20, 0x00, 0x41, 0x14, 0x6a, 0x22, 0x05, + 0x28, 0x02, 0x00, 0x22, 0x04, 0x0d, 0x00, 0x20, 0x00, 0x28, 0x02, 0x10, + 0x22, 0x04, 0x45, 0x0d, 0x04, 0x20, 0x00, 0x41, 0x10, 0x6a, 0x21, 0x05, + 0x0b, 0x03, 0x40, 0x20, 0x05, 0x21, 0x02, 0x20, 0x04, 0x22, 0x09, 0x41, + 0x14, 0x6a, 0x22, 0x05, 0x28, 0x02, 0x00, 0x22, 0x04, 0x0d, 0x00, 0x20, + 0x09, 0x41, 0x10, 0x6a, 0x21, 0x05, 0x20, 0x09, 0x28, 0x02, 0x10, 0x22, + 0x04, 0x0d, 0x00, 0x0b, 0x20, 0x02, 0x41, 0x00, 0x36, 0x02, 0x00, 0x0c, + 0x10, 0x0b, 0x41, 0x7f, 0x21, 0x07, 0x20, 0x00, 0x41, 0xbf, 0x7f, 0x4b, + 0x0d, 0x00, 0x20, 0x00, 0x41, 0x13, 0x6a, 0x22, 0x04, 0x41, 0x70, 0x71, + 0x21, 0x07, 0x41, 0x00, 0x28, 0x02, 0xbc, 0x9e, 0x80, 0x80, 0x00, 0x22, + 0x0b, 0x45, 0x0d, 0x00, 0x41, 0x00, 0x21, 0x08, 0x02, 0x40, 0x20, 0x07, + 0x41, 0x80, 0x02, 0x49, 0x0d, 0x00, 0x41, 0x1f, 0x21, 0x08, 0x20, 0x07, + 0x41, 0xff, 0xff, 0xff, 0x07, 0x4b, 0x0d, 0x00, 0x20, 0x07, 0x41, 0x26, + 0x20, 0x04, 0x41, 0x08, 0x76, 0x67, 0x22, 0x04, 0x6b, 0x76, 0x41, 0x01, + 0x71, 0x20, 0x04, 0x41, 0x01, 0x74, 0x6b, 0x41, 0x3e, 0x6a, 0x21, 0x08, + 0x0b, 0x41, 0x00, 0x20, 0x07, 0x6b, 0x21, 0x03, 0x02, 0x40, 0x02, 0x40, + 0x02, 0x40, 0x02, 0x40, 0x20, 0x08, 0x41, 0x02, 0x74, 0x41, 0xe8, 0xa0, + 0x80, 0x80, 0x00, 0x6a, 0x28, 0x02, 0x00, 0x22, 0x05, 0x0d, 0x00, 0x41, + 0x00, 0x21, 0x04, 0x41, 0x00, 0x21, 0x09, 0x0c, 0x01, 0x0b, 0x41, 0x00, + 0x21, 0x04, 0x20, 0x07, 0x41, 0x00, 0x41, 0x19, 0x20, 0x08, 0x41, 0x01, + 0x76, 0x6b, 0x20, 0x08, 0x41, 0x1f, 0x46, 0x1b, 0x74, 0x21, 0x00, 0x41, + 0x00, 0x21, 0x09, 0x03, 0x40, 0x02, 0x40, 0x20, 0x05, 0x28, 0x02, 0x04, + 0x41, 0x78, 0x71, 0x20, 0x07, 0x6b, 0x22, 0x06, 0x20, 0x03, 0x4f, 0x0d, + 0x00, 0x20, 0x06, 0x21, 0x03, 0x20, 0x05, 0x21, 0x09, 0x20, 0x06, 0x0d, + 0x00, 0x41, 0x00, 0x21, 0x03, 0x20, 0x05, 0x21, 0x09, 0x20, 0x05, 0x21, + 0x04, 0x0c, 0x03, 0x0b, 0x20, 0x04, 0x20, 0x05, 0x41, 0x14, 0x6a, 0x28, + 0x02, 0x00, 0x22, 0x06, 0x20, 0x06, 0x20, 0x05, 0x20, 0x00, 0x41, 0x1d, + 0x76, 0x41, 0x04, 0x71, 0x6a, 0x41, 0x10, 0x6a, 0x28, 0x02, 0x00, 0x22, + 0x05, 0x46, 0x1b, 0x20, 0x04, 0x20, 0x06, 0x1b, 0x21, 0x04, 0x20, 0x00, + 0x41, 0x01, 0x74, 0x21, 0x00, 0x20, 0x05, 0x0d, 0x00, 0x0b, 0x0b, 0x02, + 0x40, 0x20, 0x04, 0x20, 0x09, 0x72, 0x0d, 0x00, 0x41, 0x00, 0x21, 0x09, + 0x41, 0x02, 0x20, 0x08, 0x74, 0x22, 0x04, 0x41, 0x00, 0x20, 0x04, 0x6b, + 0x72, 0x20, 0x0b, 0x71, 0x22, 0x04, 0x45, 0x0d, 0x03, 0x20, 0x04, 0x68, + 0x41, 0x02, 0x74, 0x41, 0xe8, 0xa0, 0x80, 0x80, 0x00, 0x6a, 0x28, 0x02, + 0x00, 0x21, 0x04, 0x0b, 0x20, 0x04, 0x45, 0x0d, 0x01, 0x0b, 0x03, 0x40, + 0x20, 0x04, 0x28, 0x02, 0x04, 0x41, 0x78, 0x71, 0x20, 0x07, 0x6b, 0x22, + 0x06, 0x20, 0x03, 0x49, 0x21, 0x00, 0x02, 0x40, 0x20, 0x04, 0x28, 0x02, + 0x10, 0x22, 0x05, 0x0d, 0x00, 0x20, 0x04, 0x41, 0x14, 0x6a, 0x28, 0x02, + 0x00, 0x21, 0x05, 0x0b, 0x20, 0x06, 0x20, 0x03, 0x20, 0x00, 0x1b, 0x21, + 0x03, 0x20, 0x04, 0x20, 0x09, 0x20, 0x00, 0x1b, 0x21, 0x09, 0x20, 0x05, + 0x21, 0x04, 0x20, 0x05, 0x0d, 0x00, 0x0b, 0x0b, 0x20, 0x09, 0x45, 0x0d, + 0x00, 0x20, 0x03, 0x41, 0x00, 0x28, 0x02, 0xc0, 0x9e, 0x80, 0x80, 0x00, + 0x20, 0x07, 0x6b, 0x4f, 0x0d, 0x00, 0x20, 0x09, 0x28, 0x02, 0x18, 0x21, + 0x02, 0x02, 0x40, 0x20, 0x09, 0x28, 0x02, 0x0c, 0x22, 0x00, 0x20, 0x09, + 0x46, 0x0d, 0x00, 0x20, 0x09, 0x28, 0x02, 0x08, 0x22, 0x04, 0x41, 0x00, + 0x28, 0x02, 0xc8, 0x9e, 0x80, 0x80, 0x00, 0x49, 0x1a, 0x20, 0x00, 0x20, + 0x04, 0x36, 0x02, 0x08, 0x20, 0x04, 0x20, 0x00, 0x36, 0x02, 0x0c, 0x0c, + 0x0f, 0x0b, 0x02, 0x40, 0x20, 0x09, 0x41, 0x14, 0x6a, 0x22, 0x05, 0x28, + 0x02, 0x00, 0x22, 0x04, 0x0d, 0x00, 0x20, 0x09, 0x28, 0x02, 0x10, 0x22, + 0x04, 0x45, 0x0d, 0x04, 0x20, 0x09, 0x41, 0x10, 0x6a, 0x21, 0x05, 0x0b, + 0x03, 0x40, 0x20, 0x05, 0x21, 0x06, 0x20, 0x04, 0x22, 0x00, 0x41, 0x14, + 0x6a, 0x22, 0x05, 0x28, 0x02, 0x00, 0x22, 0x04, 0x0d, 0x00, 0x20, 0x00, + 0x41, 0x10, 0x6a, 0x21, 0x05, 0x20, 0x00, 0x28, 0x02, 0x10, 0x22, 0x04, + 0x0d, 0x00, 0x0b, 0x20, 0x06, 0x41, 0x00, 0x36, 0x02, 0x00, 0x0c, 0x0e, + 0x0b, 0x02, 0x40, 0x41, 0x00, 0x28, 0x02, 0xc0, 0x9e, 0x80, 0x80, 0x00, + 0x22, 0x04, 0x20, 0x07, 0x49, 0x0d, 0x00, 0x41, 0x00, 0x28, 0x02, 0xcc, + 0x9e, 0x80, 0x80, 0x00, 0x21, 0x03, 0x02, 0x40, 0x02, 0x40, 0x20, 0x04, + 0x20, 0x07, 0x6b, 0x22, 0x05, 0x41, 0x10, 0x49, 0x0d, 0x00, 0x20, 0x03, + 0x20, 0x07, 0x6a, 0x22, 0x00, 0x20, 0x05, 0x41, 0x01, 0x72, 0x36, 0x02, + 0x04, 0x20, 0x03, 0x20, 0x04, 0x6a, 0x20, 0x05, 0x36, 0x02, 0x00, 0x20, + 0x03, 0x20, 0x07, 0x41, 0x03, 0x72, 0x36, 0x02, 0x04, 0x0c, 0x01, 0x0b, + 0x20, 0x03, 0x20, 0x04, 0x41, 0x03, 0x72, 0x36, 0x02, 0x04, 0x20, 0x03, + 0x20, 0x04, 0x6a, 0x22, 0x04, 0x20, 0x04, 0x28, 0x02, 0x04, 0x41, 0x01, + 0x72, 0x36, 0x02, 0x04, 0x41, 0x00, 0x21, 0x00, 0x41, 0x00, 0x21, 0x05, + 0x0b, 0x41, 0x00, 0x20, 0x05, 0x36, 0x02, 0xc0, 0x9e, 0x80, 0x80, 0x00, + 0x41, 0x00, 0x20, 0x00, 0x36, 0x02, 0xcc, 0x9e, 0x80, 0x80, 0x00, 0x20, + 0x03, 0x41, 0x08, 0x6a, 0x21, 0x04, 0x0c, 0x10, 0x0b, 0x02, 0x40, 0x41, + 0x00, 0x28, 0x02, 0xc4, 0x9e, 0x80, 0x80, 0x00, 0x22, 0x05, 0x20, 0x07, + 0x4d, 0x0d, 0x00, 0x20, 0x02, 0x20, 0x07, 0x6a, 0x22, 0x04, 0x20, 0x05, + 0x20, 0x07, 0x6b, 0x22, 0x03, 0x41, 0x01, 0x72, 0x36, 0x02, 0x04, 0x41, + 0x00, 0x20, 0x04, 0x36, 0x02, 0xd0, 0x9e, 0x80, 0x80, 0x00, 0x41, 0x00, + 0x20, 0x03, 0x36, 0x02, 0xc4, 0x9e, 0x80, 0x80, 0x00, 0x20, 0x02, 0x20, + 0x07, 0x41, 0x03, 0x72, 0x36, 0x02, 0x04, 0x20, 0x02, 0x41, 0x08, 0x6a, + 0x21, 0x04, 0x0c, 0x10, 0x0b, 0x02, 0x40, 0x02, 0x40, 0x41, 0x00, 0x28, + 0x02, 0x90, 0xa2, 0x80, 0x80, 0x00, 0x45, 0x0d, 0x00, 0x41, 0x00, 0x28, + 0x02, 0x98, 0xa2, 0x80, 0x80, 0x00, 0x21, 0x03, 0x0c, 0x01, 0x0b, 0x41, + 0x00, 0x42, 0x7f, 0x37, 0x02, 0x9c, 0xa2, 0x80, 0x80, 0x00, 0x41, 0x00, + 0x42, 0x80, 0x80, 0x84, 0x80, 0x80, 0x80, 0xc0, 0x00, 0x37, 0x02, 0x94, + 0xa2, 0x80, 0x80, 0x00, 0x41, 0x00, 0x20, 0x01, 0x41, 0x0c, 0x6a, 0x41, + 0x70, 0x71, 0x41, 0xd8, 0xaa, 0xd5, 0xaa, 0x05, 0x73, 0x36, 0x02, 0x90, + 0xa2, 0x80, 0x80, 0x00, 0x41, 0x00, 0x41, 0x00, 0x36, 0x02, 0xa4, 0xa2, + 0x80, 0x80, 0x00, 0x41, 0x00, 0x41, 0x00, 0x36, 0x02, 0xf4, 0xa1, 0x80, + 0x80, 0x00, 0x41, 0x80, 0x80, 0x04, 0x21, 0x03, 0x0b, 0x41, 0x00, 0x21, + 0x04, 0x02, 0x40, 0x20, 0x03, 0x20, 0x07, 0x41, 0xc7, 0x00, 0x6a, 0x22, + 0x08, 0x6a, 0x22, 0x00, 0x41, 0x00, 0x20, 0x03, 0x6b, 0x22, 0x06, 0x71, + 0x22, 0x09, 0x20, 0x07, 0x4b, 0x0d, 0x00, 0x41, 0x00, 0x41, 0x30, 0x36, + 0x02, 0xb4, 0x9e, 0x80, 0x80, 0x00, 0x0c, 0x10, 0x0b, 0x02, 0x40, 0x41, + 0x00, 0x28, 0x02, 0xf0, 0xa1, 0x80, 0x80, 0x00, 0x22, 0x04, 0x45, 0x0d, + 0x00, 0x02, 0x40, 0x41, 0x00, 0x28, 0x02, 0xe8, 0xa1, 0x80, 0x80, 0x00, + 0x22, 0x03, 0x20, 0x09, 0x6a, 0x22, 0x0b, 0x20, 0x03, 0x4d, 0x0d, 0x00, + 0x20, 0x0b, 0x20, 0x04, 0x4d, 0x0d, 0x01, 0x0b, 0x41, 0x00, 0x21, 0x04, + 0x41, 0x00, 0x41, 0x30, 0x36, 0x02, 0xb4, 0x9e, 0x80, 0x80, 0x00, 0x0c, + 0x10, 0x0b, 0x41, 0x00, 0x2d, 0x00, 0xf4, 0xa1, 0x80, 0x80, 0x00, 0x41, + 0x04, 0x71, 0x0d, 0x05, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, 0x20, 0x02, + 0x45, 0x0d, 0x00, 0x41, 0xf8, 0xa1, 0x80, 0x80, 0x00, 0x21, 0x04, 0x03, + 0x40, 0x02, 0x40, 0x20, 0x04, 0x28, 0x02, 0x00, 0x22, 0x03, 0x20, 0x02, + 0x4b, 0x0d, 0x00, 0x20, 0x03, 0x20, 0x04, 0x28, 0x02, 0x04, 0x6a, 0x20, + 0x02, 0x4b, 0x0d, 0x03, 0x0b, 0x20, 0x04, 0x28, 0x02, 0x08, 0x22, 0x04, + 0x0d, 0x00, 0x0b, 0x0b, 0x41, 0x00, 0x10, 0xa5, 0x80, 0x80, 0x80, 0x00, + 0x22, 0x00, 0x41, 0x7f, 0x46, 0x0d, 0x06, 0x20, 0x09, 0x21, 0x06, 0x02, + 0x40, 0x41, 0x00, 0x28, 0x02, 0x94, 0xa2, 0x80, 0x80, 0x00, 0x22, 0x04, + 0x41, 0x7f, 0x6a, 0x22, 0x03, 0x20, 0x00, 0x71, 0x45, 0x0d, 0x00, 0x20, + 0x09, 0x20, 0x00, 0x6b, 0x20, 0x03, 0x20, 0x00, 0x6a, 0x41, 0x00, 0x20, + 0x04, 0x6b, 0x71, 0x6a, 0x21, 0x06, 0x0b, 0x20, 0x06, 0x20, 0x07, 0x4d, + 0x0d, 0x06, 0x20, 0x06, 0x41, 0xfe, 0xff, 0xff, 0xff, 0x07, 0x4b, 0x0d, + 0x06, 0x02, 0x40, 0x41, 0x00, 0x28, 0x02, 0xf0, 0xa1, 0x80, 0x80, 0x00, + 0x22, 0x04, 0x45, 0x0d, 0x00, 0x41, 0x00, 0x28, 0x02, 0xe8, 0xa1, 0x80, + 0x80, 0x00, 0x22, 0x03, 0x20, 0x06, 0x6a, 0x22, 0x05, 0x20, 0x03, 0x4d, + 0x0d, 0x07, 0x20, 0x05, 0x20, 0x04, 0x4b, 0x0d, 0x07, 0x0b, 0x20, 0x06, + 0x10, 0xa5, 0x80, 0x80, 0x80, 0x00, 0x22, 0x04, 0x20, 0x00, 0x47, 0x0d, + 0x01, 0x0c, 0x08, 0x0b, 0x20, 0x00, 0x20, 0x05, 0x6b, 0x20, 0x06, 0x71, + 0x22, 0x06, 0x41, 0xfe, 0xff, 0xff, 0xff, 0x07, 0x4b, 0x0d, 0x05, 0x20, + 0x06, 0x10, 0xa5, 0x80, 0x80, 0x80, 0x00, 0x22, 0x00, 0x20, 0x04, 0x28, + 0x02, 0x00, 0x20, 0x04, 0x28, 0x02, 0x04, 0x6a, 0x46, 0x0d, 0x04, 0x20, + 0x00, 0x21, 0x04, 0x0b, 0x02, 0x40, 0x20, 0x06, 0x20, 0x07, 0x41, 0xc8, + 0x00, 0x6a, 0x4f, 0x0d, 0x00, 0x20, 0x04, 0x41, 0x7f, 0x46, 0x0d, 0x00, + 0x02, 0x40, 0x20, 0x08, 0x20, 0x06, 0x6b, 0x41, 0x00, 0x28, 0x02, 0x98, + 0xa2, 0x80, 0x80, 0x00, 0x22, 0x03, 0x6a, 0x41, 0x00, 0x20, 0x03, 0x6b, + 0x71, 0x22, 0x03, 0x41, 0xfe, 0xff, 0xff, 0xff, 0x07, 0x4d, 0x0d, 0x00, + 0x20, 0x04, 0x21, 0x00, 0x0c, 0x08, 0x0b, 0x02, 0x40, 0x20, 0x03, 0x10, + 0xa5, 0x80, 0x80, 0x80, 0x00, 0x41, 0x7f, 0x46, 0x0d, 0x00, 0x20, 0x03, + 0x20, 0x06, 0x6a, 0x21, 0x06, 0x20, 0x04, 0x21, 0x00, 0x0c, 0x08, 0x0b, + 0x41, 0x00, 0x20, 0x06, 0x6b, 0x10, 0xa5, 0x80, 0x80, 0x80, 0x00, 0x1a, + 0x0c, 0x05, 0x0b, 0x20, 0x04, 0x21, 0x00, 0x20, 0x04, 0x41, 0x7f, 0x47, + 0x0d, 0x06, 0x0c, 0x04, 0x0b, 0x00, 0x00, 0x0b, 0x41, 0x00, 0x21, 0x09, + 0x0c, 0x0c, 0x0b, 0x41, 0x00, 0x21, 0x00, 0x0c, 0x0a, 0x0b, 0x20, 0x00, + 0x41, 0x7f, 0x47, 0x0d, 0x02, 0x0b, 0x41, 0x00, 0x41, 0x00, 0x28, 0x02, + 0xf4, 0xa1, 0x80, 0x80, 0x00, 0x41, 0x04, 0x72, 0x36, 0x02, 0xf4, 0xa1, + 0x80, 0x80, 0x00, 0x0b, 0x20, 0x09, 0x41, 0xfe, 0xff, 0xff, 0xff, 0x07, + 0x4b, 0x0d, 0x01, 0x20, 0x09, 0x10, 0xa5, 0x80, 0x80, 0x80, 0x00, 0x21, + 0x00, 0x41, 0x00, 0x10, 0xa5, 0x80, 0x80, 0x80, 0x00, 0x21, 0x04, 0x20, + 0x00, 0x41, 0x7f, 0x46, 0x0d, 0x01, 0x20, 0x04, 0x41, 0x7f, 0x46, 0x0d, + 0x01, 0x20, 0x00, 0x20, 0x04, 0x4f, 0x0d, 0x01, 0x20, 0x04, 0x20, 0x00, + 0x6b, 0x22, 0x06, 0x20, 0x07, 0x41, 0x38, 0x6a, 0x4d, 0x0d, 0x01, 0x0b, + 0x41, 0x00, 0x41, 0x00, 0x28, 0x02, 0xe8, 0xa1, 0x80, 0x80, 0x00, 0x20, + 0x06, 0x6a, 0x22, 0x04, 0x36, 0x02, 0xe8, 0xa1, 0x80, 0x80, 0x00, 0x02, + 0x40, 0x20, 0x04, 0x41, 0x00, 0x28, 0x02, 0xec, 0xa1, 0x80, 0x80, 0x00, + 0x4d, 0x0d, 0x00, 0x41, 0x00, 0x20, 0x04, 0x36, 0x02, 0xec, 0xa1, 0x80, + 0x80, 0x00, 0x0b, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, 0x41, + 0x00, 0x28, 0x02, 0xd0, 0x9e, 0x80, 0x80, 0x00, 0x22, 0x03, 0x45, 0x0d, + 0x00, 0x41, 0xf8, 0xa1, 0x80, 0x80, 0x00, 0x21, 0x04, 0x03, 0x40, 0x20, + 0x00, 0x20, 0x04, 0x28, 0x02, 0x00, 0x22, 0x05, 0x20, 0x04, 0x28, 0x02, + 0x04, 0x22, 0x09, 0x6a, 0x46, 0x0d, 0x02, 0x20, 0x04, 0x28, 0x02, 0x08, + 0x22, 0x04, 0x0d, 0x00, 0x0c, 0x03, 0x0b, 0x0b, 0x02, 0x40, 0x02, 0x40, + 0x41, 0x00, 0x28, 0x02, 0xc8, 0x9e, 0x80, 0x80, 0x00, 0x22, 0x04, 0x45, + 0x0d, 0x00, 0x20, 0x00, 0x20, 0x04, 0x4f, 0x0d, 0x01, 0x0b, 0x41, 0x00, + 0x20, 0x00, 0x36, 0x02, 0xc8, 0x9e, 0x80, 0x80, 0x00, 0x0b, 0x41, 0x00, + 0x21, 0x04, 0x41, 0x00, 0x20, 0x06, 0x36, 0x02, 0xfc, 0xa1, 0x80, 0x80, + 0x00, 0x41, 0x00, 0x20, 0x00, 0x36, 0x02, 0xf8, 0xa1, 0x80, 0x80, 0x00, + 0x41, 0x00, 0x41, 0x7f, 0x36, 0x02, 0xd8, 0x9e, 0x80, 0x80, 0x00, 0x41, + 0x00, 0x41, 0x00, 0x28, 0x02, 0x90, 0xa2, 0x80, 0x80, 0x00, 0x36, 0x02, + 0xdc, 0x9e, 0x80, 0x80, 0x00, 0x41, 0x00, 0x41, 0x00, 0x36, 0x02, 0x84, + 0xa2, 0x80, 0x80, 0x00, 0x03, 0x40, 0x20, 0x04, 0x41, 0xf4, 0x9e, 0x80, + 0x80, 0x00, 0x6a, 0x20, 0x04, 0x41, 0xe8, 0x9e, 0x80, 0x80, 0x00, 0x6a, + 0x22, 0x03, 0x36, 0x02, 0x00, 0x20, 0x03, 0x20, 0x04, 0x41, 0xe0, 0x9e, + 0x80, 0x80, 0x00, 0x6a, 0x22, 0x05, 0x36, 0x02, 0x00, 0x20, 0x04, 0x41, + 0xec, 0x9e, 0x80, 0x80, 0x00, 0x6a, 0x20, 0x05, 0x36, 0x02, 0x00, 0x20, + 0x04, 0x41, 0xfc, 0x9e, 0x80, 0x80, 0x00, 0x6a, 0x20, 0x04, 0x41, 0xf0, + 0x9e, 0x80, 0x80, 0x00, 0x6a, 0x22, 0x05, 0x36, 0x02, 0x00, 0x20, 0x05, + 0x20, 0x03, 0x36, 0x02, 0x00, 0x20, 0x04, 0x41, 0x84, 0x9f, 0x80, 0x80, + 0x00, 0x6a, 0x20, 0x04, 0x41, 0xf8, 0x9e, 0x80, 0x80, 0x00, 0x6a, 0x22, + 0x03, 0x36, 0x02, 0x00, 0x20, 0x03, 0x20, 0x05, 0x36, 0x02, 0x00, 0x20, + 0x04, 0x41, 0x80, 0x9f, 0x80, 0x80, 0x00, 0x6a, 0x20, 0x03, 0x36, 0x02, + 0x00, 0x20, 0x04, 0x41, 0x20, 0x6a, 0x22, 0x04, 0x41, 0x80, 0x02, 0x47, + 0x0d, 0x00, 0x0b, 0x20, 0x00, 0x41, 0x78, 0x20, 0x00, 0x6b, 0x41, 0x0f, + 0x71, 0x22, 0x04, 0x6a, 0x22, 0x03, 0x20, 0x06, 0x41, 0x48, 0x6a, 0x22, + 0x05, 0x20, 0x04, 0x6b, 0x22, 0x04, 0x41, 0x01, 0x72, 0x36, 0x02, 0x04, + 0x41, 0x00, 0x41, 0x00, 0x28, 0x02, 0xa0, 0xa2, 0x80, 0x80, 0x00, 0x36, + 0x02, 0xd4, 0x9e, 0x80, 0x80, 0x00, 0x41, 0x00, 0x20, 0x04, 0x36, 0x02, + 0xc4, 0x9e, 0x80, 0x80, 0x00, 0x41, 0x00, 0x20, 0x03, 0x36, 0x02, 0xd0, + 0x9e, 0x80, 0x80, 0x00, 0x20, 0x00, 0x20, 0x05, 0x6a, 0x41, 0x38, 0x36, + 0x02, 0x04, 0x0c, 0x02, 0x0b, 0x20, 0x03, 0x20, 0x00, 0x4f, 0x0d, 0x00, + 0x20, 0x03, 0x20, 0x05, 0x49, 0x0d, 0x00, 0x20, 0x04, 0x28, 0x02, 0x0c, + 0x41, 0x08, 0x71, 0x0d, 0x00, 0x20, 0x03, 0x41, 0x78, 0x20, 0x03, 0x6b, + 0x41, 0x0f, 0x71, 0x22, 0x05, 0x6a, 0x22, 0x00, 0x41, 0x00, 0x28, 0x02, + 0xc4, 0x9e, 0x80, 0x80, 0x00, 0x20, 0x06, 0x6a, 0x22, 0x02, 0x20, 0x05, + 0x6b, 0x22, 0x05, 0x41, 0x01, 0x72, 0x36, 0x02, 0x04, 0x20, 0x04, 0x20, + 0x09, 0x20, 0x06, 0x6a, 0x36, 0x02, 0x04, 0x41, 0x00, 0x41, 0x00, 0x28, + 0x02, 0xa0, 0xa2, 0x80, 0x80, 0x00, 0x36, 0x02, 0xd4, 0x9e, 0x80, 0x80, + 0x00, 0x41, 0x00, 0x20, 0x05, 0x36, 0x02, 0xc4, 0x9e, 0x80, 0x80, 0x00, + 0x41, 0x00, 0x20, 0x00, 0x36, 0x02, 0xd0, 0x9e, 0x80, 0x80, 0x00, 0x20, + 0x03, 0x20, 0x02, 0x6a, 0x41, 0x38, 0x36, 0x02, 0x04, 0x0c, 0x01, 0x0b, + 0x02, 0x40, 0x20, 0x00, 0x41, 0x00, 0x28, 0x02, 0xc8, 0x9e, 0x80, 0x80, + 0x00, 0x22, 0x09, 0x4f, 0x0d, 0x00, 0x41, 0x00, 0x20, 0x00, 0x36, 0x02, + 0xc8, 0x9e, 0x80, 0x80, 0x00, 0x20, 0x00, 0x21, 0x09, 0x0b, 0x20, 0x00, + 0x20, 0x06, 0x6a, 0x21, 0x05, 0x41, 0xf8, 0xa1, 0x80, 0x80, 0x00, 0x21, + 0x04, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, 0x03, 0x40, 0x20, + 0x04, 0x28, 0x02, 0x00, 0x20, 0x05, 0x46, 0x0d, 0x01, 0x20, 0x04, 0x28, + 0x02, 0x08, 0x22, 0x04, 0x0d, 0x00, 0x0c, 0x02, 0x0b, 0x0b, 0x20, 0x04, + 0x2d, 0x00, 0x0c, 0x41, 0x08, 0x71, 0x45, 0x0d, 0x01, 0x0b, 0x41, 0xf8, + 0xa1, 0x80, 0x80, 0x00, 0x21, 0x04, 0x03, 0x40, 0x02, 0x40, 0x20, 0x04, + 0x28, 0x02, 0x00, 0x22, 0x05, 0x20, 0x03, 0x4b, 0x0d, 0x00, 0x20, 0x05, + 0x20, 0x04, 0x28, 0x02, 0x04, 0x6a, 0x22, 0x05, 0x20, 0x03, 0x4b, 0x0d, + 0x03, 0x0b, 0x20, 0x04, 0x28, 0x02, 0x08, 0x21, 0x04, 0x0c, 0x00, 0x0b, + 0x0b, 0x20, 0x04, 0x20, 0x00, 0x36, 0x02, 0x00, 0x20, 0x04, 0x20, 0x04, + 0x28, 0x02, 0x04, 0x20, 0x06, 0x6a, 0x36, 0x02, 0x04, 0x20, 0x00, 0x41, + 0x78, 0x20, 0x00, 0x6b, 0x41, 0x0f, 0x71, 0x6a, 0x22, 0x02, 0x20, 0x07, + 0x41, 0x03, 0x72, 0x36, 0x02, 0x04, 0x20, 0x05, 0x41, 0x78, 0x20, 0x05, + 0x6b, 0x41, 0x0f, 0x71, 0x6a, 0x22, 0x06, 0x20, 0x02, 0x20, 0x07, 0x6a, + 0x22, 0x07, 0x6b, 0x21, 0x04, 0x02, 0x40, 0x20, 0x06, 0x20, 0x03, 0x47, + 0x0d, 0x00, 0x41, 0x00, 0x20, 0x07, 0x36, 0x02, 0xd0, 0x9e, 0x80, 0x80, + 0x00, 0x41, 0x00, 0x41, 0x00, 0x28, 0x02, 0xc4, 0x9e, 0x80, 0x80, 0x00, + 0x20, 0x04, 0x6a, 0x22, 0x04, 0x36, 0x02, 0xc4, 0x9e, 0x80, 0x80, 0x00, + 0x20, 0x07, 0x20, 0x04, 0x41, 0x01, 0x72, 0x36, 0x02, 0x04, 0x0c, 0x08, + 0x0b, 0x02, 0x40, 0x20, 0x06, 0x41, 0x00, 0x28, 0x02, 0xcc, 0x9e, 0x80, + 0x80, 0x00, 0x47, 0x0d, 0x00, 0x41, 0x00, 0x20, 0x07, 0x36, 0x02, 0xcc, + 0x9e, 0x80, 0x80, 0x00, 0x41, 0x00, 0x41, 0x00, 0x28, 0x02, 0xc0, 0x9e, + 0x80, 0x80, 0x00, 0x20, 0x04, 0x6a, 0x22, 0x04, 0x36, 0x02, 0xc0, 0x9e, + 0x80, 0x80, 0x00, 0x20, 0x07, 0x20, 0x04, 0x41, 0x01, 0x72, 0x36, 0x02, + 0x04, 0x20, 0x07, 0x20, 0x04, 0x6a, 0x20, 0x04, 0x36, 0x02, 0x00, 0x0c, + 0x08, 0x0b, 0x20, 0x06, 0x28, 0x02, 0x04, 0x22, 0x03, 0x41, 0x03, 0x71, + 0x41, 0x01, 0x47, 0x0d, 0x06, 0x20, 0x03, 0x41, 0x78, 0x71, 0x21, 0x08, + 0x02, 0x40, 0x20, 0x03, 0x41, 0xff, 0x01, 0x4b, 0x0d, 0x00, 0x20, 0x06, + 0x28, 0x02, 0x08, 0x22, 0x05, 0x20, 0x03, 0x41, 0x03, 0x76, 0x22, 0x09, + 0x41, 0x03, 0x74, 0x41, 0xe0, 0x9e, 0x80, 0x80, 0x00, 0x6a, 0x22, 0x00, + 0x46, 0x1a, 0x02, 0x40, 0x20, 0x06, 0x28, 0x02, 0x0c, 0x22, 0x03, 0x20, + 0x05, 0x47, 0x0d, 0x00, 0x41, 0x00, 0x41, 0x00, 0x28, 0x02, 0xb8, 0x9e, + 0x80, 0x80, 0x00, 0x41, 0x7e, 0x20, 0x09, 0x77, 0x71, 0x36, 0x02, 0xb8, + 0x9e, 0x80, 0x80, 0x00, 0x0c, 0x07, 0x0b, 0x20, 0x03, 0x20, 0x00, 0x46, + 0x1a, 0x20, 0x03, 0x20, 0x05, 0x36, 0x02, 0x08, 0x20, 0x05, 0x20, 0x03, + 0x36, 0x02, 0x0c, 0x0c, 0x06, 0x0b, 0x20, 0x06, 0x28, 0x02, 0x18, 0x21, + 0x0b, 0x02, 0x40, 0x20, 0x06, 0x28, 0x02, 0x0c, 0x22, 0x00, 0x20, 0x06, + 0x46, 0x0d, 0x00, 0x20, 0x06, 0x28, 0x02, 0x08, 0x22, 0x03, 0x20, 0x09, + 0x49, 0x1a, 0x20, 0x00, 0x20, 0x03, 0x36, 0x02, 0x08, 0x20, 0x03, 0x20, + 0x00, 0x36, 0x02, 0x0c, 0x0c, 0x05, 0x0b, 0x02, 0x40, 0x20, 0x06, 0x41, + 0x14, 0x6a, 0x22, 0x05, 0x28, 0x02, 0x00, 0x22, 0x03, 0x0d, 0x00, 0x20, + 0x06, 0x28, 0x02, 0x10, 0x22, 0x03, 0x45, 0x0d, 0x04, 0x20, 0x06, 0x41, + 0x10, 0x6a, 0x21, 0x05, 0x0b, 0x03, 0x40, 0x20, 0x05, 0x21, 0x09, 0x20, + 0x03, 0x22, 0x00, 0x41, 0x14, 0x6a, 0x22, 0x05, 0x28, 0x02, 0x00, 0x22, + 0x03, 0x0d, 0x00, 0x20, 0x00, 0x41, 0x10, 0x6a, 0x21, 0x05, 0x20, 0x00, + 0x28, 0x02, 0x10, 0x22, 0x03, 0x0d, 0x00, 0x0b, 0x20, 0x09, 0x41, 0x00, + 0x36, 0x02, 0x00, 0x0c, 0x04, 0x0b, 0x20, 0x00, 0x41, 0x78, 0x20, 0x00, + 0x6b, 0x41, 0x0f, 0x71, 0x22, 0x04, 0x6a, 0x22, 0x02, 0x20, 0x06, 0x41, + 0x48, 0x6a, 0x22, 0x09, 0x20, 0x04, 0x6b, 0x22, 0x04, 0x41, 0x01, 0x72, + 0x36, 0x02, 0x04, 0x20, 0x00, 0x20, 0x09, 0x6a, 0x41, 0x38, 0x36, 0x02, + 0x04, 0x20, 0x03, 0x20, 0x05, 0x41, 0x37, 0x20, 0x05, 0x6b, 0x41, 0x0f, + 0x71, 0x6a, 0x41, 0x41, 0x6a, 0x22, 0x09, 0x20, 0x09, 0x20, 0x03, 0x41, + 0x10, 0x6a, 0x49, 0x1b, 0x22, 0x09, 0x41, 0x23, 0x36, 0x02, 0x04, 0x41, + 0x00, 0x41, 0x00, 0x28, 0x02, 0xa0, 0xa2, 0x80, 0x80, 0x00, 0x36, 0x02, + 0xd4, 0x9e, 0x80, 0x80, 0x00, 0x41, 0x00, 0x20, 0x04, 0x36, 0x02, 0xc4, + 0x9e, 0x80, 0x80, 0x00, 0x41, 0x00, 0x20, 0x02, 0x36, 0x02, 0xd0, 0x9e, + 0x80, 0x80, 0x00, 0x20, 0x09, 0x41, 0x10, 0x6a, 0x41, 0x00, 0x29, 0x02, + 0x80, 0xa2, 0x80, 0x80, 0x00, 0x37, 0x02, 0x00, 0x20, 0x09, 0x41, 0x00, + 0x29, 0x02, 0xf8, 0xa1, 0x80, 0x80, 0x00, 0x37, 0x02, 0x08, 0x41, 0x00, + 0x20, 0x09, 0x41, 0x08, 0x6a, 0x36, 0x02, 0x80, 0xa2, 0x80, 0x80, 0x00, + 0x41, 0x00, 0x20, 0x06, 0x36, 0x02, 0xfc, 0xa1, 0x80, 0x80, 0x00, 0x41, + 0x00, 0x20, 0x00, 0x36, 0x02, 0xf8, 0xa1, 0x80, 0x80, 0x00, 0x41, 0x00, + 0x41, 0x00, 0x36, 0x02, 0x84, 0xa2, 0x80, 0x80, 0x00, 0x20, 0x09, 0x41, + 0x24, 0x6a, 0x21, 0x04, 0x03, 0x40, 0x20, 0x04, 0x41, 0x07, 0x36, 0x02, + 0x00, 0x20, 0x04, 0x41, 0x04, 0x6a, 0x22, 0x04, 0x20, 0x05, 0x49, 0x0d, + 0x00, 0x0b, 0x20, 0x09, 0x20, 0x03, 0x46, 0x0d, 0x00, 0x20, 0x09, 0x20, + 0x09, 0x28, 0x02, 0x04, 0x41, 0x7e, 0x71, 0x36, 0x02, 0x04, 0x20, 0x09, + 0x20, 0x09, 0x20, 0x03, 0x6b, 0x22, 0x00, 0x36, 0x02, 0x00, 0x20, 0x03, + 0x20, 0x00, 0x41, 0x01, 0x72, 0x36, 0x02, 0x04, 0x02, 0x40, 0x20, 0x00, + 0x41, 0xff, 0x01, 0x4b, 0x0d, 0x00, 0x20, 0x00, 0x41, 0x78, 0x71, 0x41, + 0xe0, 0x9e, 0x80, 0x80, 0x00, 0x6a, 0x21, 0x04, 0x02, 0x40, 0x02, 0x40, + 0x41, 0x00, 0x28, 0x02, 0xb8, 0x9e, 0x80, 0x80, 0x00, 0x22, 0x05, 0x41, + 0x01, 0x20, 0x00, 0x41, 0x03, 0x76, 0x74, 0x22, 0x00, 0x71, 0x0d, 0x00, + 0x41, 0x00, 0x20, 0x05, 0x20, 0x00, 0x72, 0x36, 0x02, 0xb8, 0x9e, 0x80, + 0x80, 0x00, 0x20, 0x04, 0x21, 0x05, 0x0c, 0x01, 0x0b, 0x20, 0x04, 0x28, + 0x02, 0x08, 0x21, 0x05, 0x0b, 0x20, 0x05, 0x20, 0x03, 0x36, 0x02, 0x0c, + 0x20, 0x04, 0x20, 0x03, 0x36, 0x02, 0x08, 0x20, 0x03, 0x20, 0x04, 0x36, + 0x02, 0x0c, 0x20, 0x03, 0x20, 0x05, 0x36, 0x02, 0x08, 0x0c, 0x01, 0x0b, + 0x41, 0x1f, 0x21, 0x04, 0x02, 0x40, 0x20, 0x00, 0x41, 0xff, 0xff, 0xff, + 0x07, 0x4b, 0x0d, 0x00, 0x20, 0x00, 0x41, 0x26, 0x20, 0x00, 0x41, 0x08, + 0x76, 0x67, 0x22, 0x04, 0x6b, 0x76, 0x41, 0x01, 0x71, 0x20, 0x04, 0x41, + 0x01, 0x74, 0x6b, 0x41, 0x3e, 0x6a, 0x21, 0x04, 0x0b, 0x20, 0x03, 0x20, + 0x04, 0x36, 0x02, 0x1c, 0x20, 0x03, 0x42, 0x00, 0x37, 0x02, 0x10, 0x20, + 0x04, 0x41, 0x02, 0x74, 0x41, 0xe8, 0xa0, 0x80, 0x80, 0x00, 0x6a, 0x21, + 0x05, 0x02, 0x40, 0x41, 0x00, 0x28, 0x02, 0xbc, 0x9e, 0x80, 0x80, 0x00, + 0x22, 0x09, 0x41, 0x01, 0x20, 0x04, 0x74, 0x22, 0x06, 0x71, 0x0d, 0x00, + 0x20, 0x05, 0x20, 0x03, 0x36, 0x02, 0x00, 0x41, 0x00, 0x20, 0x09, 0x20, + 0x06, 0x72, 0x36, 0x02, 0xbc, 0x9e, 0x80, 0x80, 0x00, 0x20, 0x03, 0x20, + 0x05, 0x36, 0x02, 0x18, 0x20, 0x03, 0x20, 0x03, 0x36, 0x02, 0x08, 0x20, + 0x03, 0x20, 0x03, 0x36, 0x02, 0x0c, 0x0c, 0x01, 0x0b, 0x20, 0x00, 0x41, + 0x00, 0x41, 0x19, 0x20, 0x04, 0x41, 0x01, 0x76, 0x6b, 0x20, 0x04, 0x41, + 0x1f, 0x46, 0x1b, 0x74, 0x21, 0x04, 0x20, 0x05, 0x28, 0x02, 0x00, 0x21, + 0x09, 0x02, 0x40, 0x03, 0x40, 0x20, 0x09, 0x22, 0x05, 0x28, 0x02, 0x04, + 0x41, 0x78, 0x71, 0x20, 0x00, 0x46, 0x0d, 0x01, 0x20, 0x04, 0x41, 0x1d, + 0x76, 0x21, 0x09, 0x20, 0x04, 0x41, 0x01, 0x74, 0x21, 0x04, 0x20, 0x05, + 0x20, 0x09, 0x41, 0x04, 0x71, 0x6a, 0x41, 0x10, 0x6a, 0x22, 0x06, 0x28, + 0x02, 0x00, 0x22, 0x09, 0x0d, 0x00, 0x0b, 0x20, 0x06, 0x20, 0x03, 0x36, + 0x02, 0x00, 0x20, 0x03, 0x20, 0x05, 0x36, 0x02, 0x18, 0x20, 0x03, 0x20, + 0x03, 0x36, 0x02, 0x0c, 0x20, 0x03, 0x20, 0x03, 0x36, 0x02, 0x08, 0x0c, + 0x01, 0x0b, 0x20, 0x05, 0x28, 0x02, 0x08, 0x22, 0x04, 0x20, 0x03, 0x36, + 0x02, 0x0c, 0x20, 0x05, 0x20, 0x03, 0x36, 0x02, 0x08, 0x20, 0x03, 0x41, + 0x00, 0x36, 0x02, 0x18, 0x20, 0x03, 0x20, 0x05, 0x36, 0x02, 0x0c, 0x20, + 0x03, 0x20, 0x04, 0x36, 0x02, 0x08, 0x0b, 0x41, 0x00, 0x28, 0x02, 0xc4, + 0x9e, 0x80, 0x80, 0x00, 0x22, 0x04, 0x20, 0x07, 0x4d, 0x0d, 0x00, 0x41, + 0x00, 0x28, 0x02, 0xd0, 0x9e, 0x80, 0x80, 0x00, 0x22, 0x03, 0x20, 0x07, + 0x6a, 0x22, 0x05, 0x20, 0x04, 0x20, 0x07, 0x6b, 0x22, 0x04, 0x41, 0x01, + 0x72, 0x36, 0x02, 0x04, 0x41, 0x00, 0x20, 0x04, 0x36, 0x02, 0xc4, 0x9e, + 0x80, 0x80, 0x00, 0x41, 0x00, 0x20, 0x05, 0x36, 0x02, 0xd0, 0x9e, 0x80, + 0x80, 0x00, 0x20, 0x03, 0x20, 0x07, 0x41, 0x03, 0x72, 0x36, 0x02, 0x04, + 0x20, 0x03, 0x41, 0x08, 0x6a, 0x21, 0x04, 0x0c, 0x08, 0x0b, 0x41, 0x00, + 0x21, 0x04, 0x41, 0x00, 0x41, 0x30, 0x36, 0x02, 0xb4, 0x9e, 0x80, 0x80, + 0x00, 0x0c, 0x07, 0x0b, 0x41, 0x00, 0x21, 0x00, 0x0b, 0x20, 0x0b, 0x45, + 0x0d, 0x00, 0x02, 0x40, 0x02, 0x40, 0x20, 0x06, 0x20, 0x06, 0x28, 0x02, + 0x1c, 0x22, 0x05, 0x41, 0x02, 0x74, 0x41, 0xe8, 0xa0, 0x80, 0x80, 0x00, + 0x6a, 0x22, 0x03, 0x28, 0x02, 0x00, 0x47, 0x0d, 0x00, 0x20, 0x03, 0x20, + 0x00, 0x36, 0x02, 0x00, 0x20, 0x00, 0x0d, 0x01, 0x41, 0x00, 0x41, 0x00, + 0x28, 0x02, 0xbc, 0x9e, 0x80, 0x80, 0x00, 0x41, 0x7e, 0x20, 0x05, 0x77, + 0x71, 0x36, 0x02, 0xbc, 0x9e, 0x80, 0x80, 0x00, 0x0c, 0x02, 0x0b, 0x20, + 0x0b, 0x41, 0x10, 0x41, 0x14, 0x20, 0x0b, 0x28, 0x02, 0x10, 0x20, 0x06, + 0x46, 0x1b, 0x6a, 0x20, 0x00, 0x36, 0x02, 0x00, 0x20, 0x00, 0x45, 0x0d, + 0x01, 0x0b, 0x20, 0x00, 0x20, 0x0b, 0x36, 0x02, 0x18, 0x02, 0x40, 0x20, + 0x06, 0x28, 0x02, 0x10, 0x22, 0x03, 0x45, 0x0d, 0x00, 0x20, 0x00, 0x20, + 0x03, 0x36, 0x02, 0x10, 0x20, 0x03, 0x20, 0x00, 0x36, 0x02, 0x18, 0x0b, + 0x20, 0x06, 0x41, 0x14, 0x6a, 0x28, 0x02, 0x00, 0x22, 0x03, 0x45, 0x0d, + 0x00, 0x20, 0x00, 0x41, 0x14, 0x6a, 0x20, 0x03, 0x36, 0x02, 0x00, 0x20, + 0x03, 0x20, 0x00, 0x36, 0x02, 0x18, 0x0b, 0x20, 0x08, 0x20, 0x04, 0x6a, + 0x21, 0x04, 0x20, 0x06, 0x20, 0x08, 0x6a, 0x22, 0x06, 0x28, 0x02, 0x04, + 0x21, 0x03, 0x0b, 0x20, 0x06, 0x20, 0x03, 0x41, 0x7e, 0x71, 0x36, 0x02, + 0x04, 0x20, 0x07, 0x20, 0x04, 0x6a, 0x20, 0x04, 0x36, 0x02, 0x00, 0x20, + 0x07, 0x20, 0x04, 0x41, 0x01, 0x72, 0x36, 0x02, 0x04, 0x02, 0x40, 0x20, + 0x04, 0x41, 0xff, 0x01, 0x4b, 0x0d, 0x00, 0x20, 0x04, 0x41, 0x78, 0x71, + 0x41, 0xe0, 0x9e, 0x80, 0x80, 0x00, 0x6a, 0x21, 0x03, 0x02, 0x40, 0x02, + 0x40, 0x41, 0x00, 0x28, 0x02, 0xb8, 0x9e, 0x80, 0x80, 0x00, 0x22, 0x05, + 0x41, 0x01, 0x20, 0x04, 0x41, 0x03, 0x76, 0x74, 0x22, 0x04, 0x71, 0x0d, + 0x00, 0x41, 0x00, 0x20, 0x05, 0x20, 0x04, 0x72, 0x36, 0x02, 0xb8, 0x9e, + 0x80, 0x80, 0x00, 0x20, 0x03, 0x21, 0x04, 0x0c, 0x01, 0x0b, 0x20, 0x03, + 0x28, 0x02, 0x08, 0x21, 0x04, 0x0b, 0x20, 0x04, 0x20, 0x07, 0x36, 0x02, + 0x0c, 0x20, 0x03, 0x20, 0x07, 0x36, 0x02, 0x08, 0x20, 0x07, 0x20, 0x03, + 0x36, 0x02, 0x0c, 0x20, 0x07, 0x20, 0x04, 0x36, 0x02, 0x08, 0x0c, 0x01, + 0x0b, 0x41, 0x1f, 0x21, 0x03, 0x02, 0x40, 0x20, 0x04, 0x41, 0xff, 0xff, + 0xff, 0x07, 0x4b, 0x0d, 0x00, 0x20, 0x04, 0x41, 0x26, 0x20, 0x04, 0x41, + 0x08, 0x76, 0x67, 0x22, 0x03, 0x6b, 0x76, 0x41, 0x01, 0x71, 0x20, 0x03, + 0x41, 0x01, 0x74, 0x6b, 0x41, 0x3e, 0x6a, 0x21, 0x03, 0x0b, 0x20, 0x07, + 0x20, 0x03, 0x36, 0x02, 0x1c, 0x20, 0x07, 0x42, 0x00, 0x37, 0x02, 0x10, + 0x20, 0x03, 0x41, 0x02, 0x74, 0x41, 0xe8, 0xa0, 0x80, 0x80, 0x00, 0x6a, + 0x21, 0x05, 0x02, 0x40, 0x41, 0x00, 0x28, 0x02, 0xbc, 0x9e, 0x80, 0x80, + 0x00, 0x22, 0x00, 0x41, 0x01, 0x20, 0x03, 0x74, 0x22, 0x09, 0x71, 0x0d, + 0x00, 0x20, 0x05, 0x20, 0x07, 0x36, 0x02, 0x00, 0x41, 0x00, 0x20, 0x00, + 0x20, 0x09, 0x72, 0x36, 0x02, 0xbc, 0x9e, 0x80, 0x80, 0x00, 0x20, 0x07, + 0x20, 0x05, 0x36, 0x02, 0x18, 0x20, 0x07, 0x20, 0x07, 0x36, 0x02, 0x08, + 0x20, 0x07, 0x20, 0x07, 0x36, 0x02, 0x0c, 0x0c, 0x01, 0x0b, 0x20, 0x04, + 0x41, 0x00, 0x41, 0x19, 0x20, 0x03, 0x41, 0x01, 0x76, 0x6b, 0x20, 0x03, + 0x41, 0x1f, 0x46, 0x1b, 0x74, 0x21, 0x03, 0x20, 0x05, 0x28, 0x02, 0x00, + 0x21, 0x00, 0x02, 0x40, 0x03, 0x40, 0x20, 0x00, 0x22, 0x05, 0x28, 0x02, + 0x04, 0x41, 0x78, 0x71, 0x20, 0x04, 0x46, 0x0d, 0x01, 0x20, 0x03, 0x41, + 0x1d, 0x76, 0x21, 0x00, 0x20, 0x03, 0x41, 0x01, 0x74, 0x21, 0x03, 0x20, + 0x05, 0x20, 0x00, 0x41, 0x04, 0x71, 0x6a, 0x41, 0x10, 0x6a, 0x22, 0x09, + 0x28, 0x02, 0x00, 0x22, 0x00, 0x0d, 0x00, 0x0b, 0x20, 0x09, 0x20, 0x07, + 0x36, 0x02, 0x00, 0x20, 0x07, 0x20, 0x05, 0x36, 0x02, 0x18, 0x20, 0x07, + 0x20, 0x07, 0x36, 0x02, 0x0c, 0x20, 0x07, 0x20, 0x07, 0x36, 0x02, 0x08, + 0x0c, 0x01, 0x0b, 0x20, 0x05, 0x28, 0x02, 0x08, 0x22, 0x04, 0x20, 0x07, + 0x36, 0x02, 0x0c, 0x20, 0x05, 0x20, 0x07, 0x36, 0x02, 0x08, 0x20, 0x07, + 0x41, 0x00, 0x36, 0x02, 0x18, 0x20, 0x07, 0x20, 0x05, 0x36, 0x02, 0x0c, + 0x20, 0x07, 0x20, 0x04, 0x36, 0x02, 0x08, 0x0b, 0x20, 0x02, 0x41, 0x08, + 0x6a, 0x21, 0x04, 0x0c, 0x02, 0x0b, 0x02, 0x40, 0x20, 0x02, 0x45, 0x0d, + 0x00, 0x02, 0x40, 0x02, 0x40, 0x20, 0x09, 0x20, 0x09, 0x28, 0x02, 0x1c, + 0x22, 0x05, 0x41, 0x02, 0x74, 0x41, 0xe8, 0xa0, 0x80, 0x80, 0x00, 0x6a, + 0x22, 0x04, 0x28, 0x02, 0x00, 0x47, 0x0d, 0x00, 0x20, 0x04, 0x20, 0x00, + 0x36, 0x02, 0x00, 0x20, 0x00, 0x0d, 0x01, 0x41, 0x00, 0x20, 0x0b, 0x41, + 0x7e, 0x20, 0x05, 0x77, 0x71, 0x22, 0x0b, 0x36, 0x02, 0xbc, 0x9e, 0x80, + 0x80, 0x00, 0x0c, 0x02, 0x0b, 0x20, 0x02, 0x41, 0x10, 0x41, 0x14, 0x20, + 0x02, 0x28, 0x02, 0x10, 0x20, 0x09, 0x46, 0x1b, 0x6a, 0x20, 0x00, 0x36, + 0x02, 0x00, 0x20, 0x00, 0x45, 0x0d, 0x01, 0x0b, 0x20, 0x00, 0x20, 0x02, + 0x36, 0x02, 0x18, 0x02, 0x40, 0x20, 0x09, 0x28, 0x02, 0x10, 0x22, 0x04, + 0x45, 0x0d, 0x00, 0x20, 0x00, 0x20, 0x04, 0x36, 0x02, 0x10, 0x20, 0x04, + 0x20, 0x00, 0x36, 0x02, 0x18, 0x0b, 0x20, 0x09, 0x41, 0x14, 0x6a, 0x28, + 0x02, 0x00, 0x22, 0x04, 0x45, 0x0d, 0x00, 0x20, 0x00, 0x41, 0x14, 0x6a, + 0x20, 0x04, 0x36, 0x02, 0x00, 0x20, 0x04, 0x20, 0x00, 0x36, 0x02, 0x18, + 0x0b, 0x02, 0x40, 0x02, 0x40, 0x20, 0x03, 0x41, 0x0f, 0x4b, 0x0d, 0x00, + 0x20, 0x09, 0x20, 0x03, 0x20, 0x07, 0x6a, 0x22, 0x04, 0x41, 0x03, 0x72, + 0x36, 0x02, 0x04, 0x20, 0x09, 0x20, 0x04, 0x6a, 0x22, 0x04, 0x20, 0x04, + 0x28, 0x02, 0x04, 0x41, 0x01, 0x72, 0x36, 0x02, 0x04, 0x0c, 0x01, 0x0b, + 0x20, 0x09, 0x20, 0x07, 0x6a, 0x22, 0x00, 0x20, 0x03, 0x41, 0x01, 0x72, + 0x36, 0x02, 0x04, 0x20, 0x09, 0x20, 0x07, 0x41, 0x03, 0x72, 0x36, 0x02, + 0x04, 0x20, 0x00, 0x20, 0x03, 0x6a, 0x20, 0x03, 0x36, 0x02, 0x00, 0x02, + 0x40, 0x20, 0x03, 0x41, 0xff, 0x01, 0x4b, 0x0d, 0x00, 0x20, 0x03, 0x41, + 0x78, 0x71, 0x41, 0xe0, 0x9e, 0x80, 0x80, 0x00, 0x6a, 0x21, 0x04, 0x02, + 0x40, 0x02, 0x40, 0x41, 0x00, 0x28, 0x02, 0xb8, 0x9e, 0x80, 0x80, 0x00, + 0x22, 0x05, 0x41, 0x01, 0x20, 0x03, 0x41, 0x03, 0x76, 0x74, 0x22, 0x03, + 0x71, 0x0d, 0x00, 0x41, 0x00, 0x20, 0x05, 0x20, 0x03, 0x72, 0x36, 0x02, + 0xb8, 0x9e, 0x80, 0x80, 0x00, 0x20, 0x04, 0x21, 0x03, 0x0c, 0x01, 0x0b, + 0x20, 0x04, 0x28, 0x02, 0x08, 0x21, 0x03, 0x0b, 0x20, 0x03, 0x20, 0x00, + 0x36, 0x02, 0x0c, 0x20, 0x04, 0x20, 0x00, 0x36, 0x02, 0x08, 0x20, 0x00, + 0x20, 0x04, 0x36, 0x02, 0x0c, 0x20, 0x00, 0x20, 0x03, 0x36, 0x02, 0x08, + 0x0c, 0x01, 0x0b, 0x41, 0x1f, 0x21, 0x04, 0x02, 0x40, 0x20, 0x03, 0x41, + 0xff, 0xff, 0xff, 0x07, 0x4b, 0x0d, 0x00, 0x20, 0x03, 0x41, 0x26, 0x20, + 0x03, 0x41, 0x08, 0x76, 0x67, 0x22, 0x04, 0x6b, 0x76, 0x41, 0x01, 0x71, + 0x20, 0x04, 0x41, 0x01, 0x74, 0x6b, 0x41, 0x3e, 0x6a, 0x21, 0x04, 0x0b, + 0x20, 0x00, 0x20, 0x04, 0x36, 0x02, 0x1c, 0x20, 0x00, 0x42, 0x00, 0x37, + 0x02, 0x10, 0x20, 0x04, 0x41, 0x02, 0x74, 0x41, 0xe8, 0xa0, 0x80, 0x80, + 0x00, 0x6a, 0x21, 0x05, 0x02, 0x40, 0x20, 0x0b, 0x41, 0x01, 0x20, 0x04, + 0x74, 0x22, 0x07, 0x71, 0x0d, 0x00, 0x20, 0x05, 0x20, 0x00, 0x36, 0x02, + 0x00, 0x41, 0x00, 0x20, 0x0b, 0x20, 0x07, 0x72, 0x36, 0x02, 0xbc, 0x9e, + 0x80, 0x80, 0x00, 0x20, 0x00, 0x20, 0x05, 0x36, 0x02, 0x18, 0x20, 0x00, + 0x20, 0x00, 0x36, 0x02, 0x08, 0x20, 0x00, 0x20, 0x00, 0x36, 0x02, 0x0c, + 0x0c, 0x01, 0x0b, 0x20, 0x03, 0x41, 0x00, 0x41, 0x19, 0x20, 0x04, 0x41, + 0x01, 0x76, 0x6b, 0x20, 0x04, 0x41, 0x1f, 0x46, 0x1b, 0x74, 0x21, 0x04, + 0x20, 0x05, 0x28, 0x02, 0x00, 0x21, 0x07, 0x02, 0x40, 0x03, 0x40, 0x20, + 0x07, 0x22, 0x05, 0x28, 0x02, 0x04, 0x41, 0x78, 0x71, 0x20, 0x03, 0x46, + 0x0d, 0x01, 0x20, 0x04, 0x41, 0x1d, 0x76, 0x21, 0x07, 0x20, 0x04, 0x41, + 0x01, 0x74, 0x21, 0x04, 0x20, 0x05, 0x20, 0x07, 0x41, 0x04, 0x71, 0x6a, + 0x41, 0x10, 0x6a, 0x22, 0x06, 0x28, 0x02, 0x00, 0x22, 0x07, 0x0d, 0x00, + 0x0b, 0x20, 0x06, 0x20, 0x00, 0x36, 0x02, 0x00, 0x20, 0x00, 0x20, 0x05, + 0x36, 0x02, 0x18, 0x20, 0x00, 0x20, 0x00, 0x36, 0x02, 0x0c, 0x20, 0x00, + 0x20, 0x00, 0x36, 0x02, 0x08, 0x0c, 0x01, 0x0b, 0x20, 0x05, 0x28, 0x02, + 0x08, 0x22, 0x04, 0x20, 0x00, 0x36, 0x02, 0x0c, 0x20, 0x05, 0x20, 0x00, + 0x36, 0x02, 0x08, 0x20, 0x00, 0x41, 0x00, 0x36, 0x02, 0x18, 0x20, 0x00, + 0x20, 0x05, 0x36, 0x02, 0x0c, 0x20, 0x00, 0x20, 0x04, 0x36, 0x02, 0x08, + 0x0b, 0x20, 0x09, 0x41, 0x08, 0x6a, 0x21, 0x04, 0x0c, 0x01, 0x0b, 0x02, + 0x40, 0x20, 0x0b, 0x45, 0x0d, 0x00, 0x02, 0x40, 0x02, 0x40, 0x20, 0x00, + 0x20, 0x00, 0x28, 0x02, 0x1c, 0x22, 0x05, 0x41, 0x02, 0x74, 0x41, 0xe8, + 0xa0, 0x80, 0x80, 0x00, 0x6a, 0x22, 0x04, 0x28, 0x02, 0x00, 0x47, 0x0d, + 0x00, 0x20, 0x04, 0x20, 0x09, 0x36, 0x02, 0x00, 0x20, 0x09, 0x0d, 0x01, + 0x41, 0x00, 0x20, 0x0a, 0x41, 0x7e, 0x20, 0x05, 0x77, 0x71, 0x36, 0x02, + 0xbc, 0x9e, 0x80, 0x80, 0x00, 0x0c, 0x02, 0x0b, 0x20, 0x0b, 0x41, 0x10, + 0x41, 0x14, 0x20, 0x0b, 0x28, 0x02, 0x10, 0x20, 0x00, 0x46, 0x1b, 0x6a, + 0x20, 0x09, 0x36, 0x02, 0x00, 0x20, 0x09, 0x45, 0x0d, 0x01, 0x0b, 0x20, + 0x09, 0x20, 0x0b, 0x36, 0x02, 0x18, 0x02, 0x40, 0x20, 0x00, 0x28, 0x02, + 0x10, 0x22, 0x04, 0x45, 0x0d, 0x00, 0x20, 0x09, 0x20, 0x04, 0x36, 0x02, + 0x10, 0x20, 0x04, 0x20, 0x09, 0x36, 0x02, 0x18, 0x0b, 0x20, 0x00, 0x41, + 0x14, 0x6a, 0x28, 0x02, 0x00, 0x22, 0x04, 0x45, 0x0d, 0x00, 0x20, 0x09, + 0x41, 0x14, 0x6a, 0x20, 0x04, 0x36, 0x02, 0x00, 0x20, 0x04, 0x20, 0x09, + 0x36, 0x02, 0x18, 0x0b, 0x02, 0x40, 0x02, 0x40, 0x20, 0x03, 0x41, 0x0f, + 0x4b, 0x0d, 0x00, 0x20, 0x00, 0x20, 0x03, 0x20, 0x07, 0x6a, 0x22, 0x04, + 0x41, 0x03, 0x72, 0x36, 0x02, 0x04, 0x20, 0x00, 0x20, 0x04, 0x6a, 0x22, + 0x04, 0x20, 0x04, 0x28, 0x02, 0x04, 0x41, 0x01, 0x72, 0x36, 0x02, 0x04, + 0x0c, 0x01, 0x0b, 0x20, 0x00, 0x20, 0x07, 0x6a, 0x22, 0x05, 0x20, 0x03, + 0x41, 0x01, 0x72, 0x36, 0x02, 0x04, 0x20, 0x00, 0x20, 0x07, 0x41, 0x03, + 0x72, 0x36, 0x02, 0x04, 0x20, 0x05, 0x20, 0x03, 0x6a, 0x20, 0x03, 0x36, + 0x02, 0x00, 0x02, 0x40, 0x20, 0x08, 0x45, 0x0d, 0x00, 0x20, 0x08, 0x41, + 0x78, 0x71, 0x41, 0xe0, 0x9e, 0x80, 0x80, 0x00, 0x6a, 0x21, 0x07, 0x41, + 0x00, 0x28, 0x02, 0xcc, 0x9e, 0x80, 0x80, 0x00, 0x21, 0x04, 0x02, 0x40, + 0x02, 0x40, 0x41, 0x01, 0x20, 0x08, 0x41, 0x03, 0x76, 0x74, 0x22, 0x09, + 0x20, 0x06, 0x71, 0x0d, 0x00, 0x41, 0x00, 0x20, 0x09, 0x20, 0x06, 0x72, + 0x36, 0x02, 0xb8, 0x9e, 0x80, 0x80, 0x00, 0x20, 0x07, 0x21, 0x09, 0x0c, + 0x01, 0x0b, 0x20, 0x07, 0x28, 0x02, 0x08, 0x21, 0x09, 0x0b, 0x20, 0x09, + 0x20, 0x04, 0x36, 0x02, 0x0c, 0x20, 0x07, 0x20, 0x04, 0x36, 0x02, 0x08, + 0x20, 0x04, 0x20, 0x07, 0x36, 0x02, 0x0c, 0x20, 0x04, 0x20, 0x09, 0x36, + 0x02, 0x08, 0x0b, 0x41, 0x00, 0x20, 0x05, 0x36, 0x02, 0xcc, 0x9e, 0x80, + 0x80, 0x00, 0x41, 0x00, 0x20, 0x03, 0x36, 0x02, 0xc0, 0x9e, 0x80, 0x80, + 0x00, 0x0b, 0x20, 0x00, 0x41, 0x08, 0x6a, 0x21, 0x04, 0x0b, 0x20, 0x01, + 0x41, 0x10, 0x6a, 0x24, 0x80, 0x80, 0x80, 0x80, 0x00, 0x20, 0x04, 0x0b, + 0x0a, 0x00, 0x20, 0x00, 0x10, 0x93, 0x80, 0x80, 0x80, 0x00, 0x0b, 0xb0, + 0x0d, 0x01, 0x07, 0x7f, 0x02, 0x40, 0x20, 0x00, 0x45, 0x0d, 0x00, 0x20, + 0x00, 0x41, 0x78, 0x6a, 0x22, 0x01, 0x20, 0x00, 0x41, 0x7c, 0x6a, 0x28, + 0x02, 0x00, 0x22, 0x02, 0x41, 0x78, 0x71, 0x22, 0x00, 0x6a, 0x21, 0x03, + 0x02, 0x40, 0x20, 0x02, 0x41, 0x01, 0x71, 0x0d, 0x00, 0x20, 0x02, 0x41, + 0x03, 0x71, 0x45, 0x0d, 0x01, 0x20, 0x01, 0x20, 0x01, 0x28, 0x02, 0x00, + 0x22, 0x02, 0x6b, 0x22, 0x01, 0x41, 0x00, 0x28, 0x02, 0xc8, 0x9e, 0x80, + 0x80, 0x00, 0x22, 0x04, 0x49, 0x0d, 0x01, 0x20, 0x02, 0x20, 0x00, 0x6a, + 0x21, 0x00, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, 0x20, 0x01, 0x41, 0x00, + 0x28, 0x02, 0xcc, 0x9e, 0x80, 0x80, 0x00, 0x46, 0x0d, 0x00, 0x02, 0x40, + 0x20, 0x02, 0x41, 0xff, 0x01, 0x4b, 0x0d, 0x00, 0x20, 0x01, 0x28, 0x02, + 0x08, 0x22, 0x04, 0x20, 0x02, 0x41, 0x03, 0x76, 0x22, 0x05, 0x41, 0x03, + 0x74, 0x41, 0xe0, 0x9e, 0x80, 0x80, 0x00, 0x6a, 0x22, 0x06, 0x46, 0x1a, + 0x02, 0x40, 0x20, 0x01, 0x28, 0x02, 0x0c, 0x22, 0x02, 0x20, 0x04, 0x47, + 0x0d, 0x00, 0x41, 0x00, 0x41, 0x00, 0x28, 0x02, 0xb8, 0x9e, 0x80, 0x80, + 0x00, 0x41, 0x7e, 0x20, 0x05, 0x77, 0x71, 0x36, 0x02, 0xb8, 0x9e, 0x80, + 0x80, 0x00, 0x0c, 0x05, 0x0b, 0x20, 0x02, 0x20, 0x06, 0x46, 0x1a, 0x20, + 0x02, 0x20, 0x04, 0x36, 0x02, 0x08, 0x20, 0x04, 0x20, 0x02, 0x36, 0x02, + 0x0c, 0x0c, 0x04, 0x0b, 0x20, 0x01, 0x28, 0x02, 0x18, 0x21, 0x07, 0x02, + 0x40, 0x20, 0x01, 0x28, 0x02, 0x0c, 0x22, 0x06, 0x20, 0x01, 0x46, 0x0d, + 0x00, 0x20, 0x01, 0x28, 0x02, 0x08, 0x22, 0x02, 0x20, 0x04, 0x49, 0x1a, + 0x20, 0x06, 0x20, 0x02, 0x36, 0x02, 0x08, 0x20, 0x02, 0x20, 0x06, 0x36, + 0x02, 0x0c, 0x0c, 0x03, 0x0b, 0x02, 0x40, 0x20, 0x01, 0x41, 0x14, 0x6a, + 0x22, 0x04, 0x28, 0x02, 0x00, 0x22, 0x02, 0x0d, 0x00, 0x20, 0x01, 0x28, + 0x02, 0x10, 0x22, 0x02, 0x45, 0x0d, 0x02, 0x20, 0x01, 0x41, 0x10, 0x6a, + 0x21, 0x04, 0x0b, 0x03, 0x40, 0x20, 0x04, 0x21, 0x05, 0x20, 0x02, 0x22, + 0x06, 0x41, 0x14, 0x6a, 0x22, 0x04, 0x28, 0x02, 0x00, 0x22, 0x02, 0x0d, + 0x00, 0x20, 0x06, 0x41, 0x10, 0x6a, 0x21, 0x04, 0x20, 0x06, 0x28, 0x02, + 0x10, 0x22, 0x02, 0x0d, 0x00, 0x0b, 0x20, 0x05, 0x41, 0x00, 0x36, 0x02, + 0x00, 0x0c, 0x02, 0x0b, 0x20, 0x03, 0x28, 0x02, 0x04, 0x22, 0x02, 0x41, + 0x03, 0x71, 0x41, 0x03, 0x47, 0x0d, 0x02, 0x20, 0x03, 0x20, 0x02, 0x41, + 0x7e, 0x71, 0x36, 0x02, 0x04, 0x41, 0x00, 0x20, 0x00, 0x36, 0x02, 0xc0, + 0x9e, 0x80, 0x80, 0x00, 0x20, 0x03, 0x20, 0x00, 0x36, 0x02, 0x00, 0x20, + 0x01, 0x20, 0x00, 0x41, 0x01, 0x72, 0x36, 0x02, 0x04, 0x0f, 0x0b, 0x41, + 0x00, 0x21, 0x06, 0x0b, 0x20, 0x07, 0x45, 0x0d, 0x00, 0x02, 0x40, 0x02, + 0x40, 0x20, 0x01, 0x20, 0x01, 0x28, 0x02, 0x1c, 0x22, 0x04, 0x41, 0x02, + 0x74, 0x41, 0xe8, 0xa0, 0x80, 0x80, 0x00, 0x6a, 0x22, 0x02, 0x28, 0x02, + 0x00, 0x47, 0x0d, 0x00, 0x20, 0x02, 0x20, 0x06, 0x36, 0x02, 0x00, 0x20, + 0x06, 0x0d, 0x01, 0x41, 0x00, 0x41, 0x00, 0x28, 0x02, 0xbc, 0x9e, 0x80, + 0x80, 0x00, 0x41, 0x7e, 0x20, 0x04, 0x77, 0x71, 0x36, 0x02, 0xbc, 0x9e, + 0x80, 0x80, 0x00, 0x0c, 0x02, 0x0b, 0x20, 0x07, 0x41, 0x10, 0x41, 0x14, + 0x20, 0x07, 0x28, 0x02, 0x10, 0x20, 0x01, 0x46, 0x1b, 0x6a, 0x20, 0x06, + 0x36, 0x02, 0x00, 0x20, 0x06, 0x45, 0x0d, 0x01, 0x0b, 0x20, 0x06, 0x20, + 0x07, 0x36, 0x02, 0x18, 0x02, 0x40, 0x20, 0x01, 0x28, 0x02, 0x10, 0x22, + 0x02, 0x45, 0x0d, 0x00, 0x20, 0x06, 0x20, 0x02, 0x36, 0x02, 0x10, 0x20, + 0x02, 0x20, 0x06, 0x36, 0x02, 0x18, 0x0b, 0x20, 0x01, 0x41, 0x14, 0x6a, + 0x28, 0x02, 0x00, 0x22, 0x02, 0x45, 0x0d, 0x00, 0x20, 0x06, 0x41, 0x14, + 0x6a, 0x20, 0x02, 0x36, 0x02, 0x00, 0x20, 0x02, 0x20, 0x06, 0x36, 0x02, + 0x18, 0x0b, 0x20, 0x01, 0x20, 0x03, 0x4f, 0x0d, 0x00, 0x20, 0x03, 0x28, + 0x02, 0x04, 0x22, 0x02, 0x41, 0x01, 0x71, 0x45, 0x0d, 0x00, 0x02, 0x40, + 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, 0x20, 0x02, 0x41, 0x02, + 0x71, 0x0d, 0x00, 0x02, 0x40, 0x20, 0x03, 0x41, 0x00, 0x28, 0x02, 0xd0, + 0x9e, 0x80, 0x80, 0x00, 0x47, 0x0d, 0x00, 0x41, 0x00, 0x20, 0x01, 0x36, + 0x02, 0xd0, 0x9e, 0x80, 0x80, 0x00, 0x41, 0x00, 0x41, 0x00, 0x28, 0x02, + 0xc4, 0x9e, 0x80, 0x80, 0x00, 0x20, 0x00, 0x6a, 0x22, 0x00, 0x36, 0x02, + 0xc4, 0x9e, 0x80, 0x80, 0x00, 0x20, 0x01, 0x20, 0x00, 0x41, 0x01, 0x72, + 0x36, 0x02, 0x04, 0x20, 0x01, 0x41, 0x00, 0x28, 0x02, 0xcc, 0x9e, 0x80, + 0x80, 0x00, 0x47, 0x0d, 0x06, 0x41, 0x00, 0x41, 0x00, 0x36, 0x02, 0xc0, + 0x9e, 0x80, 0x80, 0x00, 0x41, 0x00, 0x41, 0x00, 0x36, 0x02, 0xcc, 0x9e, + 0x80, 0x80, 0x00, 0x0f, 0x0b, 0x02, 0x40, 0x20, 0x03, 0x41, 0x00, 0x28, + 0x02, 0xcc, 0x9e, 0x80, 0x80, 0x00, 0x47, 0x0d, 0x00, 0x41, 0x00, 0x20, + 0x01, 0x36, 0x02, 0xcc, 0x9e, 0x80, 0x80, 0x00, 0x41, 0x00, 0x41, 0x00, + 0x28, 0x02, 0xc0, 0x9e, 0x80, 0x80, 0x00, 0x20, 0x00, 0x6a, 0x22, 0x00, + 0x36, 0x02, 0xc0, 0x9e, 0x80, 0x80, 0x00, 0x20, 0x01, 0x20, 0x00, 0x41, + 0x01, 0x72, 0x36, 0x02, 0x04, 0x20, 0x01, 0x20, 0x00, 0x6a, 0x20, 0x00, + 0x36, 0x02, 0x00, 0x0f, 0x0b, 0x20, 0x02, 0x41, 0x78, 0x71, 0x20, 0x00, + 0x6a, 0x21, 0x00, 0x02, 0x40, 0x20, 0x02, 0x41, 0xff, 0x01, 0x4b, 0x0d, + 0x00, 0x20, 0x03, 0x28, 0x02, 0x08, 0x22, 0x04, 0x20, 0x02, 0x41, 0x03, + 0x76, 0x22, 0x05, 0x41, 0x03, 0x74, 0x41, 0xe0, 0x9e, 0x80, 0x80, 0x00, + 0x6a, 0x22, 0x06, 0x46, 0x1a, 0x02, 0x40, 0x20, 0x03, 0x28, 0x02, 0x0c, + 0x22, 0x02, 0x20, 0x04, 0x47, 0x0d, 0x00, 0x41, 0x00, 0x41, 0x00, 0x28, + 0x02, 0xb8, 0x9e, 0x80, 0x80, 0x00, 0x41, 0x7e, 0x20, 0x05, 0x77, 0x71, + 0x36, 0x02, 0xb8, 0x9e, 0x80, 0x80, 0x00, 0x0c, 0x05, 0x0b, 0x20, 0x02, + 0x20, 0x06, 0x46, 0x1a, 0x20, 0x02, 0x20, 0x04, 0x36, 0x02, 0x08, 0x20, + 0x04, 0x20, 0x02, 0x36, 0x02, 0x0c, 0x0c, 0x04, 0x0b, 0x20, 0x03, 0x28, + 0x02, 0x18, 0x21, 0x07, 0x02, 0x40, 0x20, 0x03, 0x28, 0x02, 0x0c, 0x22, + 0x06, 0x20, 0x03, 0x46, 0x0d, 0x00, 0x20, 0x03, 0x28, 0x02, 0x08, 0x22, + 0x02, 0x41, 0x00, 0x28, 0x02, 0xc8, 0x9e, 0x80, 0x80, 0x00, 0x49, 0x1a, + 0x20, 0x06, 0x20, 0x02, 0x36, 0x02, 0x08, 0x20, 0x02, 0x20, 0x06, 0x36, + 0x02, 0x0c, 0x0c, 0x03, 0x0b, 0x02, 0x40, 0x20, 0x03, 0x41, 0x14, 0x6a, + 0x22, 0x04, 0x28, 0x02, 0x00, 0x22, 0x02, 0x0d, 0x00, 0x20, 0x03, 0x28, + 0x02, 0x10, 0x22, 0x02, 0x45, 0x0d, 0x02, 0x20, 0x03, 0x41, 0x10, 0x6a, + 0x21, 0x04, 0x0b, 0x03, 0x40, 0x20, 0x04, 0x21, 0x05, 0x20, 0x02, 0x22, + 0x06, 0x41, 0x14, 0x6a, 0x22, 0x04, 0x28, 0x02, 0x00, 0x22, 0x02, 0x0d, + 0x00, 0x20, 0x06, 0x41, 0x10, 0x6a, 0x21, 0x04, 0x20, 0x06, 0x28, 0x02, + 0x10, 0x22, 0x02, 0x0d, 0x00, 0x0b, 0x20, 0x05, 0x41, 0x00, 0x36, 0x02, + 0x00, 0x0c, 0x02, 0x0b, 0x20, 0x03, 0x20, 0x02, 0x41, 0x7e, 0x71, 0x36, + 0x02, 0x04, 0x20, 0x01, 0x20, 0x00, 0x6a, 0x20, 0x00, 0x36, 0x02, 0x00, + 0x20, 0x01, 0x20, 0x00, 0x41, 0x01, 0x72, 0x36, 0x02, 0x04, 0x0c, 0x03, + 0x0b, 0x41, 0x00, 0x21, 0x06, 0x0b, 0x20, 0x07, 0x45, 0x0d, 0x00, 0x02, + 0x40, 0x02, 0x40, 0x20, 0x03, 0x20, 0x03, 0x28, 0x02, 0x1c, 0x22, 0x04, + 0x41, 0x02, 0x74, 0x41, 0xe8, 0xa0, 0x80, 0x80, 0x00, 0x6a, 0x22, 0x02, + 0x28, 0x02, 0x00, 0x47, 0x0d, 0x00, 0x20, 0x02, 0x20, 0x06, 0x36, 0x02, + 0x00, 0x20, 0x06, 0x0d, 0x01, 0x41, 0x00, 0x41, 0x00, 0x28, 0x02, 0xbc, + 0x9e, 0x80, 0x80, 0x00, 0x41, 0x7e, 0x20, 0x04, 0x77, 0x71, 0x36, 0x02, + 0xbc, 0x9e, 0x80, 0x80, 0x00, 0x0c, 0x02, 0x0b, 0x20, 0x07, 0x41, 0x10, + 0x41, 0x14, 0x20, 0x07, 0x28, 0x02, 0x10, 0x20, 0x03, 0x46, 0x1b, 0x6a, + 0x20, 0x06, 0x36, 0x02, 0x00, 0x20, 0x06, 0x45, 0x0d, 0x01, 0x0b, 0x20, + 0x06, 0x20, 0x07, 0x36, 0x02, 0x18, 0x02, 0x40, 0x20, 0x03, 0x28, 0x02, + 0x10, 0x22, 0x02, 0x45, 0x0d, 0x00, 0x20, 0x06, 0x20, 0x02, 0x36, 0x02, + 0x10, 0x20, 0x02, 0x20, 0x06, 0x36, 0x02, 0x18, 0x0b, 0x20, 0x03, 0x41, + 0x14, 0x6a, 0x28, 0x02, 0x00, 0x22, 0x02, 0x45, 0x0d, 0x00, 0x20, 0x06, + 0x41, 0x14, 0x6a, 0x20, 0x02, 0x36, 0x02, 0x00, 0x20, 0x02, 0x20, 0x06, + 0x36, 0x02, 0x18, 0x0b, 0x20, 0x01, 0x20, 0x00, 0x6a, 0x20, 0x00, 0x36, + 0x02, 0x00, 0x20, 0x01, 0x20, 0x00, 0x41, 0x01, 0x72, 0x36, 0x02, 0x04, + 0x20, 0x01, 0x41, 0x00, 0x28, 0x02, 0xcc, 0x9e, 0x80, 0x80, 0x00, 0x47, + 0x0d, 0x00, 0x41, 0x00, 0x20, 0x00, 0x36, 0x02, 0xc0, 0x9e, 0x80, 0x80, + 0x00, 0x0f, 0x0b, 0x02, 0x40, 0x20, 0x00, 0x41, 0xff, 0x01, 0x4b, 0x0d, + 0x00, 0x20, 0x00, 0x41, 0x78, 0x71, 0x41, 0xe0, 0x9e, 0x80, 0x80, 0x00, + 0x6a, 0x21, 0x02, 0x02, 0x40, 0x02, 0x40, 0x41, 0x00, 0x28, 0x02, 0xb8, + 0x9e, 0x80, 0x80, 0x00, 0x22, 0x04, 0x41, 0x01, 0x20, 0x00, 0x41, 0x03, + 0x76, 0x74, 0x22, 0x00, 0x71, 0x0d, 0x00, 0x41, 0x00, 0x20, 0x04, 0x20, + 0x00, 0x72, 0x36, 0x02, 0xb8, 0x9e, 0x80, 0x80, 0x00, 0x20, 0x02, 0x21, + 0x00, 0x0c, 0x01, 0x0b, 0x20, 0x02, 0x28, 0x02, 0x08, 0x21, 0x00, 0x0b, + 0x20, 0x00, 0x20, 0x01, 0x36, 0x02, 0x0c, 0x20, 0x02, 0x20, 0x01, 0x36, + 0x02, 0x08, 0x20, 0x01, 0x20, 0x02, 0x36, 0x02, 0x0c, 0x20, 0x01, 0x20, + 0x00, 0x36, 0x02, 0x08, 0x0f, 0x0b, 0x41, 0x1f, 0x21, 0x02, 0x02, 0x40, + 0x20, 0x00, 0x41, 0xff, 0xff, 0xff, 0x07, 0x4b, 0x0d, 0x00, 0x20, 0x00, + 0x41, 0x26, 0x20, 0x00, 0x41, 0x08, 0x76, 0x67, 0x22, 0x02, 0x6b, 0x76, + 0x41, 0x01, 0x71, 0x20, 0x02, 0x41, 0x01, 0x74, 0x6b, 0x41, 0x3e, 0x6a, + 0x21, 0x02, 0x0b, 0x20, 0x01, 0x20, 0x02, 0x36, 0x02, 0x1c, 0x20, 0x01, + 0x42, 0x00, 0x37, 0x02, 0x10, 0x20, 0x02, 0x41, 0x02, 0x74, 0x41, 0xe8, + 0xa0, 0x80, 0x80, 0x00, 0x6a, 0x21, 0x04, 0x02, 0x40, 0x02, 0x40, 0x41, + 0x00, 0x28, 0x02, 0xbc, 0x9e, 0x80, 0x80, 0x00, 0x22, 0x06, 0x41, 0x01, + 0x20, 0x02, 0x74, 0x22, 0x03, 0x71, 0x0d, 0x00, 0x20, 0x04, 0x20, 0x01, + 0x36, 0x02, 0x00, 0x41, 0x00, 0x20, 0x06, 0x20, 0x03, 0x72, 0x36, 0x02, + 0xbc, 0x9e, 0x80, 0x80, 0x00, 0x20, 0x01, 0x20, 0x04, 0x36, 0x02, 0x18, + 0x20, 0x01, 0x20, 0x01, 0x36, 0x02, 0x08, 0x20, 0x01, 0x20, 0x01, 0x36, + 0x02, 0x0c, 0x0c, 0x01, 0x0b, 0x20, 0x00, 0x41, 0x00, 0x41, 0x19, 0x20, + 0x02, 0x41, 0x01, 0x76, 0x6b, 0x20, 0x02, 0x41, 0x1f, 0x46, 0x1b, 0x74, + 0x21, 0x02, 0x20, 0x04, 0x28, 0x02, 0x00, 0x21, 0x06, 0x02, 0x40, 0x03, + 0x40, 0x20, 0x06, 0x22, 0x04, 0x28, 0x02, 0x04, 0x41, 0x78, 0x71, 0x20, + 0x00, 0x46, 0x0d, 0x01, 0x20, 0x02, 0x41, 0x1d, 0x76, 0x21, 0x06, 0x20, + 0x02, 0x41, 0x01, 0x74, 0x21, 0x02, 0x20, 0x04, 0x20, 0x06, 0x41, 0x04, + 0x71, 0x6a, 0x41, 0x10, 0x6a, 0x22, 0x03, 0x28, 0x02, 0x00, 0x22, 0x06, + 0x0d, 0x00, 0x0b, 0x20, 0x03, 0x20, 0x01, 0x36, 0x02, 0x00, 0x20, 0x01, + 0x20, 0x04, 0x36, 0x02, 0x18, 0x20, 0x01, 0x20, 0x01, 0x36, 0x02, 0x0c, + 0x20, 0x01, 0x20, 0x01, 0x36, 0x02, 0x08, 0x0c, 0x01, 0x0b, 0x20, 0x04, + 0x28, 0x02, 0x08, 0x22, 0x00, 0x20, 0x01, 0x36, 0x02, 0x0c, 0x20, 0x04, + 0x20, 0x01, 0x36, 0x02, 0x08, 0x20, 0x01, 0x41, 0x00, 0x36, 0x02, 0x18, + 0x20, 0x01, 0x20, 0x04, 0x36, 0x02, 0x0c, 0x20, 0x01, 0x20, 0x00, 0x36, + 0x02, 0x08, 0x0b, 0x41, 0x00, 0x41, 0x00, 0x28, 0x02, 0xd8, 0x9e, 0x80, + 0x80, 0x00, 0x41, 0x7f, 0x6a, 0x22, 0x01, 0x41, 0x7f, 0x20, 0x01, 0x1b, + 0x36, 0x02, 0xd8, 0x9e, 0x80, 0x80, 0x00, 0x0b, 0x0b, 0x6b, 0x02, 0x01, + 0x7f, 0x01, 0x7e, 0x02, 0x40, 0x02, 0x40, 0x20, 0x00, 0x0d, 0x00, 0x41, + 0x00, 0x21, 0x02, 0x0c, 0x01, 0x0b, 0x20, 0x00, 0xad, 0x20, 0x01, 0xad, + 0x7e, 0x22, 0x03, 0xa7, 0x21, 0x02, 0x20, 0x01, 0x20, 0x00, 0x72, 0x41, + 0x80, 0x80, 0x04, 0x49, 0x0d, 0x00, 0x41, 0x7f, 0x20, 0x02, 0x20, 0x03, + 0x42, 0x20, 0x88, 0xa7, 0x41, 0x00, 0x47, 0x1b, 0x21, 0x02, 0x0b, 0x02, + 0x40, 0x20, 0x02, 0x10, 0x91, 0x80, 0x80, 0x80, 0x00, 0x22, 0x00, 0x45, + 0x0d, 0x00, 0x20, 0x00, 0x41, 0x7c, 0x6a, 0x2d, 0x00, 0x00, 0x41, 0x03, + 0x71, 0x45, 0x0d, 0x00, 0x20, 0x00, 0x41, 0x00, 0x20, 0x02, 0x10, 0xa9, + 0x80, 0x80, 0x80, 0x00, 0x1a, 0x0b, 0x20, 0x00, 0x0b, 0x0b, 0x00, 0x20, + 0x00, 0x10, 0xa3, 0x80, 0x80, 0x80, 0x00, 0x00, 0x0b, 0xd5, 0x01, 0x01, + 0x03, 0x7f, 0x23, 0x80, 0x80, 0x80, 0x80, 0x00, 0x41, 0x10, 0x6b, 0x22, + 0x00, 0x24, 0x80, 0x80, 0x80, 0x80, 0x00, 0x02, 0x40, 0x02, 0x40, 0x02, + 0x40, 0x02, 0x40, 0x02, 0x40, 0x20, 0x00, 0x41, 0x08, 0x6a, 0x20, 0x00, + 0x41, 0x0c, 0x6a, 0x10, 0x98, 0x80, 0x80, 0x80, 0x00, 0x0d, 0x00, 0x20, + 0x00, 0x28, 0x02, 0x08, 0x41, 0x01, 0x6a, 0x22, 0x01, 0x45, 0x0d, 0x01, + 0x20, 0x00, 0x28, 0x02, 0x0c, 0x10, 0x90, 0x80, 0x80, 0x80, 0x00, 0x22, + 0x02, 0x45, 0x0d, 0x02, 0x20, 0x01, 0x41, 0x04, 0x10, 0x94, 0x80, 0x80, + 0x80, 0x00, 0x22, 0x01, 0x45, 0x0d, 0x03, 0x20, 0x01, 0x20, 0x02, 0x10, + 0x97, 0x80, 0x80, 0x80, 0x00, 0x0d, 0x04, 0x20, 0x00, 0x28, 0x02, 0x08, + 0x20, 0x01, 0x10, 0xe2, 0x80, 0x80, 0x80, 0x00, 0x21, 0x01, 0x20, 0x00, + 0x41, 0x10, 0x6a, 0x24, 0x80, 0x80, 0x80, 0x80, 0x00, 0x20, 0x01, 0x0f, + 0x0b, 0x41, 0xc7, 0x00, 0x10, 0x95, 0x80, 0x80, 0x80, 0x00, 0x00, 0x0b, + 0x41, 0xc6, 0x00, 0x10, 0x95, 0x80, 0x80, 0x80, 0x00, 0x00, 0x0b, 0x41, + 0xc6, 0x00, 0x10, 0x95, 0x80, 0x80, 0x80, 0x00, 0x00, 0x0b, 0x20, 0x02, + 0x10, 0x92, 0x80, 0x80, 0x80, 0x00, 0x41, 0xc6, 0x00, 0x10, 0x95, 0x80, + 0x80, 0x80, 0x00, 0x00, 0x0b, 0x20, 0x02, 0x10, 0x92, 0x80, 0x80, 0x80, + 0x00, 0x20, 0x01, 0x10, 0x92, 0x80, 0x80, 0x80, 0x00, 0x41, 0xc7, 0x00, + 0x10, 0x95, 0x80, 0x80, 0x80, 0x00, 0x00, 0x0b, 0x11, 0x00, 0x20, 0x00, + 0x20, 0x01, 0x10, 0x80, 0x80, 0x80, 0x80, 0x00, 0x41, 0xff, 0xff, 0x03, + 0x71, 0x0b, 0x11, 0x00, 0x20, 0x00, 0x20, 0x01, 0x10, 0x81, 0x80, 0x80, + 0x80, 0x00, 0x41, 0xff, 0xff, 0x03, 0x71, 0x0b, 0x0f, 0x00, 0x20, 0x00, + 0x10, 0x82, 0x80, 0x80, 0x80, 0x00, 0x41, 0xff, 0xff, 0x03, 0x71, 0x0b, + 0x11, 0x00, 0x20, 0x00, 0x20, 0x01, 0x10, 0x83, 0x80, 0x80, 0x80, 0x00, + 0x41, 0xff, 0xff, 0x03, 0x71, 0x0b, 0x11, 0x00, 0x20, 0x00, 0x20, 0x01, + 0x10, 0x84, 0x80, 0x80, 0x80, 0x00, 0x41, 0xff, 0xff, 0x03, 0x71, 0x0b, + 0x11, 0x00, 0x20, 0x00, 0x20, 0x01, 0x10, 0x85, 0x80, 0x80, 0x80, 0x00, + 0x41, 0xff, 0xff, 0x03, 0x71, 0x0b, 0x13, 0x00, 0x20, 0x00, 0x20, 0x01, + 0x20, 0x02, 0x10, 0x86, 0x80, 0x80, 0x80, 0x00, 0x41, 0xff, 0xff, 0x03, + 0x71, 0x0b, 0x15, 0x00, 0x20, 0x00, 0x20, 0x01, 0x20, 0x02, 0x20, 0x03, + 0x10, 0x87, 0x80, 0x80, 0x80, 0x00, 0x41, 0xff, 0xff, 0x03, 0x71, 0x0b, + 0x15, 0x00, 0x20, 0x00, 0x20, 0x01, 0x20, 0x02, 0x20, 0x03, 0x10, 0x88, + 0x80, 0x80, 0x80, 0x00, 0x41, 0xff, 0xff, 0x03, 0x71, 0x0b, 0x15, 0x00, + 0x20, 0x00, 0x20, 0x01, 0x20, 0x02, 0x20, 0x03, 0x10, 0x89, 0x80, 0x80, + 0x80, 0x00, 0x41, 0xff, 0xff, 0x03, 0x71, 0x0b, 0x19, 0x00, 0x20, 0x00, + 0x20, 0x01, 0x20, 0x01, 0x10, 0xaa, 0x80, 0x80, 0x80, 0x00, 0x10, 0x8a, + 0x80, 0x80, 0x80, 0x00, 0x41, 0xff, 0xff, 0x03, 0x71, 0x0b, 0x25, 0x00, + 0x20, 0x00, 0x20, 0x01, 0x20, 0x02, 0x20, 0x02, 0x10, 0xaa, 0x80, 0x80, + 0x80, 0x00, 0x20, 0x03, 0x20, 0x04, 0x20, 0x05, 0x20, 0x06, 0x20, 0x07, + 0x10, 0x8b, 0x80, 0x80, 0x80, 0x00, 0x41, 0xff, 0xff, 0x03, 0x71, 0x0b, + 0x0b, 0x00, 0x20, 0x00, 0x10, 0x8c, 0x80, 0x80, 0x80, 0x00, 0x00, 0x0b, + 0x04, 0x00, 0x00, 0x00, 0x0b, 0x4e, 0x00, 0x02, 0x40, 0x20, 0x00, 0x0d, + 0x00, 0x3f, 0x00, 0x41, 0x10, 0x74, 0x0f, 0x0b, 0x02, 0x40, 0x20, 0x00, + 0x41, 0xff, 0xff, 0x03, 0x71, 0x0d, 0x00, 0x20, 0x00, 0x41, 0x7f, 0x4c, + 0x0d, 0x00, 0x02, 0x40, 0x20, 0x00, 0x41, 0x10, 0x76, 0x40, 0x00, 0x22, + 0x00, 0x41, 0x7f, 0x47, 0x0d, 0x00, 0x41, 0x00, 0x41, 0x30, 0x36, 0x02, + 0xb4, 0x9e, 0x80, 0x80, 0x00, 0x41, 0x7f, 0x0f, 0x0b, 0x20, 0x00, 0x41, + 0x10, 0x74, 0x0f, 0x0b, 0x10, 0xa4, 0x80, 0x80, 0x80, 0x00, 0x00, 0x0b, + 0x02, 0x00, 0x0b, 0x0e, 0x00, 0x10, 0xa6, 0x80, 0x80, 0x80, 0x00, 0x10, + 0xb5, 0x80, 0x80, 0x80, 0x00, 0x0b, 0xe6, 0x07, 0x01, 0x04, 0x7f, 0x02, + 0x40, 0x02, 0x40, 0x02, 0x40, 0x20, 0x02, 0x41, 0x20, 0x4b, 0x0d, 0x00, + 0x20, 0x01, 0x41, 0x03, 0x71, 0x45, 0x0d, 0x01, 0x20, 0x02, 0x45, 0x0d, + 0x01, 0x20, 0x00, 0x20, 0x01, 0x2d, 0x00, 0x00, 0x3a, 0x00, 0x00, 0x20, + 0x02, 0x41, 0x7f, 0x6a, 0x21, 0x03, 0x20, 0x00, 0x41, 0x01, 0x6a, 0x21, + 0x04, 0x20, 0x01, 0x41, 0x01, 0x6a, 0x22, 0x05, 0x41, 0x03, 0x71, 0x45, + 0x0d, 0x02, 0x20, 0x03, 0x45, 0x0d, 0x02, 0x20, 0x00, 0x20, 0x01, 0x2d, + 0x00, 0x01, 0x3a, 0x00, 0x01, 0x20, 0x02, 0x41, 0x7e, 0x6a, 0x21, 0x03, + 0x20, 0x00, 0x41, 0x02, 0x6a, 0x21, 0x04, 0x20, 0x01, 0x41, 0x02, 0x6a, + 0x22, 0x05, 0x41, 0x03, 0x71, 0x45, 0x0d, 0x02, 0x20, 0x03, 0x45, 0x0d, + 0x02, 0x20, 0x00, 0x20, 0x01, 0x2d, 0x00, 0x02, 0x3a, 0x00, 0x02, 0x20, + 0x02, 0x41, 0x7d, 0x6a, 0x21, 0x03, 0x20, 0x00, 0x41, 0x03, 0x6a, 0x21, + 0x04, 0x20, 0x01, 0x41, 0x03, 0x6a, 0x22, 0x05, 0x41, 0x03, 0x71, 0x45, + 0x0d, 0x02, 0x20, 0x03, 0x45, 0x0d, 0x02, 0x20, 0x00, 0x20, 0x01, 0x2d, + 0x00, 0x03, 0x3a, 0x00, 0x03, 0x20, 0x02, 0x41, 0x7c, 0x6a, 0x21, 0x03, + 0x20, 0x00, 0x41, 0x04, 0x6a, 0x21, 0x04, 0x20, 0x01, 0x41, 0x04, 0x6a, + 0x21, 0x05, 0x0c, 0x02, 0x0b, 0x20, 0x00, 0x20, 0x01, 0x20, 0x02, 0xfc, + 0x0a, 0x00, 0x00, 0x20, 0x00, 0x0f, 0x0b, 0x20, 0x02, 0x21, 0x03, 0x20, + 0x00, 0x21, 0x04, 0x20, 0x01, 0x21, 0x05, 0x0b, 0x02, 0x40, 0x02, 0x40, + 0x20, 0x04, 0x41, 0x03, 0x71, 0x22, 0x02, 0x0d, 0x00, 0x02, 0x40, 0x02, + 0x40, 0x20, 0x03, 0x41, 0x10, 0x4f, 0x0d, 0x00, 0x20, 0x03, 0x21, 0x02, + 0x0c, 0x01, 0x0b, 0x02, 0x40, 0x20, 0x03, 0x41, 0x70, 0x6a, 0x22, 0x02, + 0x41, 0x10, 0x71, 0x0d, 0x00, 0x20, 0x04, 0x20, 0x05, 0x29, 0x02, 0x00, + 0x37, 0x02, 0x00, 0x20, 0x04, 0x20, 0x05, 0x29, 0x02, 0x08, 0x37, 0x02, + 0x08, 0x20, 0x04, 0x41, 0x10, 0x6a, 0x21, 0x04, 0x20, 0x05, 0x41, 0x10, + 0x6a, 0x21, 0x05, 0x20, 0x02, 0x21, 0x03, 0x0b, 0x20, 0x02, 0x41, 0x10, + 0x49, 0x0d, 0x00, 0x20, 0x03, 0x21, 0x02, 0x03, 0x40, 0x20, 0x04, 0x20, + 0x05, 0x29, 0x02, 0x00, 0x37, 0x02, 0x00, 0x20, 0x04, 0x20, 0x05, 0x29, + 0x02, 0x08, 0x37, 0x02, 0x08, 0x20, 0x04, 0x20, 0x05, 0x29, 0x02, 0x10, + 0x37, 0x02, 0x10, 0x20, 0x04, 0x20, 0x05, 0x29, 0x02, 0x18, 0x37, 0x02, + 0x18, 0x20, 0x04, 0x41, 0x20, 0x6a, 0x21, 0x04, 0x20, 0x05, 0x41, 0x20, + 0x6a, 0x21, 0x05, 0x20, 0x02, 0x41, 0x60, 0x6a, 0x22, 0x02, 0x41, 0x0f, + 0x4b, 0x0d, 0x00, 0x0b, 0x0b, 0x02, 0x40, 0x20, 0x02, 0x41, 0x08, 0x49, + 0x0d, 0x00, 0x20, 0x04, 0x20, 0x05, 0x29, 0x02, 0x00, 0x37, 0x02, 0x00, + 0x20, 0x05, 0x41, 0x08, 0x6a, 0x21, 0x05, 0x20, 0x04, 0x41, 0x08, 0x6a, + 0x21, 0x04, 0x0b, 0x02, 0x40, 0x20, 0x02, 0x41, 0x04, 0x71, 0x45, 0x0d, + 0x00, 0x20, 0x04, 0x20, 0x05, 0x28, 0x02, 0x00, 0x36, 0x02, 0x00, 0x20, + 0x05, 0x41, 0x04, 0x6a, 0x21, 0x05, 0x20, 0x04, 0x41, 0x04, 0x6a, 0x21, + 0x04, 0x0b, 0x02, 0x40, 0x20, 0x02, 0x41, 0x02, 0x71, 0x45, 0x0d, 0x00, + 0x20, 0x04, 0x20, 0x05, 0x2f, 0x00, 0x00, 0x3b, 0x00, 0x00, 0x20, 0x04, + 0x41, 0x02, 0x6a, 0x21, 0x04, 0x20, 0x05, 0x41, 0x02, 0x6a, 0x21, 0x05, + 0x0b, 0x20, 0x02, 0x41, 0x01, 0x71, 0x45, 0x0d, 0x01, 0x20, 0x04, 0x20, + 0x05, 0x2d, 0x00, 0x00, 0x3a, 0x00, 0x00, 0x20, 0x00, 0x0f, 0x0b, 0x02, + 0x40, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, 0x20, 0x03, 0x41, + 0x20, 0x49, 0x0d, 0x00, 0x02, 0x40, 0x02, 0x40, 0x20, 0x02, 0x41, 0x7f, + 0x6a, 0x0e, 0x03, 0x03, 0x00, 0x01, 0x07, 0x0b, 0x20, 0x04, 0x20, 0x05, + 0x28, 0x02, 0x00, 0x3b, 0x00, 0x00, 0x20, 0x04, 0x20, 0x05, 0x41, 0x02, + 0x6a, 0x28, 0x01, 0x00, 0x36, 0x02, 0x02, 0x20, 0x04, 0x20, 0x05, 0x41, + 0x06, 0x6a, 0x29, 0x01, 0x00, 0x37, 0x02, 0x06, 0x20, 0x04, 0x41, 0x12, + 0x6a, 0x21, 0x02, 0x20, 0x05, 0x41, 0x12, 0x6a, 0x21, 0x01, 0x41, 0x0e, + 0x21, 0x06, 0x20, 0x05, 0x41, 0x0e, 0x6a, 0x28, 0x01, 0x00, 0x21, 0x05, + 0x41, 0x0e, 0x21, 0x03, 0x0c, 0x03, 0x0b, 0x20, 0x04, 0x20, 0x05, 0x28, + 0x02, 0x00, 0x3a, 0x00, 0x00, 0x20, 0x04, 0x20, 0x05, 0x41, 0x01, 0x6a, + 0x28, 0x00, 0x00, 0x36, 0x02, 0x01, 0x20, 0x04, 0x20, 0x05, 0x41, 0x05, + 0x6a, 0x29, 0x00, 0x00, 0x37, 0x02, 0x05, 0x20, 0x04, 0x41, 0x11, 0x6a, + 0x21, 0x02, 0x20, 0x05, 0x41, 0x11, 0x6a, 0x21, 0x01, 0x41, 0x0d, 0x21, + 0x06, 0x20, 0x05, 0x41, 0x0d, 0x6a, 0x28, 0x00, 0x00, 0x21, 0x05, 0x41, + 0x0f, 0x21, 0x03, 0x0c, 0x02, 0x0b, 0x02, 0x40, 0x02, 0x40, 0x20, 0x03, + 0x41, 0x10, 0x4f, 0x0d, 0x00, 0x20, 0x04, 0x21, 0x02, 0x20, 0x05, 0x21, + 0x01, 0x0c, 0x01, 0x0b, 0x20, 0x04, 0x20, 0x05, 0x2d, 0x00, 0x00, 0x3a, + 0x00, 0x00, 0x20, 0x04, 0x20, 0x05, 0x28, 0x00, 0x01, 0x36, 0x00, 0x01, + 0x20, 0x04, 0x20, 0x05, 0x29, 0x00, 0x05, 0x37, 0x00, 0x05, 0x20, 0x04, + 0x20, 0x05, 0x2f, 0x00, 0x0d, 0x3b, 0x00, 0x0d, 0x20, 0x04, 0x20, 0x05, + 0x2d, 0x00, 0x0f, 0x3a, 0x00, 0x0f, 0x20, 0x04, 0x41, 0x10, 0x6a, 0x21, + 0x02, 0x20, 0x05, 0x41, 0x10, 0x6a, 0x21, 0x01, 0x0b, 0x20, 0x03, 0x41, + 0x08, 0x71, 0x0d, 0x02, 0x0c, 0x03, 0x0b, 0x20, 0x04, 0x20, 0x05, 0x28, + 0x02, 0x00, 0x22, 0x02, 0x3a, 0x00, 0x00, 0x20, 0x04, 0x20, 0x02, 0x41, + 0x10, 0x76, 0x3a, 0x00, 0x02, 0x20, 0x04, 0x20, 0x02, 0x41, 0x08, 0x76, + 0x3a, 0x00, 0x01, 0x20, 0x04, 0x20, 0x05, 0x41, 0x03, 0x6a, 0x28, 0x00, + 0x00, 0x36, 0x02, 0x03, 0x20, 0x04, 0x20, 0x05, 0x41, 0x07, 0x6a, 0x29, + 0x00, 0x00, 0x37, 0x02, 0x07, 0x20, 0x04, 0x41, 0x13, 0x6a, 0x21, 0x02, + 0x20, 0x05, 0x41, 0x13, 0x6a, 0x21, 0x01, 0x41, 0x0f, 0x21, 0x06, 0x20, + 0x05, 0x41, 0x0f, 0x6a, 0x28, 0x00, 0x00, 0x21, 0x05, 0x41, 0x0d, 0x21, + 0x03, 0x0b, 0x20, 0x04, 0x20, 0x06, 0x6a, 0x20, 0x05, 0x36, 0x02, 0x00, + 0x0b, 0x20, 0x02, 0x20, 0x01, 0x29, 0x00, 0x00, 0x37, 0x00, 0x00, 0x20, + 0x02, 0x41, 0x08, 0x6a, 0x21, 0x02, 0x20, 0x01, 0x41, 0x08, 0x6a, 0x21, + 0x01, 0x0b, 0x02, 0x40, 0x20, 0x03, 0x41, 0x04, 0x71, 0x45, 0x0d, 0x00, + 0x20, 0x02, 0x20, 0x01, 0x28, 0x00, 0x00, 0x36, 0x00, 0x00, 0x20, 0x02, + 0x41, 0x04, 0x6a, 0x21, 0x02, 0x20, 0x01, 0x41, 0x04, 0x6a, 0x21, 0x01, + 0x0b, 0x02, 0x40, 0x20, 0x03, 0x41, 0x02, 0x71, 0x45, 0x0d, 0x00, 0x20, + 0x02, 0x20, 0x01, 0x2f, 0x00, 0x00, 0x3b, 0x00, 0x00, 0x20, 0x02, 0x41, + 0x02, 0x6a, 0x21, 0x02, 0x20, 0x01, 0x41, 0x02, 0x6a, 0x21, 0x01, 0x0b, + 0x20, 0x03, 0x41, 0x01, 0x71, 0x45, 0x0d, 0x00, 0x20, 0x02, 0x20, 0x01, + 0x2d, 0x00, 0x00, 0x3a, 0x00, 0x00, 0x0b, 0x20, 0x00, 0x0b, 0x88, 0x03, + 0x02, 0x03, 0x7f, 0x01, 0x7e, 0x02, 0x40, 0x20, 0x02, 0x41, 0x21, 0x49, + 0x0d, 0x00, 0x20, 0x00, 0x20, 0x01, 0x20, 0x02, 0xfc, 0x0b, 0x00, 0x20, + 0x00, 0x0f, 0x0b, 0x02, 0x40, 0x20, 0x02, 0x45, 0x0d, 0x00, 0x20, 0x00, + 0x20, 0x01, 0x3a, 0x00, 0x00, 0x20, 0x02, 0x20, 0x00, 0x6a, 0x22, 0x03, + 0x41, 0x7f, 0x6a, 0x20, 0x01, 0x3a, 0x00, 0x00, 0x20, 0x02, 0x41, 0x03, + 0x49, 0x0d, 0x00, 0x20, 0x00, 0x20, 0x01, 0x3a, 0x00, 0x02, 0x20, 0x00, + 0x20, 0x01, 0x3a, 0x00, 0x01, 0x20, 0x03, 0x41, 0x7d, 0x6a, 0x20, 0x01, + 0x3a, 0x00, 0x00, 0x20, 0x03, 0x41, 0x7e, 0x6a, 0x20, 0x01, 0x3a, 0x00, + 0x00, 0x20, 0x02, 0x41, 0x07, 0x49, 0x0d, 0x00, 0x20, 0x00, 0x20, 0x01, + 0x3a, 0x00, 0x03, 0x20, 0x03, 0x41, 0x7c, 0x6a, 0x20, 0x01, 0x3a, 0x00, + 0x00, 0x20, 0x02, 0x41, 0x09, 0x49, 0x0d, 0x00, 0x20, 0x00, 0x41, 0x00, + 0x20, 0x00, 0x6b, 0x41, 0x03, 0x71, 0x22, 0x04, 0x6a, 0x22, 0x05, 0x20, + 0x01, 0x41, 0xff, 0x01, 0x71, 0x41, 0x81, 0x82, 0x84, 0x08, 0x6c, 0x22, + 0x03, 0x36, 0x02, 0x00, 0x20, 0x05, 0x20, 0x02, 0x20, 0x04, 0x6b, 0x41, + 0x7c, 0x71, 0x22, 0x01, 0x6a, 0x22, 0x02, 0x41, 0x7c, 0x6a, 0x20, 0x03, + 0x36, 0x02, 0x00, 0x20, 0x01, 0x41, 0x09, 0x49, 0x0d, 0x00, 0x20, 0x05, + 0x20, 0x03, 0x36, 0x02, 0x08, 0x20, 0x05, 0x20, 0x03, 0x36, 0x02, 0x04, + 0x20, 0x02, 0x41, 0x78, 0x6a, 0x20, 0x03, 0x36, 0x02, 0x00, 0x20, 0x02, + 0x41, 0x74, 0x6a, 0x20, 0x03, 0x36, 0x02, 0x00, 0x20, 0x01, 0x41, 0x19, + 0x49, 0x0d, 0x00, 0x20, 0x05, 0x20, 0x03, 0x36, 0x02, 0x18, 0x20, 0x05, + 0x20, 0x03, 0x36, 0x02, 0x14, 0x20, 0x05, 0x20, 0x03, 0x36, 0x02, 0x10, + 0x20, 0x05, 0x20, 0x03, 0x36, 0x02, 0x0c, 0x20, 0x02, 0x41, 0x70, 0x6a, + 0x20, 0x03, 0x36, 0x02, 0x00, 0x20, 0x02, 0x41, 0x6c, 0x6a, 0x20, 0x03, + 0x36, 0x02, 0x00, 0x20, 0x02, 0x41, 0x68, 0x6a, 0x20, 0x03, 0x36, 0x02, + 0x00, 0x20, 0x02, 0x41, 0x64, 0x6a, 0x20, 0x03, 0x36, 0x02, 0x00, 0x20, + 0x01, 0x20, 0x05, 0x41, 0x04, 0x71, 0x41, 0x18, 0x72, 0x22, 0x02, 0x6b, + 0x22, 0x01, 0x41, 0x20, 0x49, 0x0d, 0x00, 0x20, 0x03, 0xad, 0x42, 0x81, + 0x80, 0x80, 0x80, 0x10, 0x7e, 0x21, 0x06, 0x20, 0x05, 0x20, 0x02, 0x6a, + 0x21, 0x02, 0x03, 0x40, 0x20, 0x02, 0x20, 0x06, 0x37, 0x03, 0x18, 0x20, + 0x02, 0x20, 0x06, 0x37, 0x03, 0x10, 0x20, 0x02, 0x20, 0x06, 0x37, 0x03, + 0x08, 0x20, 0x02, 0x20, 0x06, 0x37, 0x03, 0x00, 0x20, 0x02, 0x41, 0x20, + 0x6a, 0x21, 0x02, 0x20, 0x01, 0x41, 0x60, 0x6a, 0x22, 0x01, 0x41, 0x1f, + 0x4b, 0x0d, 0x00, 0x0b, 0x0b, 0x20, 0x00, 0x0b, 0xcc, 0x01, 0x01, 0x03, + 0x7f, 0x20, 0x00, 0x21, 0x01, 0x02, 0x40, 0x02, 0x40, 0x20, 0x00, 0x41, + 0x03, 0x71, 0x45, 0x0d, 0x00, 0x02, 0x40, 0x20, 0x00, 0x2d, 0x00, 0x00, + 0x0d, 0x00, 0x20, 0x00, 0x20, 0x00, 0x6b, 0x0f, 0x0b, 0x20, 0x00, 0x41, + 0x01, 0x6a, 0x22, 0x01, 0x41, 0x03, 0x71, 0x45, 0x0d, 0x00, 0x20, 0x01, + 0x2d, 0x00, 0x00, 0x45, 0x0d, 0x01, 0x20, 0x00, 0x41, 0x02, 0x6a, 0x22, + 0x01, 0x41, 0x03, 0x71, 0x45, 0x0d, 0x00, 0x20, 0x01, 0x2d, 0x00, 0x00, + 0x45, 0x0d, 0x01, 0x20, 0x00, 0x41, 0x03, 0x6a, 0x22, 0x01, 0x41, 0x03, + 0x71, 0x45, 0x0d, 0x00, 0x20, 0x01, 0x2d, 0x00, 0x00, 0x45, 0x0d, 0x01, + 0x20, 0x00, 0x41, 0x04, 0x6a, 0x22, 0x01, 0x41, 0x03, 0x71, 0x0d, 0x01, + 0x0b, 0x20, 0x01, 0x41, 0x7c, 0x6a, 0x21, 0x02, 0x20, 0x01, 0x41, 0x7b, + 0x6a, 0x21, 0x01, 0x03, 0x40, 0x20, 0x01, 0x41, 0x04, 0x6a, 0x21, 0x01, + 0x20, 0x02, 0x41, 0x04, 0x6a, 0x22, 0x02, 0x28, 0x02, 0x00, 0x22, 0x03, + 0x41, 0x7f, 0x73, 0x20, 0x03, 0x41, 0xff, 0xfd, 0xfb, 0x77, 0x6a, 0x71, + 0x41, 0x80, 0x81, 0x82, 0x84, 0x78, 0x71, 0x45, 0x0d, 0x00, 0x0b, 0x03, + 0x40, 0x20, 0x01, 0x41, 0x01, 0x6a, 0x21, 0x01, 0x20, 0x02, 0x2d, 0x00, + 0x00, 0x21, 0x03, 0x20, 0x02, 0x41, 0x01, 0x6a, 0x21, 0x02, 0x20, 0x03, + 0x0d, 0x00, 0x0b, 0x0b, 0x20, 0x01, 0x20, 0x00, 0x6b, 0x0b, 0x27, 0x00, + 0x10, 0xca, 0x80, 0x80, 0x80, 0x00, 0x02, 0x40, 0x20, 0x00, 0x10, 0x99, + 0x80, 0x80, 0x80, 0x00, 0x22, 0x00, 0x0d, 0x00, 0x41, 0x00, 0x0f, 0x0b, + 0x41, 0x00, 0x20, 0x00, 0x36, 0x02, 0xb4, 0x9e, 0x80, 0x80, 0x00, 0x41, + 0x7f, 0x0b, 0x0d, 0x00, 0x20, 0x00, 0x28, 0x02, 0x38, 0x10, 0xab, 0x80, + 0x80, 0x80, 0x00, 0x0b, 0x71, 0x01, 0x02, 0x7f, 0x23, 0x80, 0x80, 0x80, + 0x80, 0x00, 0x41, 0x10, 0x6b, 0x22, 0x03, 0x24, 0x80, 0x80, 0x80, 0x80, + 0x00, 0x41, 0x7f, 0x21, 0x04, 0x02, 0x40, 0x02, 0x40, 0x20, 0x02, 0x41, + 0x7f, 0x4a, 0x0d, 0x00, 0x41, 0x00, 0x41, 0x1c, 0x36, 0x02, 0xb4, 0x9e, + 0x80, 0x80, 0x00, 0x0c, 0x01, 0x0b, 0x02, 0x40, 0x20, 0x00, 0x20, 0x01, + 0x20, 0x02, 0x20, 0x03, 0x41, 0x0c, 0x6a, 0x10, 0xa0, 0x80, 0x80, 0x80, + 0x00, 0x22, 0x02, 0x45, 0x0d, 0x00, 0x41, 0x00, 0x20, 0x02, 0x36, 0x02, + 0xb4, 0x9e, 0x80, 0x80, 0x00, 0x41, 0x7f, 0x21, 0x04, 0x0c, 0x01, 0x0b, + 0x20, 0x03, 0x28, 0x02, 0x0c, 0x21, 0x04, 0x0b, 0x20, 0x03, 0x41, 0x10, + 0x6a, 0x24, 0x80, 0x80, 0x80, 0x80, 0x00, 0x20, 0x04, 0x0b, 0xbb, 0x02, + 0x01, 0x07, 0x7f, 0x23, 0x80, 0x80, 0x80, 0x80, 0x00, 0x41, 0x10, 0x6b, + 0x22, 0x03, 0x24, 0x80, 0x80, 0x80, 0x80, 0x00, 0x20, 0x03, 0x20, 0x02, + 0x36, 0x02, 0x0c, 0x20, 0x03, 0x20, 0x01, 0x36, 0x02, 0x08, 0x20, 0x03, + 0x20, 0x00, 0x28, 0x02, 0x18, 0x22, 0x01, 0x36, 0x02, 0x00, 0x20, 0x03, + 0x20, 0x00, 0x28, 0x02, 0x14, 0x20, 0x01, 0x6b, 0x22, 0x04, 0x36, 0x02, + 0x04, 0x41, 0x02, 0x21, 0x05, 0x02, 0x40, 0x02, 0x40, 0x20, 0x00, 0x28, + 0x02, 0x38, 0x20, 0x03, 0x41, 0x02, 0x10, 0xad, 0x80, 0x80, 0x80, 0x00, + 0x22, 0x01, 0x20, 0x04, 0x20, 0x02, 0x6a, 0x22, 0x06, 0x46, 0x0d, 0x00, + 0x20, 0x03, 0x21, 0x04, 0x03, 0x40, 0x02, 0x40, 0x20, 0x01, 0x41, 0x7f, + 0x4a, 0x0d, 0x00, 0x41, 0x00, 0x21, 0x01, 0x20, 0x00, 0x41, 0x00, 0x36, + 0x02, 0x18, 0x20, 0x00, 0x42, 0x00, 0x37, 0x03, 0x10, 0x20, 0x00, 0x20, + 0x00, 0x28, 0x02, 0x00, 0x41, 0x20, 0x72, 0x36, 0x02, 0x00, 0x20, 0x05, + 0x41, 0x02, 0x46, 0x0d, 0x03, 0x20, 0x02, 0x20, 0x04, 0x28, 0x02, 0x04, + 0x6b, 0x21, 0x01, 0x0c, 0x03, 0x0b, 0x20, 0x04, 0x20, 0x01, 0x20, 0x04, + 0x28, 0x02, 0x04, 0x22, 0x07, 0x4b, 0x22, 0x08, 0x41, 0x03, 0x74, 0x6a, + 0x22, 0x09, 0x20, 0x09, 0x28, 0x02, 0x00, 0x20, 0x01, 0x20, 0x07, 0x41, + 0x00, 0x20, 0x08, 0x1b, 0x6b, 0x22, 0x07, 0x6a, 0x36, 0x02, 0x00, 0x20, + 0x04, 0x41, 0x0c, 0x41, 0x04, 0x20, 0x08, 0x1b, 0x6a, 0x22, 0x04, 0x20, + 0x04, 0x28, 0x02, 0x00, 0x20, 0x07, 0x6b, 0x36, 0x02, 0x00, 0x20, 0x09, + 0x21, 0x04, 0x20, 0x06, 0x20, 0x01, 0x6b, 0x22, 0x06, 0x20, 0x00, 0x28, + 0x02, 0x38, 0x20, 0x09, 0x20, 0x05, 0x20, 0x08, 0x6b, 0x22, 0x05, 0x10, + 0xad, 0x80, 0x80, 0x80, 0x00, 0x22, 0x01, 0x47, 0x0d, 0x00, 0x0b, 0x0b, + 0x20, 0x00, 0x20, 0x00, 0x28, 0x02, 0x28, 0x22, 0x01, 0x36, 0x02, 0x18, + 0x20, 0x00, 0x20, 0x01, 0x36, 0x02, 0x14, 0x20, 0x00, 0x20, 0x01, 0x20, + 0x00, 0x28, 0x02, 0x2c, 0x6a, 0x36, 0x02, 0x10, 0x20, 0x02, 0x21, 0x01, + 0x0b, 0x20, 0x03, 0x41, 0x10, 0x6a, 0x24, 0x80, 0x80, 0x80, 0x80, 0x00, + 0x20, 0x01, 0x0b, 0x66, 0x01, 0x02, 0x7f, 0x23, 0x80, 0x80, 0x80, 0x80, + 0x00, 0x41, 0x20, 0x6b, 0x22, 0x01, 0x24, 0x80, 0x80, 0x80, 0x80, 0x00, + 0x02, 0x40, 0x02, 0x40, 0x20, 0x00, 0x20, 0x01, 0x41, 0x08, 0x6a, 0x10, + 0x9a, 0x80, 0x80, 0x80, 0x00, 0x22, 0x00, 0x0d, 0x00, 0x41, 0x3b, 0x21, + 0x00, 0x20, 0x01, 0x2d, 0x00, 0x08, 0x41, 0x02, 0x47, 0x0d, 0x00, 0x20, + 0x01, 0x2d, 0x00, 0x10, 0x41, 0x24, 0x71, 0x0d, 0x00, 0x41, 0x01, 0x21, + 0x02, 0x0c, 0x01, 0x0b, 0x41, 0x00, 0x21, 0x02, 0x41, 0x00, 0x20, 0x00, + 0x36, 0x02, 0xb4, 0x9e, 0x80, 0x80, 0x00, 0x0b, 0x20, 0x01, 0x41, 0x20, + 0x6a, 0x24, 0x80, 0x80, 0x80, 0x80, 0x00, 0x20, 0x02, 0x0b, 0x3b, 0x00, + 0x20, 0x00, 0x41, 0x81, 0x80, 0x80, 0x80, 0x00, 0x36, 0x02, 0x20, 0x02, + 0x40, 0x20, 0x00, 0x2d, 0x00, 0x00, 0x41, 0xc0, 0x00, 0x71, 0x0d, 0x00, + 0x20, 0x00, 0x28, 0x02, 0x38, 0x10, 0xaf, 0x80, 0x80, 0x80, 0x00, 0x0d, + 0x00, 0x20, 0x00, 0x41, 0x7f, 0x36, 0x02, 0x40, 0x0b, 0x20, 0x00, 0x20, + 0x01, 0x20, 0x02, 0x10, 0xae, 0x80, 0x80, 0x80, 0x00, 0x0b, 0x64, 0x01, + 0x01, 0x7f, 0x23, 0x80, 0x80, 0x80, 0x80, 0x00, 0x41, 0x10, 0x6b, 0x22, + 0x03, 0x24, 0x80, 0x80, 0x80, 0x80, 0x00, 0x02, 0x40, 0x02, 0x40, 0x20, + 0x00, 0x20, 0x01, 0x20, 0x02, 0x41, 0xff, 0x01, 0x71, 0x20, 0x03, 0x41, + 0x08, 0x6a, 0x10, 0x9f, 0x80, 0x80, 0x80, 0x00, 0x22, 0x02, 0x45, 0x0d, + 0x00, 0x41, 0x00, 0x41, 0xc6, 0x00, 0x20, 0x02, 0x20, 0x02, 0x41, 0xcc, + 0x00, 0x46, 0x1b, 0x36, 0x02, 0xb4, 0x9e, 0x80, 0x80, 0x00, 0x42, 0x7f, + 0x21, 0x01, 0x0c, 0x01, 0x0b, 0x20, 0x03, 0x29, 0x03, 0x08, 0x21, 0x01, + 0x0b, 0x20, 0x03, 0x41, 0x10, 0x6a, 0x24, 0x80, 0x80, 0x80, 0x80, 0x00, + 0x20, 0x01, 0x0b, 0x11, 0x00, 0x20, 0x00, 0x28, 0x02, 0x38, 0x20, 0x01, + 0x20, 0x02, 0x10, 0xb1, 0x80, 0x80, 0x80, 0x00, 0x0b, 0x08, 0x00, 0x41, + 0xb8, 0xaa, 0x80, 0x80, 0x00, 0x0b, 0x02, 0x00, 0x0b, 0x83, 0x03, 0x01, + 0x03, 0x7f, 0x02, 0x40, 0x10, 0xb3, 0x80, 0x80, 0x80, 0x00, 0x28, 0x02, + 0x00, 0x22, 0x00, 0x45, 0x0d, 0x00, 0x03, 0x40, 0x02, 0x40, 0x20, 0x00, + 0x28, 0x02, 0x14, 0x20, 0x00, 0x28, 0x02, 0x18, 0x46, 0x0d, 0x00, 0x20, + 0x00, 0x41, 0x00, 0x41, 0x00, 0x20, 0x00, 0x28, 0x02, 0x20, 0x11, 0x80, + 0x80, 0x80, 0x80, 0x00, 0x00, 0x1a, 0x0b, 0x02, 0x40, 0x20, 0x00, 0x28, + 0x02, 0x04, 0x22, 0x01, 0x20, 0x00, 0x28, 0x02, 0x08, 0x22, 0x02, 0x46, + 0x0d, 0x00, 0x20, 0x00, 0x20, 0x01, 0x20, 0x02, 0x6b, 0xac, 0x41, 0x01, + 0x20, 0x00, 0x28, 0x02, 0x24, 0x11, 0x81, 0x80, 0x80, 0x80, 0x00, 0x00, + 0x1a, 0x0b, 0x20, 0x00, 0x28, 0x02, 0x34, 0x22, 0x00, 0x0d, 0x00, 0x0b, + 0x0b, 0x02, 0x40, 0x41, 0x00, 0x28, 0x02, 0xbc, 0xaa, 0x80, 0x80, 0x00, + 0x22, 0x00, 0x45, 0x0d, 0x00, 0x02, 0x40, 0x20, 0x00, 0x28, 0x02, 0x14, + 0x20, 0x00, 0x28, 0x02, 0x18, 0x46, 0x0d, 0x00, 0x20, 0x00, 0x41, 0x00, + 0x41, 0x00, 0x20, 0x00, 0x28, 0x02, 0x20, 0x11, 0x80, 0x80, 0x80, 0x80, + 0x00, 0x00, 0x1a, 0x0b, 0x20, 0x00, 0x28, 0x02, 0x04, 0x22, 0x01, 0x20, + 0x00, 0x28, 0x02, 0x08, 0x22, 0x02, 0x46, 0x0d, 0x00, 0x20, 0x00, 0x20, + 0x01, 0x20, 0x02, 0x6b, 0xac, 0x41, 0x01, 0x20, 0x00, 0x28, 0x02, 0x24, + 0x11, 0x81, 0x80, 0x80, 0x80, 0x00, 0x00, 0x1a, 0x0b, 0x02, 0x40, 0x41, + 0x00, 0x28, 0x02, 0xb0, 0x9d, 0x80, 0x80, 0x00, 0x22, 0x00, 0x45, 0x0d, + 0x00, 0x02, 0x40, 0x20, 0x00, 0x28, 0x02, 0x14, 0x20, 0x00, 0x28, 0x02, + 0x18, 0x46, 0x0d, 0x00, 0x20, 0x00, 0x41, 0x00, 0x41, 0x00, 0x20, 0x00, + 0x28, 0x02, 0x20, 0x11, 0x80, 0x80, 0x80, 0x80, 0x00, 0x00, 0x1a, 0x0b, + 0x20, 0x00, 0x28, 0x02, 0x04, 0x22, 0x01, 0x20, 0x00, 0x28, 0x02, 0x08, + 0x22, 0x02, 0x46, 0x0d, 0x00, 0x20, 0x00, 0x20, 0x01, 0x20, 0x02, 0x6b, + 0xac, 0x41, 0x01, 0x20, 0x00, 0x28, 0x02, 0x24, 0x11, 0x81, 0x80, 0x80, + 0x80, 0x00, 0x00, 0x1a, 0x0b, 0x02, 0x40, 0x41, 0x00, 0x28, 0x02, 0xa8, + 0x9e, 0x80, 0x80, 0x00, 0x22, 0x00, 0x45, 0x0d, 0x00, 0x02, 0x40, 0x20, + 0x00, 0x28, 0x02, 0x14, 0x20, 0x00, 0x28, 0x02, 0x18, 0x46, 0x0d, 0x00, + 0x20, 0x00, 0x41, 0x00, 0x41, 0x00, 0x20, 0x00, 0x28, 0x02, 0x20, 0x11, + 0x80, 0x80, 0x80, 0x80, 0x00, 0x00, 0x1a, 0x0b, 0x20, 0x00, 0x28, 0x02, + 0x04, 0x22, 0x01, 0x20, 0x00, 0x28, 0x02, 0x08, 0x22, 0x02, 0x46, 0x0d, + 0x00, 0x20, 0x00, 0x20, 0x01, 0x20, 0x02, 0x6b, 0xac, 0x41, 0x01, 0x20, + 0x00, 0x28, 0x02, 0x24, 0x11, 0x81, 0x80, 0x80, 0x80, 0x00, 0x00, 0x1a, + 0x0b, 0x0b, 0x5c, 0x01, 0x01, 0x7f, 0x20, 0x00, 0x20, 0x00, 0x28, 0x02, + 0x3c, 0x22, 0x01, 0x41, 0x7f, 0x6a, 0x20, 0x01, 0x72, 0x36, 0x02, 0x3c, + 0x02, 0x40, 0x20, 0x00, 0x28, 0x02, 0x00, 0x22, 0x01, 0x41, 0x08, 0x71, + 0x45, 0x0d, 0x00, 0x20, 0x00, 0x20, 0x01, 0x41, 0x20, 0x72, 0x36, 0x02, + 0x00, 0x41, 0x7f, 0x0f, 0x0b, 0x20, 0x00, 0x42, 0x00, 0x37, 0x02, 0x04, + 0x20, 0x00, 0x20, 0x00, 0x28, 0x02, 0x28, 0x22, 0x01, 0x36, 0x02, 0x18, + 0x20, 0x00, 0x20, 0x01, 0x36, 0x02, 0x14, 0x20, 0x00, 0x20, 0x01, 0x20, + 0x00, 0x28, 0x02, 0x2c, 0x6a, 0x36, 0x02, 0x10, 0x41, 0x00, 0x0b, 0xe8, + 0x01, 0x01, 0x05, 0x7f, 0x02, 0x40, 0x02, 0x40, 0x20, 0x02, 0x28, 0x02, + 0x10, 0x22, 0x03, 0x0d, 0x00, 0x41, 0x00, 0x21, 0x04, 0x20, 0x02, 0x10, + 0xb6, 0x80, 0x80, 0x80, 0x00, 0x0d, 0x01, 0x20, 0x02, 0x28, 0x02, 0x10, + 0x21, 0x03, 0x0b, 0x02, 0x40, 0x20, 0x03, 0x20, 0x02, 0x28, 0x02, 0x14, + 0x22, 0x05, 0x6b, 0x20, 0x01, 0x4f, 0x0d, 0x00, 0x20, 0x02, 0x20, 0x00, + 0x20, 0x01, 0x20, 0x02, 0x28, 0x02, 0x20, 0x11, 0x80, 0x80, 0x80, 0x80, + 0x00, 0x00, 0x0f, 0x0b, 0x41, 0x00, 0x21, 0x06, 0x02, 0x40, 0x20, 0x02, + 0x28, 0x02, 0x40, 0x41, 0x00, 0x48, 0x0d, 0x00, 0x41, 0x00, 0x21, 0x06, + 0x20, 0x00, 0x21, 0x04, 0x41, 0x00, 0x21, 0x03, 0x03, 0x40, 0x20, 0x01, + 0x20, 0x03, 0x46, 0x0d, 0x01, 0x20, 0x03, 0x41, 0x01, 0x6a, 0x21, 0x03, + 0x20, 0x04, 0x41, 0x7f, 0x6a, 0x22, 0x04, 0x20, 0x01, 0x6a, 0x22, 0x07, + 0x2d, 0x00, 0x00, 0x41, 0x0a, 0x47, 0x0d, 0x00, 0x0b, 0x20, 0x02, 0x20, + 0x00, 0x20, 0x01, 0x20, 0x03, 0x6b, 0x41, 0x01, 0x6a, 0x22, 0x06, 0x20, + 0x02, 0x28, 0x02, 0x20, 0x11, 0x80, 0x80, 0x80, 0x80, 0x00, 0x00, 0x22, + 0x04, 0x20, 0x06, 0x49, 0x0d, 0x01, 0x20, 0x03, 0x41, 0x7f, 0x6a, 0x21, + 0x01, 0x20, 0x07, 0x41, 0x01, 0x6a, 0x21, 0x00, 0x20, 0x02, 0x28, 0x02, + 0x14, 0x21, 0x05, 0x0b, 0x20, 0x05, 0x20, 0x00, 0x20, 0x01, 0x10, 0xa8, + 0x80, 0x80, 0x80, 0x00, 0x1a, 0x20, 0x02, 0x20, 0x02, 0x28, 0x02, 0x14, + 0x20, 0x01, 0x6a, 0x36, 0x02, 0x14, 0x20, 0x06, 0x20, 0x01, 0x6a, 0x21, + 0x04, 0x0b, 0x20, 0x04, 0x0b, 0x95, 0x02, 0x01, 0x06, 0x7f, 0x20, 0x02, + 0x20, 0x01, 0x6c, 0x21, 0x04, 0x02, 0x40, 0x02, 0x40, 0x20, 0x03, 0x28, + 0x02, 0x10, 0x22, 0x05, 0x0d, 0x00, 0x41, 0x00, 0x21, 0x06, 0x20, 0x03, + 0x10, 0xb6, 0x80, 0x80, 0x80, 0x00, 0x0d, 0x01, 0x20, 0x03, 0x28, 0x02, + 0x10, 0x21, 0x05, 0x0b, 0x02, 0x40, 0x20, 0x05, 0x20, 0x03, 0x28, 0x02, + 0x14, 0x22, 0x07, 0x6b, 0x20, 0x04, 0x4f, 0x0d, 0x00, 0x20, 0x03, 0x20, + 0x00, 0x20, 0x04, 0x20, 0x03, 0x28, 0x02, 0x20, 0x11, 0x80, 0x80, 0x80, + 0x80, 0x00, 0x00, 0x21, 0x06, 0x0c, 0x01, 0x0b, 0x41, 0x00, 0x21, 0x08, + 0x02, 0x40, 0x02, 0x40, 0x20, 0x03, 0x28, 0x02, 0x40, 0x41, 0x00, 0x4e, + 0x0d, 0x00, 0x20, 0x04, 0x21, 0x05, 0x0c, 0x01, 0x0b, 0x20, 0x00, 0x20, + 0x04, 0x6a, 0x21, 0x06, 0x41, 0x00, 0x21, 0x08, 0x41, 0x00, 0x21, 0x05, + 0x03, 0x40, 0x02, 0x40, 0x20, 0x04, 0x20, 0x05, 0x6a, 0x0d, 0x00, 0x20, + 0x04, 0x21, 0x05, 0x0c, 0x02, 0x0b, 0x20, 0x05, 0x41, 0x7f, 0x6a, 0x22, + 0x05, 0x20, 0x06, 0x6a, 0x22, 0x09, 0x2d, 0x00, 0x00, 0x41, 0x0a, 0x47, + 0x0d, 0x00, 0x0b, 0x20, 0x03, 0x20, 0x00, 0x20, 0x04, 0x20, 0x05, 0x6a, + 0x41, 0x01, 0x6a, 0x22, 0x08, 0x20, 0x03, 0x28, 0x02, 0x20, 0x11, 0x80, + 0x80, 0x80, 0x80, 0x00, 0x00, 0x22, 0x06, 0x20, 0x08, 0x49, 0x0d, 0x01, + 0x20, 0x05, 0x41, 0x7f, 0x73, 0x21, 0x05, 0x20, 0x09, 0x41, 0x01, 0x6a, + 0x21, 0x00, 0x20, 0x03, 0x28, 0x02, 0x14, 0x21, 0x07, 0x0b, 0x20, 0x07, + 0x20, 0x00, 0x20, 0x05, 0x10, 0xa8, 0x80, 0x80, 0x80, 0x00, 0x1a, 0x20, + 0x03, 0x20, 0x03, 0x28, 0x02, 0x14, 0x20, 0x05, 0x6a, 0x36, 0x02, 0x14, + 0x20, 0x08, 0x20, 0x05, 0x6a, 0x21, 0x06, 0x0b, 0x02, 0x40, 0x20, 0x06, + 0x20, 0x04, 0x47, 0x0d, 0x00, 0x20, 0x02, 0x41, 0x00, 0x20, 0x01, 0x1b, + 0x0f, 0x0b, 0x20, 0x06, 0x20, 0x01, 0x6e, 0x0b, 0x04, 0x00, 0x20, 0x00, + 0x0b, 0x0c, 0x00, 0x20, 0x00, 0x20, 0x01, 0x10, 0xb9, 0x80, 0x80, 0x80, + 0x00, 0x0b, 0x55, 0x01, 0x01, 0x7f, 0x02, 0x40, 0x41, 0x00, 0x28, 0x02, + 0xd8, 0xaa, 0x80, 0x80, 0x00, 0x22, 0x01, 0x0d, 0x00, 0x41, 0xc0, 0xaa, + 0x80, 0x80, 0x00, 0x21, 0x01, 0x41, 0x00, 0x41, 0xc0, 0xaa, 0x80, 0x80, + 0x00, 0x36, 0x02, 0xd8, 0xaa, 0x80, 0x80, 0x00, 0x0b, 0x41, 0x00, 0x20, + 0x00, 0x20, 0x00, 0x41, 0xcc, 0x00, 0x4b, 0x1b, 0x41, 0x01, 0x74, 0x41, + 0x90, 0x94, 0x80, 0x80, 0x00, 0x6a, 0x2f, 0x01, 0x00, 0x41, 0x80, 0x88, + 0x80, 0x80, 0x00, 0x6a, 0x20, 0x01, 0x28, 0x02, 0x14, 0x10, 0xba, 0x80, + 0x80, 0x80, 0x00, 0x0b, 0xf2, 0x02, 0x01, 0x03, 0x7f, 0x20, 0x02, 0x41, + 0x00, 0x47, 0x21, 0x03, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, + 0x20, 0x00, 0x41, 0x03, 0x71, 0x45, 0x0d, 0x00, 0x20, 0x02, 0x45, 0x0d, + 0x00, 0x02, 0x40, 0x20, 0x00, 0x2d, 0x00, 0x00, 0x20, 0x01, 0x41, 0xff, + 0x01, 0x71, 0x47, 0x0d, 0x00, 0x20, 0x00, 0x21, 0x04, 0x20, 0x02, 0x21, + 0x05, 0x0c, 0x03, 0x0b, 0x20, 0x02, 0x41, 0x7f, 0x6a, 0x22, 0x05, 0x41, + 0x00, 0x47, 0x21, 0x03, 0x20, 0x00, 0x41, 0x01, 0x6a, 0x22, 0x04, 0x41, + 0x03, 0x71, 0x45, 0x0d, 0x01, 0x20, 0x05, 0x45, 0x0d, 0x01, 0x20, 0x04, + 0x2d, 0x00, 0x00, 0x20, 0x01, 0x41, 0xff, 0x01, 0x71, 0x46, 0x0d, 0x02, + 0x20, 0x02, 0x41, 0x7e, 0x6a, 0x22, 0x05, 0x41, 0x00, 0x47, 0x21, 0x03, + 0x20, 0x00, 0x41, 0x02, 0x6a, 0x22, 0x04, 0x41, 0x03, 0x71, 0x45, 0x0d, + 0x01, 0x20, 0x05, 0x45, 0x0d, 0x01, 0x20, 0x04, 0x2d, 0x00, 0x00, 0x20, + 0x01, 0x41, 0xff, 0x01, 0x71, 0x46, 0x0d, 0x02, 0x20, 0x02, 0x41, 0x7d, + 0x6a, 0x22, 0x05, 0x41, 0x00, 0x47, 0x21, 0x03, 0x20, 0x00, 0x41, 0x03, + 0x6a, 0x22, 0x04, 0x41, 0x03, 0x71, 0x45, 0x0d, 0x01, 0x20, 0x05, 0x45, + 0x0d, 0x01, 0x20, 0x04, 0x2d, 0x00, 0x00, 0x20, 0x01, 0x41, 0xff, 0x01, + 0x71, 0x46, 0x0d, 0x02, 0x20, 0x00, 0x41, 0x04, 0x6a, 0x21, 0x04, 0x20, + 0x02, 0x41, 0x7c, 0x6a, 0x22, 0x05, 0x41, 0x00, 0x47, 0x21, 0x03, 0x0c, + 0x01, 0x0b, 0x20, 0x02, 0x21, 0x05, 0x20, 0x00, 0x21, 0x04, 0x0b, 0x20, + 0x03, 0x45, 0x0d, 0x01, 0x02, 0x40, 0x20, 0x04, 0x2d, 0x00, 0x00, 0x20, + 0x01, 0x41, 0xff, 0x01, 0x71, 0x46, 0x0d, 0x00, 0x20, 0x05, 0x41, 0x04, + 0x49, 0x0d, 0x00, 0x20, 0x01, 0x41, 0xff, 0x01, 0x71, 0x41, 0x81, 0x82, + 0x84, 0x08, 0x6c, 0x21, 0x00, 0x03, 0x40, 0x20, 0x04, 0x28, 0x02, 0x00, + 0x20, 0x00, 0x73, 0x22, 0x02, 0x41, 0x7f, 0x73, 0x20, 0x02, 0x41, 0xff, + 0xfd, 0xfb, 0x77, 0x6a, 0x71, 0x41, 0x80, 0x81, 0x82, 0x84, 0x78, 0x71, + 0x0d, 0x02, 0x20, 0x04, 0x41, 0x04, 0x6a, 0x21, 0x04, 0x20, 0x05, 0x41, + 0x7c, 0x6a, 0x22, 0x05, 0x41, 0x03, 0x4b, 0x0d, 0x00, 0x0b, 0x0b, 0x20, + 0x05, 0x45, 0x0d, 0x01, 0x0b, 0x20, 0x01, 0x41, 0xff, 0x01, 0x71, 0x21, + 0x02, 0x03, 0x40, 0x02, 0x40, 0x20, 0x04, 0x2d, 0x00, 0x00, 0x20, 0x02, + 0x47, 0x0d, 0x00, 0x20, 0x04, 0x0f, 0x0b, 0x20, 0x04, 0x41, 0x01, 0x6a, + 0x21, 0x04, 0x20, 0x05, 0x41, 0x7f, 0x6a, 0x22, 0x05, 0x0d, 0x00, 0x0b, + 0x0b, 0x41, 0x00, 0x0b, 0x1a, 0x01, 0x01, 0x7f, 0x20, 0x00, 0x41, 0x00, + 0x20, 0x01, 0x10, 0xbc, 0x80, 0x80, 0x80, 0x00, 0x22, 0x02, 0x20, 0x00, + 0x6b, 0x20, 0x01, 0x20, 0x02, 0x1b, 0x0b, 0xb6, 0x02, 0x01, 0x01, 0x7f, + 0x41, 0x01, 0x21, 0x03, 0x02, 0x40, 0x20, 0x00, 0x45, 0x0d, 0x00, 0x02, + 0x40, 0x20, 0x01, 0x41, 0xff, 0x00, 0x4b, 0x0d, 0x00, 0x20, 0x00, 0x20, + 0x01, 0x3a, 0x00, 0x00, 0x41, 0x01, 0x0f, 0x0b, 0x02, 0x40, 0x02, 0x40, + 0x41, 0x00, 0x28, 0x02, 0xc0, 0xaa, 0x80, 0x80, 0x00, 0x0d, 0x00, 0x02, + 0x40, 0x20, 0x01, 0x41, 0x80, 0x7f, 0x71, 0x41, 0x80, 0xbf, 0x03, 0x46, + 0x0d, 0x00, 0x41, 0x00, 0x41, 0x19, 0x36, 0x02, 0xb4, 0x9e, 0x80, 0x80, + 0x00, 0x0c, 0x02, 0x0b, 0x20, 0x00, 0x20, 0x01, 0x3a, 0x00, 0x00, 0x41, + 0x01, 0x0f, 0x0b, 0x02, 0x40, 0x20, 0x01, 0x41, 0xff, 0x0f, 0x4b, 0x0d, + 0x00, 0x20, 0x00, 0x20, 0x01, 0x41, 0x3f, 0x71, 0x41, 0x80, 0x01, 0x72, + 0x3a, 0x00, 0x01, 0x20, 0x00, 0x20, 0x01, 0x41, 0x06, 0x76, 0x41, 0xc0, + 0x01, 0x72, 0x3a, 0x00, 0x00, 0x41, 0x02, 0x0f, 0x0b, 0x02, 0x40, 0x02, + 0x40, 0x20, 0x01, 0x41, 0x80, 0xb0, 0x03, 0x49, 0x0d, 0x00, 0x20, 0x01, + 0x41, 0x80, 0x40, 0x71, 0x41, 0x80, 0xc0, 0x03, 0x47, 0x0d, 0x01, 0x0b, + 0x20, 0x00, 0x20, 0x01, 0x41, 0x3f, 0x71, 0x41, 0x80, 0x01, 0x72, 0x3a, + 0x00, 0x02, 0x20, 0x00, 0x20, 0x01, 0x41, 0x0c, 0x76, 0x41, 0xe0, 0x01, + 0x72, 0x3a, 0x00, 0x00, 0x20, 0x00, 0x20, 0x01, 0x41, 0x06, 0x76, 0x41, + 0x3f, 0x71, 0x41, 0x80, 0x01, 0x72, 0x3a, 0x00, 0x01, 0x41, 0x03, 0x0f, + 0x0b, 0x02, 0x40, 0x20, 0x01, 0x41, 0x80, 0x80, 0x7c, 0x6a, 0x41, 0xff, + 0xff, 0x3f, 0x4b, 0x0d, 0x00, 0x20, 0x00, 0x20, 0x01, 0x41, 0x3f, 0x71, + 0x41, 0x80, 0x01, 0x72, 0x3a, 0x00, 0x03, 0x20, 0x00, 0x20, 0x01, 0x41, + 0x12, 0x76, 0x41, 0xf0, 0x01, 0x72, 0x3a, 0x00, 0x00, 0x20, 0x00, 0x20, + 0x01, 0x41, 0x06, 0x76, 0x41, 0x3f, 0x71, 0x41, 0x80, 0x01, 0x72, 0x3a, + 0x00, 0x02, 0x20, 0x00, 0x20, 0x01, 0x41, 0x0c, 0x76, 0x41, 0x3f, 0x71, + 0x41, 0x80, 0x01, 0x72, 0x3a, 0x00, 0x01, 0x41, 0x04, 0x0f, 0x0b, 0x41, + 0x00, 0x41, 0x19, 0x36, 0x02, 0xb4, 0x9e, 0x80, 0x80, 0x00, 0x0b, 0x41, + 0x7f, 0x21, 0x03, 0x0b, 0x20, 0x03, 0x0b, 0x18, 0x00, 0x02, 0x40, 0x20, + 0x00, 0x0d, 0x00, 0x41, 0x00, 0x0f, 0x0b, 0x20, 0x00, 0x20, 0x01, 0x41, + 0x00, 0x10, 0xbe, 0x80, 0x80, 0x80, 0x00, 0x0b, 0x8f, 0x01, 0x02, 0x01, + 0x7e, 0x01, 0x7f, 0x02, 0x40, 0x20, 0x00, 0xbd, 0x22, 0x02, 0x42, 0x34, + 0x88, 0xa7, 0x41, 0xff, 0x0f, 0x71, 0x22, 0x03, 0x41, 0xff, 0x0f, 0x46, + 0x0d, 0x00, 0x02, 0x40, 0x20, 0x03, 0x0d, 0x00, 0x02, 0x40, 0x20, 0x00, + 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x62, 0x0d, 0x00, + 0x20, 0x01, 0x41, 0x00, 0x36, 0x02, 0x00, 0x20, 0x00, 0x0f, 0x0b, 0x20, + 0x00, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x43, 0xa2, 0x20, + 0x01, 0x10, 0xc0, 0x80, 0x80, 0x80, 0x00, 0x21, 0x00, 0x20, 0x01, 0x20, + 0x01, 0x28, 0x02, 0x00, 0x41, 0x40, 0x6a, 0x36, 0x02, 0x00, 0x20, 0x00, + 0x0f, 0x0b, 0x20, 0x01, 0x20, 0x03, 0x41, 0x82, 0x78, 0x6a, 0x36, 0x02, + 0x00, 0x20, 0x02, 0x42, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x87, + 0x80, 0x7f, 0x83, 0x42, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0xf0, + 0x3f, 0x84, 0xbf, 0x21, 0x00, 0x0b, 0x20, 0x00, 0x0b, 0x24, 0x01, 0x01, + 0x7f, 0x20, 0x00, 0x10, 0xaa, 0x80, 0x80, 0x80, 0x00, 0x21, 0x02, 0x41, + 0x7f, 0x41, 0x00, 0x20, 0x02, 0x20, 0x00, 0x41, 0x01, 0x20, 0x02, 0x20, + 0x01, 0x10, 0xb8, 0x80, 0x80, 0x80, 0x00, 0x47, 0x1b, 0x0b, 0x8c, 0x03, + 0x01, 0x03, 0x7f, 0x23, 0x80, 0x80, 0x80, 0x80, 0x00, 0x41, 0xd0, 0x01, + 0x6b, 0x22, 0x03, 0x24, 0x80, 0x80, 0x80, 0x80, 0x00, 0x20, 0x03, 0x20, + 0x02, 0x36, 0x02, 0xcc, 0x01, 0x20, 0x03, 0x41, 0xa0, 0x01, 0x6a, 0x41, + 0x20, 0x6a, 0x42, 0x00, 0x37, 0x03, 0x00, 0x20, 0x03, 0x41, 0xb8, 0x01, + 0x6a, 0x42, 0x00, 0x37, 0x03, 0x00, 0x20, 0x03, 0x41, 0xb0, 0x01, 0x6a, + 0x42, 0x00, 0x37, 0x03, 0x00, 0x20, 0x03, 0x42, 0x00, 0x37, 0x03, 0xa8, + 0x01, 0x20, 0x03, 0x42, 0x00, 0x37, 0x03, 0xa0, 0x01, 0x20, 0x03, 0x20, + 0x02, 0x36, 0x02, 0xc8, 0x01, 0x02, 0x40, 0x02, 0x40, 0x41, 0x00, 0x20, + 0x01, 0x20, 0x03, 0x41, 0xc8, 0x01, 0x6a, 0x20, 0x03, 0x41, 0xd0, 0x00, + 0x6a, 0x20, 0x03, 0x41, 0xa0, 0x01, 0x6a, 0x10, 0xc3, 0x80, 0x80, 0x80, + 0x00, 0x41, 0x00, 0x4e, 0x0d, 0x00, 0x41, 0x7f, 0x21, 0x00, 0x0c, 0x01, + 0x0b, 0x20, 0x00, 0x28, 0x02, 0x00, 0x21, 0x04, 0x02, 0x40, 0x20, 0x00, + 0x28, 0x02, 0x3c, 0x41, 0x00, 0x4a, 0x0d, 0x00, 0x20, 0x00, 0x20, 0x04, + 0x41, 0x5f, 0x71, 0x36, 0x02, 0x00, 0x0b, 0x02, 0x40, 0x02, 0x40, 0x02, + 0x40, 0x02, 0x40, 0x20, 0x00, 0x28, 0x02, 0x2c, 0x0d, 0x00, 0x20, 0x00, + 0x41, 0xd0, 0x00, 0x36, 0x02, 0x2c, 0x20, 0x00, 0x41, 0x00, 0x36, 0x02, + 0x18, 0x20, 0x00, 0x42, 0x00, 0x37, 0x03, 0x10, 0x20, 0x00, 0x28, 0x02, + 0x28, 0x21, 0x05, 0x20, 0x00, 0x20, 0x03, 0x36, 0x02, 0x28, 0x0c, 0x01, + 0x0b, 0x41, 0x00, 0x21, 0x05, 0x20, 0x00, 0x28, 0x02, 0x10, 0x0d, 0x01, + 0x0b, 0x41, 0x7f, 0x21, 0x02, 0x20, 0x00, 0x10, 0xb6, 0x80, 0x80, 0x80, + 0x00, 0x0d, 0x01, 0x0b, 0x20, 0x00, 0x20, 0x01, 0x20, 0x03, 0x41, 0xc8, + 0x01, 0x6a, 0x20, 0x03, 0x41, 0xd0, 0x00, 0x6a, 0x20, 0x03, 0x41, 0xa0, + 0x01, 0x6a, 0x10, 0xc3, 0x80, 0x80, 0x80, 0x00, 0x21, 0x02, 0x0b, 0x20, + 0x04, 0x41, 0x20, 0x71, 0x21, 0x01, 0x02, 0x40, 0x20, 0x05, 0x45, 0x0d, + 0x00, 0x20, 0x00, 0x41, 0x00, 0x41, 0x00, 0x20, 0x00, 0x28, 0x02, 0x20, + 0x11, 0x80, 0x80, 0x80, 0x80, 0x00, 0x00, 0x1a, 0x20, 0x00, 0x41, 0x00, + 0x36, 0x02, 0x2c, 0x20, 0x00, 0x20, 0x05, 0x36, 0x02, 0x28, 0x20, 0x00, + 0x41, 0x00, 0x36, 0x02, 0x18, 0x20, 0x00, 0x28, 0x02, 0x14, 0x21, 0x05, + 0x20, 0x00, 0x42, 0x00, 0x37, 0x03, 0x10, 0x20, 0x02, 0x41, 0x7f, 0x20, + 0x05, 0x1b, 0x21, 0x02, 0x0b, 0x20, 0x00, 0x20, 0x00, 0x28, 0x02, 0x00, + 0x22, 0x05, 0x20, 0x01, 0x72, 0x36, 0x02, 0x00, 0x41, 0x7f, 0x20, 0x02, + 0x20, 0x05, 0x41, 0x20, 0x71, 0x1b, 0x21, 0x00, 0x0b, 0x20, 0x03, 0x41, + 0xd0, 0x01, 0x6a, 0x24, 0x80, 0x80, 0x80, 0x80, 0x00, 0x20, 0x00, 0x0b, + 0xf5, 0x46, 0x05, 0x1a, 0x7f, 0x02, 0x7e, 0x01, 0x7c, 0x08, 0x7f, 0x01, + 0x7c, 0x23, 0x80, 0x80, 0x80, 0x80, 0x00, 0x41, 0xf0, 0x06, 0x6b, 0x22, + 0x05, 0x24, 0x80, 0x80, 0x80, 0x80, 0x00, 0x20, 0x05, 0x41, 0xc4, 0x00, + 0x6a, 0x41, 0x0c, 0x6a, 0x21, 0x06, 0x41, 0x00, 0x20, 0x05, 0x41, 0xf0, + 0x00, 0x6a, 0x6b, 0x21, 0x07, 0x20, 0x05, 0x41, 0xec, 0x60, 0x6a, 0x21, + 0x08, 0x20, 0x05, 0x41, 0x37, 0x6a, 0x21, 0x09, 0x20, 0x05, 0x41, 0xc4, + 0x00, 0x6a, 0x41, 0x0b, 0x6a, 0x21, 0x0a, 0x20, 0x05, 0x41, 0xd0, 0x00, + 0x6a, 0x41, 0x7f, 0x6a, 0x21, 0x0b, 0x20, 0x05, 0x41, 0xd0, 0x00, 0x6a, + 0x41, 0x08, 0x72, 0x21, 0x0c, 0x20, 0x05, 0x41, 0xd0, 0x00, 0x6a, 0x41, + 0x09, 0x72, 0x21, 0x0d, 0x20, 0x05, 0x41, 0xc4, 0x00, 0x6a, 0x41, 0x0a, + 0x6a, 0x21, 0x0e, 0x20, 0x05, 0x41, 0x38, 0x6a, 0x21, 0x0f, 0x41, 0x00, + 0x21, 0x10, 0x41, 0x00, 0x21, 0x11, 0x41, 0x00, 0x21, 0x12, 0x02, 0x40, + 0x02, 0x40, 0x02, 0x40, 0x03, 0x40, 0x20, 0x01, 0x21, 0x13, 0x20, 0x12, + 0x20, 0x11, 0x41, 0xff, 0xff, 0xff, 0xff, 0x07, 0x73, 0x4a, 0x0d, 0x01, + 0x20, 0x12, 0x20, 0x11, 0x6a, 0x21, 0x11, 0x02, 0x40, 0x02, 0x40, 0x02, + 0x40, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, 0x02, + 0x40, 0x20, 0x13, 0x2d, 0x00, 0x00, 0x22, 0x12, 0x45, 0x0d, 0x00, 0x20, + 0x13, 0x21, 0x01, 0x03, 0x40, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, 0x20, + 0x12, 0x41, 0xff, 0x01, 0x71, 0x22, 0x12, 0x45, 0x0d, 0x00, 0x20, 0x12, + 0x41, 0x25, 0x47, 0x0d, 0x02, 0x20, 0x01, 0x21, 0x14, 0x20, 0x01, 0x21, + 0x12, 0x03, 0x40, 0x02, 0x40, 0x20, 0x12, 0x2d, 0x00, 0x01, 0x41, 0x25, + 0x46, 0x0d, 0x00, 0x20, 0x12, 0x21, 0x01, 0x0c, 0x03, 0x0b, 0x20, 0x14, + 0x41, 0x01, 0x6a, 0x21, 0x14, 0x20, 0x12, 0x2d, 0x00, 0x02, 0x21, 0x15, + 0x20, 0x12, 0x41, 0x02, 0x6a, 0x22, 0x01, 0x21, 0x12, 0x20, 0x15, 0x41, + 0x25, 0x46, 0x0d, 0x00, 0x0c, 0x02, 0x0b, 0x0b, 0x20, 0x01, 0x21, 0x14, + 0x0b, 0x20, 0x14, 0x20, 0x13, 0x6b, 0x22, 0x12, 0x20, 0x11, 0x41, 0xff, + 0xff, 0xff, 0xff, 0x07, 0x73, 0x22, 0x14, 0x4a, 0x0d, 0x0c, 0x02, 0x40, + 0x20, 0x00, 0x45, 0x0d, 0x00, 0x20, 0x00, 0x2d, 0x00, 0x00, 0x41, 0x20, + 0x71, 0x0d, 0x00, 0x20, 0x13, 0x20, 0x12, 0x20, 0x00, 0x10, 0xb7, 0x80, + 0x80, 0x80, 0x00, 0x1a, 0x0b, 0x20, 0x12, 0x0d, 0x0b, 0x20, 0x01, 0x41, + 0x01, 0x6a, 0x21, 0x12, 0x41, 0x7f, 0x21, 0x16, 0x02, 0x40, 0x20, 0x01, + 0x2c, 0x00, 0x01, 0x22, 0x17, 0x41, 0x50, 0x6a, 0x22, 0x15, 0x41, 0x09, + 0x4b, 0x0d, 0x00, 0x20, 0x01, 0x2d, 0x00, 0x02, 0x41, 0x24, 0x47, 0x0d, + 0x00, 0x20, 0x01, 0x41, 0x03, 0x6a, 0x21, 0x12, 0x20, 0x01, 0x2c, 0x00, + 0x03, 0x21, 0x17, 0x41, 0x01, 0x21, 0x10, 0x20, 0x15, 0x21, 0x16, 0x0b, + 0x41, 0x00, 0x21, 0x18, 0x02, 0x40, 0x20, 0x17, 0x41, 0x60, 0x6a, 0x22, + 0x01, 0x41, 0x1f, 0x4b, 0x0d, 0x00, 0x41, 0x01, 0x20, 0x01, 0x74, 0x22, + 0x01, 0x41, 0x89, 0xd1, 0x04, 0x71, 0x45, 0x0d, 0x00, 0x20, 0x12, 0x41, + 0x01, 0x6a, 0x21, 0x15, 0x41, 0x00, 0x21, 0x18, 0x03, 0x40, 0x20, 0x01, + 0x20, 0x18, 0x72, 0x21, 0x18, 0x20, 0x15, 0x22, 0x12, 0x2c, 0x00, 0x00, + 0x22, 0x17, 0x41, 0x60, 0x6a, 0x22, 0x01, 0x41, 0x20, 0x4f, 0x0d, 0x01, + 0x20, 0x12, 0x41, 0x01, 0x6a, 0x21, 0x15, 0x41, 0x01, 0x20, 0x01, 0x74, + 0x22, 0x01, 0x41, 0x89, 0xd1, 0x04, 0x71, 0x0d, 0x00, 0x0b, 0x0b, 0x02, + 0x40, 0x20, 0x17, 0x41, 0x2a, 0x47, 0x0d, 0x00, 0x02, 0x40, 0x02, 0x40, + 0x20, 0x12, 0x2c, 0x00, 0x01, 0x41, 0x50, 0x6a, 0x22, 0x01, 0x41, 0x09, + 0x4b, 0x0d, 0x00, 0x20, 0x12, 0x2d, 0x00, 0x02, 0x41, 0x24, 0x47, 0x0d, + 0x00, 0x20, 0x04, 0x20, 0x01, 0x41, 0x02, 0x74, 0x6a, 0x41, 0x0a, 0x36, + 0x02, 0x00, 0x20, 0x12, 0x41, 0x03, 0x6a, 0x21, 0x15, 0x20, 0x12, 0x2c, + 0x00, 0x01, 0x41, 0x03, 0x74, 0x20, 0x03, 0x6a, 0x41, 0x80, 0x7d, 0x6a, + 0x28, 0x02, 0x00, 0x21, 0x19, 0x41, 0x01, 0x21, 0x10, 0x0c, 0x01, 0x0b, + 0x20, 0x10, 0x0d, 0x06, 0x20, 0x12, 0x41, 0x01, 0x6a, 0x21, 0x15, 0x02, + 0x40, 0x20, 0x00, 0x0d, 0x00, 0x41, 0x00, 0x21, 0x10, 0x41, 0x00, 0x21, + 0x19, 0x0c, 0x06, 0x0b, 0x20, 0x02, 0x20, 0x02, 0x28, 0x02, 0x00, 0x22, + 0x01, 0x41, 0x04, 0x6a, 0x36, 0x02, 0x00, 0x20, 0x01, 0x28, 0x02, 0x00, + 0x21, 0x19, 0x41, 0x00, 0x21, 0x10, 0x0b, 0x20, 0x19, 0x41, 0x7f, 0x4a, + 0x0d, 0x04, 0x41, 0x00, 0x20, 0x19, 0x6b, 0x21, 0x19, 0x20, 0x18, 0x41, + 0x80, 0xc0, 0x00, 0x72, 0x21, 0x18, 0x0c, 0x04, 0x0b, 0x41, 0x00, 0x21, + 0x19, 0x02, 0x40, 0x20, 0x17, 0x41, 0x50, 0x6a, 0x22, 0x01, 0x41, 0x09, + 0x4d, 0x0d, 0x00, 0x20, 0x12, 0x21, 0x15, 0x0c, 0x04, 0x0b, 0x41, 0x00, + 0x21, 0x19, 0x03, 0x40, 0x02, 0x40, 0x20, 0x19, 0x41, 0xcc, 0x99, 0xb3, + 0xe6, 0x00, 0x4b, 0x0d, 0x00, 0x41, 0x7f, 0x20, 0x19, 0x41, 0x0a, 0x6c, + 0x22, 0x15, 0x20, 0x01, 0x6a, 0x20, 0x01, 0x20, 0x15, 0x41, 0xff, 0xff, + 0xff, 0xff, 0x07, 0x73, 0x4b, 0x1b, 0x21, 0x19, 0x20, 0x12, 0x2c, 0x00, + 0x01, 0x21, 0x01, 0x20, 0x12, 0x41, 0x01, 0x6a, 0x22, 0x15, 0x21, 0x12, + 0x20, 0x01, 0x41, 0x50, 0x6a, 0x22, 0x01, 0x41, 0x0a, 0x49, 0x0d, 0x01, + 0x20, 0x19, 0x41, 0x00, 0x48, 0x0d, 0x0e, 0x0c, 0x05, 0x0b, 0x20, 0x12, + 0x2c, 0x00, 0x01, 0x21, 0x01, 0x41, 0x7f, 0x21, 0x19, 0x20, 0x12, 0x41, + 0x01, 0x6a, 0x21, 0x12, 0x20, 0x01, 0x41, 0x50, 0x6a, 0x22, 0x01, 0x41, + 0x0a, 0x49, 0x0d, 0x00, 0x0c, 0x0d, 0x0b, 0x0b, 0x20, 0x01, 0x2d, 0x00, + 0x01, 0x21, 0x12, 0x20, 0x01, 0x41, 0x01, 0x6a, 0x21, 0x01, 0x0c, 0x00, + 0x0b, 0x0b, 0x20, 0x00, 0x0d, 0x0b, 0x02, 0x40, 0x20, 0x10, 0x0d, 0x00, + 0x41, 0x00, 0x21, 0x11, 0x0c, 0x0c, 0x0b, 0x02, 0x40, 0x02, 0x40, 0x02, + 0x40, 0x20, 0x04, 0x28, 0x02, 0x04, 0x22, 0x01, 0x0d, 0x00, 0x41, 0x01, + 0x21, 0x01, 0x0c, 0x01, 0x0b, 0x20, 0x03, 0x41, 0x08, 0x6a, 0x20, 0x01, + 0x20, 0x02, 0x10, 0xc4, 0x80, 0x80, 0x80, 0x00, 0x02, 0x40, 0x20, 0x04, + 0x28, 0x02, 0x08, 0x22, 0x01, 0x0d, 0x00, 0x41, 0x02, 0x21, 0x01, 0x0c, + 0x01, 0x0b, 0x20, 0x03, 0x41, 0x10, 0x6a, 0x20, 0x01, 0x20, 0x02, 0x10, + 0xc4, 0x80, 0x80, 0x80, 0x00, 0x02, 0x40, 0x20, 0x04, 0x28, 0x02, 0x0c, + 0x22, 0x01, 0x0d, 0x00, 0x41, 0x03, 0x21, 0x01, 0x0c, 0x01, 0x0b, 0x20, + 0x03, 0x41, 0x18, 0x6a, 0x20, 0x01, 0x20, 0x02, 0x10, 0xc4, 0x80, 0x80, + 0x80, 0x00, 0x02, 0x40, 0x20, 0x04, 0x28, 0x02, 0x10, 0x22, 0x01, 0x0d, + 0x00, 0x41, 0x04, 0x21, 0x01, 0x0c, 0x01, 0x0b, 0x20, 0x03, 0x41, 0x20, + 0x6a, 0x20, 0x01, 0x20, 0x02, 0x10, 0xc4, 0x80, 0x80, 0x80, 0x00, 0x02, + 0x40, 0x20, 0x04, 0x28, 0x02, 0x14, 0x22, 0x01, 0x0d, 0x00, 0x41, 0x05, + 0x21, 0x01, 0x0c, 0x01, 0x0b, 0x20, 0x03, 0x41, 0x28, 0x6a, 0x20, 0x01, + 0x20, 0x02, 0x10, 0xc4, 0x80, 0x80, 0x80, 0x00, 0x02, 0x40, 0x20, 0x04, + 0x28, 0x02, 0x18, 0x22, 0x01, 0x0d, 0x00, 0x41, 0x06, 0x21, 0x01, 0x0c, + 0x01, 0x0b, 0x20, 0x03, 0x41, 0x30, 0x6a, 0x20, 0x01, 0x20, 0x02, 0x10, + 0xc4, 0x80, 0x80, 0x80, 0x00, 0x02, 0x40, 0x20, 0x04, 0x28, 0x02, 0x1c, + 0x22, 0x01, 0x0d, 0x00, 0x41, 0x07, 0x21, 0x01, 0x0c, 0x01, 0x0b, 0x20, + 0x03, 0x41, 0x38, 0x6a, 0x20, 0x01, 0x20, 0x02, 0x10, 0xc4, 0x80, 0x80, + 0x80, 0x00, 0x02, 0x40, 0x20, 0x04, 0x28, 0x02, 0x20, 0x22, 0x01, 0x0d, + 0x00, 0x41, 0x08, 0x21, 0x01, 0x0c, 0x01, 0x0b, 0x20, 0x03, 0x41, 0xc0, + 0x00, 0x6a, 0x20, 0x01, 0x20, 0x02, 0x10, 0xc4, 0x80, 0x80, 0x80, 0x00, + 0x20, 0x04, 0x28, 0x02, 0x24, 0x22, 0x01, 0x0d, 0x01, 0x41, 0x09, 0x21, + 0x01, 0x0b, 0x20, 0x01, 0x41, 0x02, 0x74, 0x21, 0x01, 0x03, 0x40, 0x20, + 0x04, 0x20, 0x01, 0x6a, 0x28, 0x02, 0x00, 0x0d, 0x03, 0x20, 0x01, 0x41, + 0x04, 0x6a, 0x22, 0x01, 0x41, 0x28, 0x47, 0x0d, 0x00, 0x0b, 0x41, 0x01, + 0x21, 0x11, 0x0c, 0x0c, 0x0b, 0x20, 0x03, 0x41, 0xc8, 0x00, 0x6a, 0x20, + 0x01, 0x20, 0x02, 0x10, 0xc4, 0x80, 0x80, 0x80, 0x00, 0x41, 0x01, 0x21, + 0x11, 0x0c, 0x0b, 0x0b, 0x41, 0x00, 0x21, 0x12, 0x41, 0x7f, 0x21, 0x17, + 0x02, 0x40, 0x02, 0x40, 0x20, 0x15, 0x2d, 0x00, 0x00, 0x41, 0x2e, 0x46, + 0x0d, 0x00, 0x20, 0x15, 0x21, 0x01, 0x41, 0x00, 0x21, 0x1a, 0x0c, 0x01, + 0x0b, 0x02, 0x40, 0x20, 0x15, 0x2c, 0x00, 0x01, 0x22, 0x17, 0x41, 0x2a, + 0x47, 0x0d, 0x00, 0x02, 0x40, 0x02, 0x40, 0x20, 0x15, 0x2c, 0x00, 0x02, + 0x41, 0x50, 0x6a, 0x22, 0x01, 0x41, 0x09, 0x4b, 0x0d, 0x00, 0x20, 0x15, + 0x2d, 0x00, 0x03, 0x41, 0x24, 0x47, 0x0d, 0x00, 0x20, 0x04, 0x20, 0x01, + 0x41, 0x02, 0x74, 0x6a, 0x41, 0x0a, 0x36, 0x02, 0x00, 0x20, 0x15, 0x41, + 0x04, 0x6a, 0x21, 0x01, 0x20, 0x15, 0x2c, 0x00, 0x02, 0x41, 0x03, 0x74, + 0x20, 0x03, 0x6a, 0x41, 0x80, 0x7d, 0x6a, 0x28, 0x02, 0x00, 0x21, 0x17, + 0x0c, 0x01, 0x0b, 0x20, 0x10, 0x0d, 0x03, 0x20, 0x15, 0x41, 0x02, 0x6a, + 0x21, 0x01, 0x02, 0x40, 0x20, 0x00, 0x0d, 0x00, 0x41, 0x00, 0x21, 0x17, + 0x0c, 0x01, 0x0b, 0x20, 0x02, 0x20, 0x02, 0x28, 0x02, 0x00, 0x22, 0x15, + 0x41, 0x04, 0x6a, 0x36, 0x02, 0x00, 0x20, 0x15, 0x28, 0x02, 0x00, 0x21, + 0x17, 0x0b, 0x20, 0x17, 0x41, 0x7f, 0x73, 0x41, 0x1f, 0x76, 0x21, 0x1a, + 0x0c, 0x01, 0x0b, 0x20, 0x15, 0x41, 0x01, 0x6a, 0x21, 0x01, 0x02, 0x40, + 0x20, 0x17, 0x41, 0x50, 0x6a, 0x22, 0x1b, 0x41, 0x09, 0x4d, 0x0d, 0x00, + 0x41, 0x01, 0x21, 0x1a, 0x41, 0x00, 0x21, 0x17, 0x0c, 0x01, 0x0b, 0x41, + 0x00, 0x21, 0x1c, 0x20, 0x01, 0x21, 0x15, 0x03, 0x40, 0x41, 0x7f, 0x21, + 0x17, 0x02, 0x40, 0x20, 0x1c, 0x41, 0xcc, 0x99, 0xb3, 0xe6, 0x00, 0x4b, + 0x0d, 0x00, 0x41, 0x7f, 0x20, 0x1c, 0x41, 0x0a, 0x6c, 0x22, 0x01, 0x20, + 0x1b, 0x6a, 0x20, 0x1b, 0x20, 0x01, 0x41, 0xff, 0xff, 0xff, 0xff, 0x07, + 0x73, 0x4b, 0x1b, 0x21, 0x17, 0x0b, 0x41, 0x01, 0x21, 0x1a, 0x20, 0x15, + 0x2c, 0x00, 0x01, 0x21, 0x1b, 0x20, 0x17, 0x21, 0x1c, 0x20, 0x15, 0x41, + 0x01, 0x6a, 0x22, 0x01, 0x21, 0x15, 0x20, 0x1b, 0x41, 0x50, 0x6a, 0x22, + 0x1b, 0x41, 0x0a, 0x49, 0x0d, 0x00, 0x0b, 0x0b, 0x03, 0x40, 0x20, 0x12, + 0x21, 0x15, 0x20, 0x01, 0x2c, 0x00, 0x00, 0x22, 0x12, 0x41, 0x85, 0x7f, + 0x6a, 0x41, 0x46, 0x49, 0x0d, 0x01, 0x20, 0x01, 0x41, 0x01, 0x6a, 0x21, + 0x01, 0x20, 0x12, 0x20, 0x15, 0x41, 0x3a, 0x6c, 0x6a, 0x41, 0x9f, 0x98, + 0x80, 0x80, 0x00, 0x6a, 0x2d, 0x00, 0x00, 0x22, 0x12, 0x41, 0x7f, 0x6a, + 0x41, 0x08, 0x49, 0x0d, 0x00, 0x0b, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, + 0x20, 0x12, 0x41, 0x1b, 0x46, 0x0d, 0x00, 0x20, 0x12, 0x45, 0x0d, 0x03, + 0x02, 0x40, 0x20, 0x16, 0x41, 0x00, 0x48, 0x0d, 0x00, 0x20, 0x04, 0x20, + 0x16, 0x41, 0x02, 0x74, 0x6a, 0x20, 0x12, 0x36, 0x02, 0x00, 0x20, 0x05, + 0x20, 0x03, 0x20, 0x16, 0x41, 0x03, 0x74, 0x6a, 0x29, 0x03, 0x00, 0x37, + 0x03, 0x38, 0x0c, 0x02, 0x0b, 0x02, 0x40, 0x20, 0x00, 0x0d, 0x00, 0x41, + 0x00, 0x21, 0x11, 0x0c, 0x0e, 0x0b, 0x20, 0x05, 0x41, 0x38, 0x6a, 0x20, + 0x12, 0x20, 0x02, 0x10, 0xc4, 0x80, 0x80, 0x80, 0x00, 0x0c, 0x02, 0x0b, + 0x20, 0x16, 0x41, 0x7f, 0x4a, 0x0d, 0x02, 0x0b, 0x41, 0x00, 0x21, 0x12, + 0x20, 0x00, 0x45, 0x0d, 0x08, 0x0b, 0x20, 0x18, 0x41, 0xff, 0xff, 0x7b, + 0x71, 0x22, 0x1c, 0x20, 0x18, 0x20, 0x18, 0x41, 0x80, 0xc0, 0x00, 0x71, + 0x1b, 0x21, 0x16, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, 0x02, + 0x40, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, 0x02, + 0x40, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, 0x02, + 0x40, 0x20, 0x01, 0x41, 0x7f, 0x6a, 0x2c, 0x00, 0x00, 0x22, 0x12, 0x41, + 0x5f, 0x71, 0x20, 0x12, 0x20, 0x12, 0x41, 0x0f, 0x71, 0x41, 0x03, 0x46, + 0x1b, 0x20, 0x12, 0x20, 0x15, 0x1b, 0x22, 0x1d, 0x41, 0xbf, 0x7f, 0x6a, + 0x0e, 0x38, 0x10, 0x12, 0x0d, 0x12, 0x10, 0x10, 0x10, 0x12, 0x12, 0x12, + 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x0c, 0x12, 0x12, 0x12, + 0x12, 0x03, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x10, 0x12, + 0x08, 0x05, 0x10, 0x10, 0x10, 0x12, 0x05, 0x12, 0x12, 0x12, 0x09, 0x01, + 0x04, 0x02, 0x12, 0x12, 0x0a, 0x12, 0x00, 0x12, 0x12, 0x03, 0x12, 0x0b, + 0x41, 0x00, 0x21, 0x1b, 0x41, 0xaa, 0x95, 0x80, 0x80, 0x00, 0x21, 0x1e, + 0x20, 0x05, 0x29, 0x03, 0x38, 0x21, 0x1f, 0x0c, 0x05, 0x0b, 0x41, 0x00, + 0x21, 0x12, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, + 0x02, 0x40, 0x02, 0x40, 0x20, 0x15, 0x41, 0xff, 0x01, 0x71, 0x0e, 0x08, + 0x00, 0x01, 0x02, 0x03, 0x04, 0x1d, 0x05, 0x06, 0x1d, 0x0b, 0x20, 0x05, + 0x28, 0x02, 0x38, 0x20, 0x11, 0x36, 0x02, 0x00, 0x0c, 0x1c, 0x0b, 0x20, + 0x05, 0x28, 0x02, 0x38, 0x20, 0x11, 0x36, 0x02, 0x00, 0x0c, 0x1b, 0x0b, + 0x20, 0x05, 0x28, 0x02, 0x38, 0x20, 0x11, 0xac, 0x37, 0x03, 0x00, 0x0c, + 0x1a, 0x0b, 0x20, 0x05, 0x28, 0x02, 0x38, 0x20, 0x11, 0x3b, 0x01, 0x00, + 0x0c, 0x19, 0x0b, 0x20, 0x05, 0x28, 0x02, 0x38, 0x20, 0x11, 0x3a, 0x00, + 0x00, 0x0c, 0x18, 0x0b, 0x20, 0x05, 0x28, 0x02, 0x38, 0x20, 0x11, 0x36, + 0x02, 0x00, 0x0c, 0x17, 0x0b, 0x20, 0x05, 0x28, 0x02, 0x38, 0x20, 0x11, + 0xac, 0x37, 0x03, 0x00, 0x0c, 0x16, 0x0b, 0x20, 0x17, 0x41, 0x08, 0x20, + 0x17, 0x41, 0x08, 0x4b, 0x1b, 0x21, 0x17, 0x20, 0x16, 0x41, 0x08, 0x72, + 0x21, 0x16, 0x41, 0xf8, 0x00, 0x21, 0x1d, 0x0b, 0x41, 0x00, 0x21, 0x1b, + 0x41, 0xaa, 0x95, 0x80, 0x80, 0x00, 0x21, 0x1e, 0x02, 0x40, 0x20, 0x05, + 0x29, 0x03, 0x38, 0x22, 0x1f, 0x50, 0x45, 0x0d, 0x00, 0x20, 0x0f, 0x21, + 0x13, 0x0c, 0x04, 0x0b, 0x20, 0x1d, 0x41, 0x20, 0x71, 0x21, 0x15, 0x20, + 0x0f, 0x21, 0x13, 0x03, 0x40, 0x20, 0x13, 0x41, 0x7f, 0x6a, 0x22, 0x13, + 0x20, 0x1f, 0xa7, 0x41, 0x0f, 0x71, 0x41, 0xb0, 0x9c, 0x80, 0x80, 0x00, + 0x6a, 0x2d, 0x00, 0x00, 0x20, 0x15, 0x72, 0x3a, 0x00, 0x00, 0x20, 0x1f, + 0x42, 0x0f, 0x56, 0x21, 0x12, 0x20, 0x1f, 0x42, 0x04, 0x88, 0x21, 0x1f, + 0x20, 0x12, 0x0d, 0x00, 0x0b, 0x20, 0x16, 0x41, 0x08, 0x71, 0x45, 0x0d, + 0x03, 0x20, 0x1d, 0x41, 0x04, 0x75, 0x41, 0xaa, 0x95, 0x80, 0x80, 0x00, + 0x6a, 0x21, 0x1e, 0x41, 0x02, 0x21, 0x1b, 0x0c, 0x03, 0x0b, 0x20, 0x0f, + 0x21, 0x13, 0x02, 0x40, 0x20, 0x05, 0x29, 0x03, 0x38, 0x22, 0x1f, 0x50, + 0x0d, 0x00, 0x20, 0x0f, 0x21, 0x13, 0x03, 0x40, 0x20, 0x13, 0x41, 0x7f, + 0x6a, 0x22, 0x13, 0x20, 0x1f, 0xa7, 0x41, 0x07, 0x71, 0x41, 0x30, 0x72, + 0x3a, 0x00, 0x00, 0x20, 0x1f, 0x42, 0x07, 0x56, 0x21, 0x12, 0x20, 0x1f, + 0x42, 0x03, 0x88, 0x21, 0x1f, 0x20, 0x12, 0x0d, 0x00, 0x0b, 0x0b, 0x41, + 0x00, 0x21, 0x1b, 0x41, 0xaa, 0x95, 0x80, 0x80, 0x00, 0x21, 0x1e, 0x20, + 0x16, 0x41, 0x08, 0x71, 0x45, 0x0d, 0x02, 0x20, 0x17, 0x20, 0x0f, 0x20, + 0x13, 0x6b, 0x22, 0x12, 0x41, 0x01, 0x6a, 0x20, 0x17, 0x20, 0x12, 0x4a, + 0x1b, 0x21, 0x17, 0x0c, 0x02, 0x0b, 0x02, 0x40, 0x20, 0x05, 0x29, 0x03, + 0x38, 0x22, 0x1f, 0x42, 0x7f, 0x55, 0x0d, 0x00, 0x20, 0x05, 0x42, 0x00, + 0x20, 0x1f, 0x7d, 0x22, 0x1f, 0x37, 0x03, 0x38, 0x41, 0x01, 0x21, 0x1b, + 0x41, 0xaa, 0x95, 0x80, 0x80, 0x00, 0x21, 0x1e, 0x0c, 0x01, 0x0b, 0x02, + 0x40, 0x20, 0x16, 0x41, 0x80, 0x10, 0x71, 0x45, 0x0d, 0x00, 0x41, 0x01, + 0x21, 0x1b, 0x41, 0xab, 0x95, 0x80, 0x80, 0x00, 0x21, 0x1e, 0x0c, 0x01, + 0x0b, 0x41, 0xac, 0x95, 0x80, 0x80, 0x00, 0x41, 0xaa, 0x95, 0x80, 0x80, + 0x00, 0x20, 0x16, 0x41, 0x01, 0x71, 0x22, 0x1b, 0x1b, 0x21, 0x1e, 0x0b, + 0x02, 0x40, 0x02, 0x40, 0x20, 0x1f, 0x42, 0x80, 0x80, 0x80, 0x80, 0x10, + 0x5a, 0x0d, 0x00, 0x20, 0x1f, 0x21, 0x20, 0x20, 0x0f, 0x21, 0x13, 0x0c, + 0x01, 0x0b, 0x20, 0x0f, 0x21, 0x13, 0x03, 0x40, 0x20, 0x13, 0x41, 0x7f, + 0x6a, 0x22, 0x13, 0x20, 0x1f, 0x20, 0x1f, 0x42, 0x0a, 0x80, 0x22, 0x20, + 0x42, 0x0a, 0x7e, 0x7d, 0xa7, 0x41, 0x30, 0x72, 0x3a, 0x00, 0x00, 0x20, + 0x1f, 0x42, 0xff, 0xff, 0xff, 0xff, 0x9f, 0x01, 0x56, 0x21, 0x12, 0x20, + 0x20, 0x21, 0x1f, 0x20, 0x12, 0x0d, 0x00, 0x0b, 0x0b, 0x20, 0x20, 0xa7, + 0x22, 0x12, 0x45, 0x0d, 0x00, 0x03, 0x40, 0x20, 0x13, 0x41, 0x7f, 0x6a, + 0x22, 0x13, 0x20, 0x12, 0x20, 0x12, 0x41, 0x0a, 0x6e, 0x22, 0x15, 0x41, + 0x0a, 0x6c, 0x6b, 0x41, 0x30, 0x72, 0x3a, 0x00, 0x00, 0x20, 0x12, 0x41, + 0x09, 0x4b, 0x21, 0x18, 0x20, 0x15, 0x21, 0x12, 0x20, 0x18, 0x0d, 0x00, + 0x0b, 0x0b, 0x02, 0x40, 0x20, 0x1a, 0x45, 0x0d, 0x00, 0x20, 0x17, 0x41, + 0x00, 0x48, 0x0d, 0x12, 0x0b, 0x20, 0x16, 0x41, 0xff, 0xff, 0x7b, 0x71, + 0x20, 0x16, 0x20, 0x1a, 0x1b, 0x21, 0x1c, 0x02, 0x40, 0x20, 0x05, 0x29, + 0x03, 0x38, 0x22, 0x1f, 0x42, 0x00, 0x52, 0x0d, 0x00, 0x41, 0x00, 0x21, + 0x18, 0x20, 0x17, 0x0d, 0x00, 0x20, 0x0f, 0x21, 0x13, 0x20, 0x0f, 0x21, + 0x12, 0x0c, 0x0c, 0x0b, 0x20, 0x17, 0x20, 0x0f, 0x20, 0x13, 0x6b, 0x20, + 0x1f, 0x50, 0x6a, 0x22, 0x12, 0x20, 0x17, 0x20, 0x12, 0x4a, 0x1b, 0x21, + 0x18, 0x20, 0x0f, 0x21, 0x12, 0x0c, 0x0b, 0x0b, 0x20, 0x05, 0x20, 0x05, + 0x29, 0x03, 0x38, 0x3c, 0x00, 0x37, 0x41, 0x00, 0x21, 0x1b, 0x41, 0xaa, + 0x95, 0x80, 0x80, 0x00, 0x21, 0x1e, 0x41, 0x01, 0x21, 0x18, 0x20, 0x09, + 0x21, 0x13, 0x20, 0x0f, 0x21, 0x12, 0x0c, 0x0a, 0x0b, 0x41, 0xb4, 0x9e, + 0x80, 0x80, 0x00, 0x28, 0x02, 0x00, 0x10, 0xbb, 0x80, 0x80, 0x80, 0x00, + 0x21, 0x13, 0x0c, 0x01, 0x0b, 0x20, 0x05, 0x28, 0x02, 0x38, 0x22, 0x12, + 0x41, 0x81, 0x96, 0x80, 0x80, 0x00, 0x20, 0x12, 0x1b, 0x21, 0x13, 0x0b, + 0x20, 0x13, 0x20, 0x13, 0x20, 0x17, 0x41, 0xff, 0xff, 0xff, 0xff, 0x07, + 0x20, 0x17, 0x41, 0xff, 0xff, 0xff, 0xff, 0x07, 0x49, 0x1b, 0x10, 0xbd, + 0x80, 0x80, 0x80, 0x00, 0x22, 0x18, 0x6a, 0x21, 0x12, 0x41, 0x00, 0x21, + 0x1b, 0x41, 0xaa, 0x95, 0x80, 0x80, 0x00, 0x21, 0x1e, 0x20, 0x17, 0x41, + 0x7f, 0x4a, 0x0d, 0x07, 0x20, 0x12, 0x2d, 0x00, 0x00, 0x45, 0x0d, 0x07, + 0x0c, 0x0d, 0x0b, 0x20, 0x05, 0x28, 0x02, 0x38, 0x21, 0x13, 0x20, 0x17, + 0x0d, 0x01, 0x41, 0x00, 0x21, 0x12, 0x0c, 0x02, 0x0b, 0x20, 0x05, 0x41, + 0x00, 0x36, 0x02, 0x0c, 0x20, 0x05, 0x20, 0x05, 0x29, 0x03, 0x38, 0x3e, + 0x02, 0x08, 0x20, 0x05, 0x20, 0x05, 0x41, 0x08, 0x6a, 0x36, 0x02, 0x38, + 0x20, 0x05, 0x41, 0x08, 0x6a, 0x21, 0x13, 0x41, 0x7f, 0x21, 0x17, 0x0b, + 0x41, 0x00, 0x21, 0x12, 0x20, 0x13, 0x21, 0x14, 0x02, 0x40, 0x03, 0x40, + 0x20, 0x14, 0x28, 0x02, 0x00, 0x22, 0x15, 0x45, 0x0d, 0x01, 0x02, 0x40, + 0x20, 0x05, 0x41, 0x04, 0x6a, 0x20, 0x15, 0x10, 0xbf, 0x80, 0x80, 0x80, + 0x00, 0x22, 0x15, 0x41, 0x00, 0x48, 0x22, 0x18, 0x0d, 0x00, 0x20, 0x15, + 0x20, 0x17, 0x20, 0x12, 0x6b, 0x4b, 0x0d, 0x00, 0x20, 0x14, 0x41, 0x04, + 0x6a, 0x21, 0x14, 0x20, 0x15, 0x20, 0x12, 0x6a, 0x22, 0x12, 0x20, 0x17, + 0x49, 0x0d, 0x01, 0x0c, 0x02, 0x0b, 0x0b, 0x20, 0x18, 0x0d, 0x0c, 0x0b, + 0x20, 0x12, 0x41, 0x00, 0x48, 0x0d, 0x0a, 0x0b, 0x02, 0x40, 0x20, 0x16, + 0x41, 0x80, 0xc0, 0x04, 0x71, 0x22, 0x18, 0x0d, 0x00, 0x20, 0x19, 0x20, + 0x12, 0x4c, 0x0d, 0x00, 0x20, 0x05, 0x41, 0xf0, 0x00, 0x6a, 0x41, 0x20, + 0x20, 0x19, 0x20, 0x12, 0x6b, 0x22, 0x14, 0x41, 0x80, 0x02, 0x20, 0x14, + 0x41, 0x80, 0x02, 0x49, 0x22, 0x15, 0x1b, 0x10, 0xa9, 0x80, 0x80, 0x80, + 0x00, 0x1a, 0x02, 0x40, 0x20, 0x15, 0x0d, 0x00, 0x03, 0x40, 0x02, 0x40, + 0x20, 0x00, 0x2d, 0x00, 0x00, 0x41, 0x20, 0x71, 0x0d, 0x00, 0x20, 0x05, + 0x41, 0xf0, 0x00, 0x6a, 0x41, 0x80, 0x02, 0x20, 0x00, 0x10, 0xb7, 0x80, + 0x80, 0x80, 0x00, 0x1a, 0x0b, 0x20, 0x14, 0x41, 0x80, 0x7e, 0x6a, 0x22, + 0x14, 0x41, 0xff, 0x01, 0x4b, 0x0d, 0x00, 0x0b, 0x0b, 0x20, 0x00, 0x2d, + 0x00, 0x00, 0x41, 0x20, 0x71, 0x0d, 0x00, 0x20, 0x05, 0x41, 0xf0, 0x00, + 0x6a, 0x20, 0x14, 0x20, 0x00, 0x10, 0xb7, 0x80, 0x80, 0x80, 0x00, 0x1a, + 0x0b, 0x02, 0x40, 0x20, 0x12, 0x45, 0x0d, 0x00, 0x41, 0x00, 0x21, 0x14, + 0x03, 0x40, 0x20, 0x13, 0x28, 0x02, 0x00, 0x22, 0x15, 0x45, 0x0d, 0x01, + 0x20, 0x05, 0x41, 0x04, 0x6a, 0x20, 0x15, 0x10, 0xbf, 0x80, 0x80, 0x80, + 0x00, 0x22, 0x15, 0x20, 0x14, 0x6a, 0x22, 0x14, 0x20, 0x12, 0x4b, 0x0d, + 0x01, 0x02, 0x40, 0x20, 0x00, 0x2d, 0x00, 0x00, 0x41, 0x20, 0x71, 0x0d, + 0x00, 0x20, 0x05, 0x41, 0x04, 0x6a, 0x20, 0x15, 0x20, 0x00, 0x10, 0xb7, + 0x80, 0x80, 0x80, 0x00, 0x1a, 0x0b, 0x20, 0x13, 0x41, 0x04, 0x6a, 0x21, + 0x13, 0x20, 0x14, 0x20, 0x12, 0x49, 0x0d, 0x00, 0x0b, 0x0b, 0x02, 0x40, + 0x20, 0x18, 0x41, 0x80, 0xc0, 0x00, 0x47, 0x0d, 0x00, 0x20, 0x19, 0x20, + 0x12, 0x4c, 0x0d, 0x00, 0x20, 0x05, 0x41, 0xf0, 0x00, 0x6a, 0x41, 0x20, + 0x20, 0x19, 0x20, 0x12, 0x6b, 0x22, 0x14, 0x41, 0x80, 0x02, 0x20, 0x14, + 0x41, 0x80, 0x02, 0x49, 0x22, 0x15, 0x1b, 0x10, 0xa9, 0x80, 0x80, 0x80, + 0x00, 0x1a, 0x02, 0x40, 0x20, 0x15, 0x0d, 0x00, 0x03, 0x40, 0x02, 0x40, + 0x20, 0x00, 0x2d, 0x00, 0x00, 0x41, 0x20, 0x71, 0x0d, 0x00, 0x20, 0x05, + 0x41, 0xf0, 0x00, 0x6a, 0x41, 0x80, 0x02, 0x20, 0x00, 0x10, 0xb7, 0x80, + 0x80, 0x80, 0x00, 0x1a, 0x0b, 0x20, 0x14, 0x41, 0x80, 0x7e, 0x6a, 0x22, + 0x14, 0x41, 0xff, 0x01, 0x4b, 0x0d, 0x00, 0x0b, 0x0b, 0x20, 0x00, 0x2d, + 0x00, 0x00, 0x41, 0x20, 0x71, 0x0d, 0x00, 0x20, 0x05, 0x41, 0xf0, 0x00, + 0x6a, 0x20, 0x14, 0x20, 0x00, 0x10, 0xb7, 0x80, 0x80, 0x80, 0x00, 0x1a, + 0x0b, 0x20, 0x19, 0x20, 0x12, 0x20, 0x19, 0x20, 0x12, 0x4a, 0x1b, 0x21, + 0x12, 0x0c, 0x08, 0x0b, 0x02, 0x40, 0x20, 0x1a, 0x45, 0x0d, 0x00, 0x20, + 0x17, 0x41, 0x00, 0x48, 0x0d, 0x09, 0x0b, 0x20, 0x05, 0x2b, 0x03, 0x38, + 0x21, 0x21, 0x20, 0x05, 0x41, 0x00, 0x36, 0x02, 0x6c, 0x02, 0x40, 0x02, + 0x40, 0x20, 0x21, 0xbd, 0x42, 0x7f, 0x55, 0x0d, 0x00, 0x20, 0x21, 0x9a, + 0x21, 0x21, 0x41, 0x01, 0x21, 0x22, 0x41, 0x00, 0x21, 0x23, 0x41, 0xb4, + 0x95, 0x80, 0x80, 0x00, 0x21, 0x24, 0x0c, 0x01, 0x0b, 0x02, 0x40, 0x20, + 0x16, 0x41, 0x80, 0x10, 0x71, 0x45, 0x0d, 0x00, 0x41, 0x01, 0x21, 0x22, + 0x41, 0x00, 0x21, 0x23, 0x41, 0xb7, 0x95, 0x80, 0x80, 0x00, 0x21, 0x24, + 0x0c, 0x01, 0x0b, 0x41, 0xba, 0x95, 0x80, 0x80, 0x00, 0x41, 0xb5, 0x95, + 0x80, 0x80, 0x00, 0x20, 0x16, 0x41, 0x01, 0x71, 0x22, 0x22, 0x1b, 0x21, + 0x24, 0x20, 0x22, 0x45, 0x21, 0x23, 0x0b, 0x02, 0x40, 0x20, 0x21, 0xbd, + 0x42, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x83, + 0x42, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0xf8, 0xff, 0x00, 0x53, + 0x0d, 0x00, 0x20, 0x22, 0x41, 0x03, 0x6a, 0x21, 0x14, 0x02, 0x40, 0x20, + 0x16, 0x41, 0x80, 0xc0, 0x00, 0x71, 0x0d, 0x00, 0x20, 0x19, 0x20, 0x14, + 0x4c, 0x0d, 0x00, 0x20, 0x05, 0x41, 0xf0, 0x04, 0x6a, 0x41, 0x20, 0x20, + 0x19, 0x20, 0x14, 0x6b, 0x22, 0x12, 0x41, 0x80, 0x02, 0x20, 0x12, 0x41, + 0x80, 0x02, 0x49, 0x22, 0x15, 0x1b, 0x10, 0xa9, 0x80, 0x80, 0x80, 0x00, + 0x1a, 0x02, 0x40, 0x20, 0x15, 0x0d, 0x00, 0x03, 0x40, 0x02, 0x40, 0x20, + 0x00, 0x2d, 0x00, 0x00, 0x41, 0x20, 0x71, 0x0d, 0x00, 0x20, 0x05, 0x41, + 0xf0, 0x04, 0x6a, 0x41, 0x80, 0x02, 0x20, 0x00, 0x10, 0xb7, 0x80, 0x80, + 0x80, 0x00, 0x1a, 0x0b, 0x20, 0x12, 0x41, 0x80, 0x7e, 0x6a, 0x22, 0x12, + 0x41, 0xff, 0x01, 0x4b, 0x0d, 0x00, 0x0b, 0x0b, 0x20, 0x00, 0x2d, 0x00, + 0x00, 0x41, 0x20, 0x71, 0x0d, 0x00, 0x20, 0x05, 0x41, 0xf0, 0x04, 0x6a, + 0x20, 0x12, 0x20, 0x00, 0x10, 0xb7, 0x80, 0x80, 0x80, 0x00, 0x1a, 0x0b, + 0x02, 0x40, 0x20, 0x00, 0x28, 0x02, 0x00, 0x22, 0x12, 0x41, 0x20, 0x71, + 0x0d, 0x00, 0x20, 0x24, 0x20, 0x22, 0x20, 0x00, 0x10, 0xb7, 0x80, 0x80, + 0x80, 0x00, 0x1a, 0x20, 0x00, 0x28, 0x02, 0x00, 0x21, 0x12, 0x0b, 0x02, + 0x40, 0x20, 0x12, 0x41, 0x20, 0x71, 0x0d, 0x00, 0x41, 0xe8, 0x95, 0x80, + 0x80, 0x00, 0x41, 0xf4, 0x95, 0x80, 0x80, 0x00, 0x20, 0x1d, 0x41, 0x20, + 0x71, 0x22, 0x12, 0x1b, 0x41, 0xec, 0x95, 0x80, 0x80, 0x00, 0x41, 0xf8, + 0x95, 0x80, 0x80, 0x00, 0x20, 0x12, 0x1b, 0x20, 0x21, 0x20, 0x21, 0x62, + 0x1b, 0x41, 0x03, 0x20, 0x00, 0x10, 0xb7, 0x80, 0x80, 0x80, 0x00, 0x1a, + 0x0b, 0x02, 0x40, 0x20, 0x16, 0x41, 0x80, 0xc0, 0x04, 0x71, 0x41, 0x80, + 0xc0, 0x00, 0x47, 0x0d, 0x00, 0x20, 0x19, 0x20, 0x14, 0x4c, 0x0d, 0x00, + 0x20, 0x05, 0x41, 0xf0, 0x04, 0x6a, 0x41, 0x20, 0x20, 0x19, 0x20, 0x14, + 0x6b, 0x22, 0x12, 0x41, 0x80, 0x02, 0x20, 0x12, 0x41, 0x80, 0x02, 0x49, + 0x22, 0x15, 0x1b, 0x10, 0xa9, 0x80, 0x80, 0x80, 0x00, 0x1a, 0x02, 0x40, + 0x20, 0x15, 0x0d, 0x00, 0x03, 0x40, 0x02, 0x40, 0x20, 0x00, 0x2d, 0x00, + 0x00, 0x41, 0x20, 0x71, 0x0d, 0x00, 0x20, 0x05, 0x41, 0xf0, 0x04, 0x6a, + 0x41, 0x80, 0x02, 0x20, 0x00, 0x10, 0xb7, 0x80, 0x80, 0x80, 0x00, 0x1a, + 0x0b, 0x20, 0x12, 0x41, 0x80, 0x7e, 0x6a, 0x22, 0x12, 0x41, 0xff, 0x01, + 0x4b, 0x0d, 0x00, 0x0b, 0x0b, 0x20, 0x00, 0x2d, 0x00, 0x00, 0x41, 0x20, + 0x71, 0x0d, 0x00, 0x20, 0x05, 0x41, 0xf0, 0x04, 0x6a, 0x20, 0x12, 0x20, + 0x00, 0x10, 0xb7, 0x80, 0x80, 0x80, 0x00, 0x1a, 0x0b, 0x20, 0x14, 0x20, + 0x19, 0x20, 0x14, 0x20, 0x19, 0x4a, 0x1b, 0x21, 0x12, 0x0c, 0x08, 0x0b, + 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, 0x20, 0x21, 0x20, 0x05, 0x41, 0xec, + 0x00, 0x6a, 0x10, 0xc0, 0x80, 0x80, 0x80, 0x00, 0x22, 0x21, 0x20, 0x21, + 0xa0, 0x22, 0x21, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x61, 0x0d, 0x00, 0x20, 0x05, 0x20, 0x05, 0x28, 0x02, 0x6c, 0x22, 0x12, + 0x41, 0x7f, 0x6a, 0x36, 0x02, 0x6c, 0x20, 0x1d, 0x41, 0x20, 0x72, 0x22, + 0x25, 0x41, 0xe1, 0x00, 0x47, 0x0d, 0x01, 0x0c, 0x08, 0x0b, 0x20, 0x1d, + 0x41, 0x20, 0x72, 0x22, 0x25, 0x41, 0xe1, 0x00, 0x46, 0x0d, 0x07, 0x41, + 0x06, 0x20, 0x17, 0x20, 0x17, 0x41, 0x00, 0x48, 0x1b, 0x21, 0x1a, 0x20, + 0x05, 0x28, 0x02, 0x6c, 0x21, 0x13, 0x0c, 0x01, 0x0b, 0x20, 0x05, 0x20, + 0x12, 0x41, 0x63, 0x6a, 0x22, 0x13, 0x36, 0x02, 0x6c, 0x41, 0x06, 0x20, + 0x17, 0x20, 0x17, 0x41, 0x00, 0x48, 0x1b, 0x21, 0x1a, 0x20, 0x21, 0x44, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb0, 0x41, 0xa2, 0x21, 0x21, 0x0b, + 0x20, 0x05, 0x41, 0xf0, 0x00, 0x6a, 0x41, 0x00, 0x41, 0xc8, 0x00, 0x20, + 0x13, 0x41, 0x00, 0x48, 0x22, 0x26, 0x1b, 0x41, 0x02, 0x74, 0x22, 0x27, + 0x6a, 0x22, 0x1e, 0x21, 0x14, 0x03, 0x40, 0x02, 0x40, 0x02, 0x40, 0x20, + 0x21, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x41, 0x63, 0x20, + 0x21, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x71, + 0x45, 0x0d, 0x00, 0x20, 0x21, 0xab, 0x21, 0x12, 0x0c, 0x01, 0x0b, 0x41, + 0x00, 0x21, 0x12, 0x0b, 0x20, 0x14, 0x20, 0x12, 0x36, 0x02, 0x00, 0x20, + 0x14, 0x41, 0x04, 0x6a, 0x21, 0x14, 0x20, 0x21, 0x20, 0x12, 0xb8, 0xa1, + 0x44, 0x00, 0x00, 0x00, 0x00, 0x65, 0xcd, 0xcd, 0x41, 0xa2, 0x22, 0x21, + 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x62, 0x0d, 0x00, + 0x0b, 0x02, 0x40, 0x02, 0x40, 0x20, 0x13, 0x41, 0x01, 0x4e, 0x0d, 0x00, + 0x20, 0x14, 0x21, 0x12, 0x20, 0x1e, 0x21, 0x15, 0x0c, 0x01, 0x0b, 0x20, + 0x1e, 0x21, 0x15, 0x03, 0x40, 0x20, 0x13, 0x41, 0x1d, 0x20, 0x13, 0x41, + 0x1d, 0x48, 0x1b, 0x21, 0x13, 0x02, 0x40, 0x20, 0x14, 0x41, 0x7c, 0x6a, + 0x22, 0x12, 0x20, 0x15, 0x49, 0x0d, 0x00, 0x20, 0x13, 0xad, 0x21, 0x20, + 0x42, 0x00, 0x21, 0x1f, 0x03, 0x40, 0x20, 0x12, 0x20, 0x12, 0x35, 0x02, + 0x00, 0x20, 0x20, 0x86, 0x20, 0x1f, 0x42, 0xff, 0xff, 0xff, 0xff, 0x0f, + 0x83, 0x7c, 0x22, 0x1f, 0x20, 0x1f, 0x42, 0x80, 0x94, 0xeb, 0xdc, 0x03, + 0x80, 0x22, 0x1f, 0x42, 0x80, 0x94, 0xeb, 0xdc, 0x03, 0x7e, 0x7d, 0x3e, + 0x02, 0x00, 0x20, 0x12, 0x41, 0x7c, 0x6a, 0x22, 0x12, 0x20, 0x15, 0x4f, + 0x0d, 0x00, 0x0b, 0x20, 0x1f, 0xa7, 0x22, 0x12, 0x45, 0x0d, 0x00, 0x20, + 0x15, 0x41, 0x7c, 0x6a, 0x22, 0x15, 0x20, 0x12, 0x36, 0x02, 0x00, 0x0b, + 0x02, 0x40, 0x03, 0x40, 0x20, 0x14, 0x22, 0x12, 0x20, 0x15, 0x4d, 0x0d, + 0x01, 0x20, 0x12, 0x41, 0x7c, 0x6a, 0x22, 0x14, 0x28, 0x02, 0x00, 0x45, + 0x0d, 0x00, 0x0b, 0x0b, 0x20, 0x05, 0x20, 0x05, 0x28, 0x02, 0x6c, 0x20, + 0x13, 0x6b, 0x22, 0x13, 0x36, 0x02, 0x6c, 0x20, 0x12, 0x21, 0x14, 0x20, + 0x13, 0x41, 0x00, 0x4a, 0x0d, 0x00, 0x0b, 0x0b, 0x02, 0x40, 0x20, 0x13, + 0x41, 0x7f, 0x4a, 0x0d, 0x00, 0x20, 0x1a, 0x41, 0x19, 0x6a, 0x41, 0x09, + 0x6e, 0x41, 0x01, 0x6a, 0x21, 0x28, 0x03, 0x40, 0x41, 0x00, 0x20, 0x13, + 0x6b, 0x22, 0x14, 0x41, 0x09, 0x20, 0x14, 0x41, 0x09, 0x48, 0x1b, 0x21, + 0x17, 0x02, 0x40, 0x02, 0x40, 0x20, 0x15, 0x20, 0x12, 0x49, 0x0d, 0x00, + 0x20, 0x15, 0x28, 0x02, 0x00, 0x21, 0x14, 0x0c, 0x01, 0x0b, 0x41, 0x80, + 0x94, 0xeb, 0xdc, 0x03, 0x20, 0x17, 0x76, 0x21, 0x1c, 0x41, 0x7f, 0x20, + 0x17, 0x74, 0x41, 0x7f, 0x73, 0x21, 0x1b, 0x41, 0x00, 0x21, 0x13, 0x20, + 0x15, 0x21, 0x14, 0x03, 0x40, 0x20, 0x14, 0x20, 0x14, 0x28, 0x02, 0x00, + 0x22, 0x18, 0x20, 0x17, 0x76, 0x20, 0x13, 0x6a, 0x36, 0x02, 0x00, 0x20, + 0x18, 0x20, 0x1b, 0x71, 0x20, 0x1c, 0x6c, 0x21, 0x13, 0x20, 0x14, 0x41, + 0x04, 0x6a, 0x22, 0x14, 0x20, 0x12, 0x49, 0x0d, 0x00, 0x0b, 0x20, 0x15, + 0x28, 0x02, 0x00, 0x21, 0x14, 0x20, 0x13, 0x45, 0x0d, 0x00, 0x20, 0x12, + 0x20, 0x13, 0x36, 0x02, 0x00, 0x20, 0x12, 0x41, 0x04, 0x6a, 0x21, 0x12, + 0x0b, 0x20, 0x05, 0x20, 0x05, 0x28, 0x02, 0x6c, 0x20, 0x17, 0x6a, 0x22, + 0x13, 0x36, 0x02, 0x6c, 0x20, 0x1e, 0x20, 0x15, 0x20, 0x14, 0x45, 0x41, + 0x02, 0x74, 0x6a, 0x22, 0x15, 0x20, 0x25, 0x41, 0xe6, 0x00, 0x46, 0x1b, + 0x22, 0x14, 0x20, 0x28, 0x41, 0x02, 0x74, 0x6a, 0x20, 0x12, 0x20, 0x12, + 0x20, 0x14, 0x6b, 0x41, 0x02, 0x75, 0x20, 0x28, 0x4a, 0x1b, 0x21, 0x12, + 0x20, 0x13, 0x41, 0x00, 0x48, 0x0d, 0x00, 0x0b, 0x0b, 0x41, 0x00, 0x21, + 0x18, 0x02, 0x40, 0x20, 0x15, 0x20, 0x12, 0x4f, 0x0d, 0x00, 0x20, 0x1e, + 0x20, 0x15, 0x6b, 0x41, 0x02, 0x75, 0x41, 0x09, 0x6c, 0x21, 0x18, 0x20, + 0x15, 0x28, 0x02, 0x00, 0x22, 0x13, 0x41, 0x0a, 0x49, 0x0d, 0x00, 0x41, + 0x0a, 0x21, 0x14, 0x03, 0x40, 0x20, 0x18, 0x41, 0x01, 0x6a, 0x21, 0x18, + 0x20, 0x13, 0x20, 0x14, 0x41, 0x0a, 0x6c, 0x22, 0x14, 0x4f, 0x0d, 0x00, + 0x0b, 0x0b, 0x02, 0x40, 0x20, 0x1a, 0x41, 0x00, 0x20, 0x18, 0x20, 0x25, + 0x41, 0xe6, 0x00, 0x46, 0x1b, 0x6b, 0x20, 0x1a, 0x41, 0x00, 0x47, 0x20, + 0x25, 0x41, 0xe7, 0x00, 0x46, 0x22, 0x1b, 0x71, 0x6b, 0x22, 0x14, 0x20, + 0x12, 0x20, 0x1e, 0x6b, 0x41, 0x02, 0x75, 0x41, 0x09, 0x6c, 0x41, 0x77, + 0x6a, 0x4e, 0x0d, 0x00, 0x20, 0x14, 0x41, 0x80, 0xc8, 0x00, 0x6a, 0x22, + 0x13, 0x41, 0x09, 0x6d, 0x22, 0x17, 0x41, 0x02, 0x74, 0x22, 0x29, 0x20, + 0x05, 0x41, 0xf0, 0x00, 0x6a, 0x41, 0x01, 0x41, 0xc9, 0x00, 0x20, 0x26, + 0x1b, 0x41, 0x02, 0x74, 0x22, 0x26, 0x6a, 0x6a, 0x41, 0x80, 0x60, 0x6a, + 0x21, 0x1c, 0x41, 0x0a, 0x21, 0x14, 0x02, 0x40, 0x20, 0x13, 0x20, 0x17, + 0x41, 0x09, 0x6c, 0x6b, 0x22, 0x17, 0x41, 0x07, 0x4a, 0x0d, 0x00, 0x41, + 0x08, 0x20, 0x17, 0x6b, 0x22, 0x28, 0x41, 0x07, 0x71, 0x21, 0x13, 0x41, + 0x0a, 0x21, 0x14, 0x02, 0x40, 0x20, 0x17, 0x41, 0x7f, 0x6a, 0x41, 0x07, + 0x49, 0x0d, 0x00, 0x20, 0x28, 0x41, 0x78, 0x71, 0x21, 0x17, 0x41, 0x0a, + 0x21, 0x14, 0x03, 0x40, 0x20, 0x14, 0x41, 0x80, 0xc2, 0xd7, 0x2f, 0x6c, + 0x21, 0x14, 0x20, 0x17, 0x41, 0x78, 0x6a, 0x22, 0x17, 0x0d, 0x00, 0x0b, + 0x0b, 0x20, 0x13, 0x45, 0x0d, 0x00, 0x03, 0x40, 0x20, 0x14, 0x41, 0x0a, + 0x6c, 0x21, 0x14, 0x20, 0x13, 0x41, 0x7f, 0x6a, 0x22, 0x13, 0x0d, 0x00, + 0x0b, 0x0b, 0x20, 0x1c, 0x41, 0x04, 0x6a, 0x21, 0x28, 0x02, 0x40, 0x02, + 0x40, 0x20, 0x1c, 0x28, 0x02, 0x00, 0x22, 0x13, 0x20, 0x13, 0x20, 0x14, + 0x6e, 0x22, 0x25, 0x20, 0x14, 0x6c, 0x6b, 0x22, 0x17, 0x0d, 0x00, 0x20, + 0x28, 0x20, 0x12, 0x46, 0x0d, 0x01, 0x0b, 0x02, 0x40, 0x02, 0x40, 0x20, + 0x25, 0x41, 0x01, 0x71, 0x0d, 0x00, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x40, 0x43, 0x21, 0x21, 0x20, 0x14, 0x41, 0x80, 0x94, 0xeb, 0xdc, + 0x03, 0x47, 0x0d, 0x01, 0x20, 0x1c, 0x20, 0x15, 0x4d, 0x0d, 0x01, 0x20, + 0x1c, 0x41, 0x7c, 0x6a, 0x2d, 0x00, 0x00, 0x41, 0x01, 0x71, 0x45, 0x0d, + 0x01, 0x0b, 0x44, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x43, 0x21, + 0x21, 0x0b, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x3f, 0x44, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x3f, 0x44, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xf8, 0x3f, 0x20, 0x28, 0x20, 0x12, 0x46, 0x1b, 0x44, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x3f, 0x20, 0x17, 0x20, 0x14, + 0x41, 0x01, 0x76, 0x22, 0x28, 0x46, 0x1b, 0x20, 0x17, 0x20, 0x28, 0x49, + 0x1b, 0x21, 0x2a, 0x02, 0x40, 0x20, 0x23, 0x0d, 0x00, 0x20, 0x24, 0x2d, + 0x00, 0x00, 0x41, 0x2d, 0x47, 0x0d, 0x00, 0x20, 0x2a, 0x9a, 0x21, 0x2a, + 0x20, 0x21, 0x9a, 0x21, 0x21, 0x0b, 0x20, 0x1c, 0x20, 0x13, 0x20, 0x17, + 0x6b, 0x22, 0x13, 0x36, 0x02, 0x00, 0x20, 0x21, 0x20, 0x2a, 0xa0, 0x20, + 0x21, 0x61, 0x0d, 0x00, 0x20, 0x1c, 0x20, 0x13, 0x20, 0x14, 0x6a, 0x22, + 0x14, 0x36, 0x02, 0x00, 0x02, 0x40, 0x20, 0x14, 0x41, 0x80, 0x94, 0xeb, + 0xdc, 0x03, 0x49, 0x0d, 0x00, 0x20, 0x08, 0x20, 0x26, 0x20, 0x29, 0x6a, + 0x6a, 0x21, 0x14, 0x03, 0x40, 0x20, 0x14, 0x41, 0x04, 0x6a, 0x41, 0x00, + 0x36, 0x02, 0x00, 0x02, 0x40, 0x20, 0x14, 0x20, 0x15, 0x4f, 0x0d, 0x00, + 0x20, 0x15, 0x41, 0x7c, 0x6a, 0x22, 0x15, 0x41, 0x00, 0x36, 0x02, 0x00, + 0x0b, 0x20, 0x14, 0x20, 0x14, 0x28, 0x02, 0x00, 0x41, 0x01, 0x6a, 0x22, + 0x13, 0x36, 0x02, 0x00, 0x20, 0x14, 0x41, 0x7c, 0x6a, 0x21, 0x14, 0x20, + 0x13, 0x41, 0xff, 0x93, 0xeb, 0xdc, 0x03, 0x4b, 0x0d, 0x00, 0x0b, 0x20, + 0x14, 0x41, 0x04, 0x6a, 0x21, 0x1c, 0x0b, 0x20, 0x1e, 0x20, 0x15, 0x6b, + 0x41, 0x02, 0x75, 0x41, 0x09, 0x6c, 0x21, 0x18, 0x20, 0x15, 0x28, 0x02, + 0x00, 0x22, 0x13, 0x41, 0x0a, 0x49, 0x0d, 0x00, 0x41, 0x0a, 0x21, 0x14, + 0x03, 0x40, 0x20, 0x18, 0x41, 0x01, 0x6a, 0x21, 0x18, 0x20, 0x13, 0x20, + 0x14, 0x41, 0x0a, 0x6c, 0x22, 0x14, 0x4f, 0x0d, 0x00, 0x0b, 0x0b, 0x20, + 0x1c, 0x41, 0x04, 0x6a, 0x22, 0x14, 0x20, 0x12, 0x20, 0x12, 0x20, 0x14, + 0x4b, 0x1b, 0x21, 0x12, 0x0b, 0x20, 0x07, 0x20, 0x12, 0x6a, 0x20, 0x27, + 0x6b, 0x21, 0x14, 0x02, 0x40, 0x03, 0x40, 0x20, 0x14, 0x21, 0x13, 0x20, + 0x12, 0x22, 0x1c, 0x20, 0x15, 0x4d, 0x22, 0x17, 0x0d, 0x01, 0x20, 0x13, + 0x41, 0x7c, 0x6a, 0x21, 0x14, 0x20, 0x1c, 0x41, 0x7c, 0x6a, 0x22, 0x12, + 0x28, 0x02, 0x00, 0x45, 0x0d, 0x00, 0x0b, 0x0b, 0x02, 0x40, 0x02, 0x40, + 0x20, 0x1b, 0x0d, 0x00, 0x20, 0x16, 0x41, 0x08, 0x71, 0x21, 0x28, 0x0c, + 0x01, 0x0b, 0x20, 0x18, 0x41, 0x7f, 0x73, 0x41, 0x7f, 0x20, 0x1a, 0x41, + 0x01, 0x20, 0x1a, 0x1b, 0x22, 0x12, 0x20, 0x18, 0x4a, 0x20, 0x18, 0x41, + 0x7b, 0x4a, 0x71, 0x22, 0x14, 0x1b, 0x20, 0x12, 0x6a, 0x21, 0x1a, 0x41, + 0x7f, 0x41, 0x7e, 0x20, 0x14, 0x1b, 0x20, 0x1d, 0x6a, 0x21, 0x1d, 0x20, + 0x16, 0x41, 0x08, 0x71, 0x22, 0x28, 0x0d, 0x00, 0x41, 0x77, 0x21, 0x12, + 0x02, 0x40, 0x20, 0x17, 0x0d, 0x00, 0x20, 0x1c, 0x41, 0x7c, 0x6a, 0x28, + 0x02, 0x00, 0x22, 0x17, 0x45, 0x0d, 0x00, 0x41, 0x00, 0x21, 0x12, 0x20, + 0x17, 0x41, 0x0a, 0x70, 0x0d, 0x00, 0x41, 0x0a, 0x21, 0x14, 0x41, 0x00, + 0x21, 0x12, 0x03, 0x40, 0x20, 0x12, 0x41, 0x7f, 0x6a, 0x21, 0x12, 0x20, + 0x17, 0x20, 0x14, 0x41, 0x0a, 0x6c, 0x22, 0x14, 0x70, 0x45, 0x0d, 0x00, + 0x0b, 0x0b, 0x20, 0x13, 0x41, 0x02, 0x75, 0x41, 0x09, 0x6c, 0x21, 0x14, + 0x02, 0x40, 0x20, 0x1d, 0x41, 0x5f, 0x71, 0x41, 0xc6, 0x00, 0x47, 0x0d, + 0x00, 0x41, 0x00, 0x21, 0x28, 0x20, 0x1a, 0x20, 0x14, 0x20, 0x12, 0x6a, + 0x41, 0x77, 0x6a, 0x22, 0x12, 0x41, 0x00, 0x20, 0x12, 0x41, 0x00, 0x4a, + 0x1b, 0x22, 0x12, 0x20, 0x1a, 0x20, 0x12, 0x48, 0x1b, 0x21, 0x1a, 0x0c, + 0x01, 0x0b, 0x41, 0x00, 0x21, 0x28, 0x20, 0x1a, 0x20, 0x18, 0x20, 0x14, + 0x6a, 0x20, 0x12, 0x6a, 0x41, 0x77, 0x6a, 0x22, 0x12, 0x41, 0x00, 0x20, + 0x12, 0x41, 0x00, 0x4a, 0x1b, 0x22, 0x12, 0x20, 0x1a, 0x20, 0x12, 0x48, + 0x1b, 0x21, 0x1a, 0x0b, 0x20, 0x1a, 0x41, 0xfd, 0xff, 0xff, 0xff, 0x07, + 0x41, 0xfe, 0xff, 0xff, 0xff, 0x07, 0x20, 0x1a, 0x20, 0x28, 0x72, 0x22, + 0x23, 0x1b, 0x4a, 0x0d, 0x08, 0x20, 0x1a, 0x20, 0x23, 0x41, 0x00, 0x47, + 0x6a, 0x41, 0x01, 0x6a, 0x21, 0x25, 0x02, 0x40, 0x02, 0x40, 0x20, 0x1d, + 0x41, 0x5f, 0x71, 0x41, 0xc6, 0x00, 0x47, 0x22, 0x26, 0x0d, 0x00, 0x20, + 0x18, 0x20, 0x25, 0x41, 0xff, 0xff, 0xff, 0xff, 0x07, 0x73, 0x4a, 0x0d, + 0x0a, 0x20, 0x18, 0x41, 0x00, 0x20, 0x18, 0x41, 0x00, 0x4a, 0x1b, 0x21, + 0x12, 0x0c, 0x01, 0x0b, 0x02, 0x40, 0x02, 0x40, 0x20, 0x18, 0x0d, 0x00, + 0x20, 0x06, 0x21, 0x13, 0x20, 0x06, 0x21, 0x14, 0x0c, 0x01, 0x0b, 0x20, + 0x18, 0x20, 0x18, 0x41, 0x1f, 0x75, 0x22, 0x12, 0x73, 0x20, 0x12, 0x6b, + 0x21, 0x12, 0x20, 0x06, 0x21, 0x13, 0x20, 0x06, 0x21, 0x14, 0x03, 0x40, + 0x20, 0x14, 0x41, 0x7f, 0x6a, 0x22, 0x14, 0x20, 0x12, 0x20, 0x12, 0x41, + 0x0a, 0x6e, 0x22, 0x17, 0x41, 0x0a, 0x6c, 0x6b, 0x41, 0x30, 0x72, 0x3a, + 0x00, 0x00, 0x20, 0x13, 0x41, 0x7f, 0x6a, 0x21, 0x13, 0x20, 0x12, 0x41, + 0x09, 0x4b, 0x21, 0x1b, 0x20, 0x17, 0x21, 0x12, 0x20, 0x1b, 0x0d, 0x00, + 0x0b, 0x0b, 0x02, 0x40, 0x20, 0x06, 0x20, 0x13, 0x6b, 0x41, 0x01, 0x4a, + 0x0d, 0x00, 0x20, 0x14, 0x20, 0x0e, 0x20, 0x13, 0x6b, 0x6a, 0x22, 0x14, + 0x41, 0x30, 0x20, 0x13, 0x20, 0x05, 0x41, 0xc4, 0x00, 0x6a, 0x6b, 0x41, + 0x76, 0x6a, 0x10, 0xa9, 0x80, 0x80, 0x80, 0x00, 0x1a, 0x0b, 0x20, 0x14, + 0x41, 0x7e, 0x6a, 0x22, 0x27, 0x20, 0x1d, 0x3a, 0x00, 0x00, 0x20, 0x14, + 0x41, 0x7f, 0x6a, 0x41, 0x2d, 0x41, 0x2b, 0x20, 0x18, 0x41, 0x00, 0x48, + 0x1b, 0x3a, 0x00, 0x00, 0x20, 0x06, 0x20, 0x27, 0x6b, 0x22, 0x12, 0x20, + 0x25, 0x41, 0xff, 0xff, 0xff, 0xff, 0x07, 0x73, 0x4a, 0x0d, 0x09, 0x0b, + 0x20, 0x12, 0x20, 0x25, 0x6a, 0x22, 0x12, 0x20, 0x22, 0x41, 0xff, 0xff, + 0xff, 0xff, 0x07, 0x73, 0x4a, 0x0d, 0x08, 0x20, 0x12, 0x20, 0x22, 0x6a, + 0x21, 0x1b, 0x02, 0x40, 0x20, 0x16, 0x41, 0x80, 0xc0, 0x04, 0x71, 0x22, + 0x16, 0x0d, 0x00, 0x20, 0x19, 0x20, 0x1b, 0x4c, 0x0d, 0x00, 0x20, 0x05, + 0x41, 0xf0, 0x04, 0x6a, 0x41, 0x20, 0x20, 0x19, 0x20, 0x1b, 0x6b, 0x22, + 0x12, 0x41, 0x80, 0x02, 0x20, 0x12, 0x41, 0x80, 0x02, 0x49, 0x22, 0x14, + 0x1b, 0x10, 0xa9, 0x80, 0x80, 0x80, 0x00, 0x1a, 0x02, 0x40, 0x20, 0x14, + 0x0d, 0x00, 0x03, 0x40, 0x02, 0x40, 0x20, 0x00, 0x2d, 0x00, 0x00, 0x41, + 0x20, 0x71, 0x0d, 0x00, 0x20, 0x05, 0x41, 0xf0, 0x04, 0x6a, 0x41, 0x80, + 0x02, 0x20, 0x00, 0x10, 0xb7, 0x80, 0x80, 0x80, 0x00, 0x1a, 0x0b, 0x20, + 0x12, 0x41, 0x80, 0x7e, 0x6a, 0x22, 0x12, 0x41, 0xff, 0x01, 0x4b, 0x0d, + 0x00, 0x0b, 0x0b, 0x20, 0x00, 0x2d, 0x00, 0x00, 0x41, 0x20, 0x71, 0x0d, + 0x00, 0x20, 0x05, 0x41, 0xf0, 0x04, 0x6a, 0x20, 0x12, 0x20, 0x00, 0x10, + 0xb7, 0x80, 0x80, 0x80, 0x00, 0x1a, 0x0b, 0x02, 0x40, 0x20, 0x00, 0x2d, + 0x00, 0x00, 0x41, 0x20, 0x71, 0x0d, 0x00, 0x20, 0x24, 0x20, 0x22, 0x20, + 0x00, 0x10, 0xb7, 0x80, 0x80, 0x80, 0x00, 0x1a, 0x0b, 0x02, 0x40, 0x20, + 0x16, 0x41, 0x80, 0x80, 0x04, 0x47, 0x0d, 0x00, 0x20, 0x19, 0x20, 0x1b, + 0x4c, 0x0d, 0x00, 0x20, 0x05, 0x41, 0xf0, 0x04, 0x6a, 0x41, 0x30, 0x20, + 0x19, 0x20, 0x1b, 0x6b, 0x22, 0x12, 0x41, 0x80, 0x02, 0x20, 0x12, 0x41, + 0x80, 0x02, 0x49, 0x22, 0x14, 0x1b, 0x10, 0xa9, 0x80, 0x80, 0x80, 0x00, + 0x1a, 0x02, 0x40, 0x20, 0x14, 0x0d, 0x00, 0x03, 0x40, 0x02, 0x40, 0x20, + 0x00, 0x2d, 0x00, 0x00, 0x41, 0x20, 0x71, 0x0d, 0x00, 0x20, 0x05, 0x41, + 0xf0, 0x04, 0x6a, 0x41, 0x80, 0x02, 0x20, 0x00, 0x10, 0xb7, 0x80, 0x80, + 0x80, 0x00, 0x1a, 0x0b, 0x20, 0x12, 0x41, 0x80, 0x7e, 0x6a, 0x22, 0x12, + 0x41, 0xff, 0x01, 0x4b, 0x0d, 0x00, 0x0b, 0x0b, 0x20, 0x00, 0x2d, 0x00, + 0x00, 0x41, 0x20, 0x71, 0x0d, 0x00, 0x20, 0x05, 0x41, 0xf0, 0x04, 0x6a, + 0x20, 0x12, 0x20, 0x00, 0x10, 0xb7, 0x80, 0x80, 0x80, 0x00, 0x1a, 0x0b, + 0x20, 0x26, 0x0d, 0x03, 0x20, 0x1e, 0x20, 0x15, 0x20, 0x15, 0x20, 0x1e, + 0x4b, 0x1b, 0x22, 0x18, 0x21, 0x17, 0x03, 0x40, 0x02, 0x40, 0x02, 0x40, + 0x02, 0x40, 0x02, 0x40, 0x20, 0x17, 0x28, 0x02, 0x00, 0x22, 0x12, 0x45, + 0x0d, 0x00, 0x41, 0x08, 0x21, 0x14, 0x03, 0x40, 0x20, 0x05, 0x41, 0xd0, + 0x00, 0x6a, 0x20, 0x14, 0x6a, 0x20, 0x12, 0x20, 0x12, 0x41, 0x0a, 0x6e, + 0x22, 0x15, 0x41, 0x0a, 0x6c, 0x6b, 0x41, 0x30, 0x72, 0x3a, 0x00, 0x00, + 0x20, 0x14, 0x41, 0x7f, 0x6a, 0x21, 0x14, 0x20, 0x12, 0x41, 0x09, 0x4b, + 0x21, 0x13, 0x20, 0x15, 0x21, 0x12, 0x20, 0x13, 0x0d, 0x00, 0x0b, 0x20, + 0x14, 0x41, 0x01, 0x6a, 0x22, 0x15, 0x20, 0x05, 0x41, 0xd0, 0x00, 0x6a, + 0x6a, 0x21, 0x12, 0x02, 0x40, 0x20, 0x17, 0x20, 0x18, 0x46, 0x0d, 0x00, + 0x20, 0x14, 0x41, 0x02, 0x6a, 0x41, 0x02, 0x48, 0x0d, 0x04, 0x0c, 0x03, + 0x0b, 0x20, 0x14, 0x41, 0x08, 0x47, 0x0d, 0x03, 0x0c, 0x01, 0x0b, 0x41, + 0x09, 0x21, 0x15, 0x20, 0x17, 0x20, 0x18, 0x47, 0x0d, 0x01, 0x0b, 0x20, + 0x05, 0x41, 0x30, 0x3a, 0x00, 0x58, 0x20, 0x0c, 0x21, 0x12, 0x0c, 0x01, + 0x0b, 0x20, 0x05, 0x41, 0xd0, 0x00, 0x6a, 0x20, 0x0b, 0x20, 0x15, 0x6a, + 0x22, 0x12, 0x20, 0x05, 0x41, 0xd0, 0x00, 0x6a, 0x20, 0x12, 0x49, 0x1b, + 0x22, 0x12, 0x41, 0x30, 0x20, 0x15, 0x20, 0x05, 0x41, 0xd0, 0x00, 0x6a, + 0x6a, 0x20, 0x12, 0x6b, 0x10, 0xa9, 0x80, 0x80, 0x80, 0x00, 0x1a, 0x0b, + 0x02, 0x40, 0x20, 0x00, 0x2d, 0x00, 0x00, 0x41, 0x20, 0x71, 0x0d, 0x00, + 0x20, 0x12, 0x20, 0x0d, 0x20, 0x12, 0x6b, 0x20, 0x00, 0x10, 0xb7, 0x80, + 0x80, 0x80, 0x00, 0x1a, 0x0b, 0x20, 0x17, 0x41, 0x04, 0x6a, 0x22, 0x17, + 0x20, 0x1e, 0x4d, 0x0d, 0x00, 0x0b, 0x02, 0x40, 0x20, 0x23, 0x45, 0x0d, + 0x00, 0x20, 0x00, 0x2d, 0x00, 0x00, 0x41, 0x20, 0x71, 0x0d, 0x00, 0x41, + 0xfc, 0x95, 0x80, 0x80, 0x00, 0x41, 0x01, 0x20, 0x00, 0x10, 0xb7, 0x80, + 0x80, 0x80, 0x00, 0x1a, 0x0b, 0x02, 0x40, 0x02, 0x40, 0x20, 0x1a, 0x41, + 0x01, 0x4e, 0x0d, 0x00, 0x20, 0x1a, 0x21, 0x12, 0x0c, 0x01, 0x0b, 0x02, + 0x40, 0x20, 0x17, 0x20, 0x1c, 0x49, 0x0d, 0x00, 0x20, 0x1a, 0x21, 0x12, + 0x0c, 0x01, 0x0b, 0x03, 0x40, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, 0x20, + 0x17, 0x28, 0x02, 0x00, 0x22, 0x12, 0x0d, 0x00, 0x20, 0x0d, 0x21, 0x14, + 0x20, 0x0d, 0x21, 0x15, 0x0c, 0x01, 0x0b, 0x20, 0x0d, 0x21, 0x15, 0x20, + 0x0d, 0x21, 0x14, 0x03, 0x40, 0x20, 0x14, 0x41, 0x7f, 0x6a, 0x22, 0x14, + 0x20, 0x12, 0x20, 0x12, 0x41, 0x0a, 0x6e, 0x22, 0x13, 0x41, 0x0a, 0x6c, + 0x6b, 0x41, 0x30, 0x72, 0x3a, 0x00, 0x00, 0x20, 0x15, 0x41, 0x7f, 0x6a, + 0x21, 0x15, 0x20, 0x12, 0x41, 0x09, 0x4b, 0x21, 0x18, 0x20, 0x13, 0x21, + 0x12, 0x20, 0x18, 0x0d, 0x00, 0x0b, 0x20, 0x14, 0x20, 0x05, 0x41, 0xd0, + 0x00, 0x6a, 0x4d, 0x0d, 0x01, 0x0b, 0x20, 0x14, 0x20, 0x05, 0x41, 0xd0, + 0x00, 0x6a, 0x6a, 0x20, 0x15, 0x6b, 0x22, 0x14, 0x41, 0x30, 0x20, 0x15, + 0x20, 0x05, 0x41, 0xd0, 0x00, 0x6a, 0x6b, 0x10, 0xa9, 0x80, 0x80, 0x80, + 0x00, 0x1a, 0x0b, 0x02, 0x40, 0x20, 0x00, 0x2d, 0x00, 0x00, 0x41, 0x20, + 0x71, 0x0d, 0x00, 0x20, 0x14, 0x20, 0x1a, 0x41, 0x09, 0x20, 0x1a, 0x41, + 0x09, 0x48, 0x1b, 0x20, 0x00, 0x10, 0xb7, 0x80, 0x80, 0x80, 0x00, 0x1a, + 0x0b, 0x20, 0x1a, 0x41, 0x77, 0x6a, 0x21, 0x12, 0x20, 0x17, 0x41, 0x04, + 0x6a, 0x22, 0x17, 0x20, 0x1c, 0x4f, 0x0d, 0x01, 0x20, 0x1a, 0x41, 0x09, + 0x4a, 0x21, 0x14, 0x20, 0x12, 0x21, 0x1a, 0x20, 0x14, 0x0d, 0x00, 0x0b, + 0x0b, 0x20, 0x00, 0x41, 0x30, 0x20, 0x12, 0x41, 0x09, 0x6a, 0x41, 0x09, + 0x41, 0x00, 0x10, 0xc5, 0x80, 0x80, 0x80, 0x00, 0x0c, 0x04, 0x0b, 0x41, + 0xb4, 0x9e, 0x80, 0x80, 0x00, 0x41, 0x1c, 0x36, 0x02, 0x00, 0x0c, 0x08, + 0x0b, 0x41, 0x00, 0x21, 0x1b, 0x41, 0xaa, 0x95, 0x80, 0x80, 0x00, 0x21, + 0x1e, 0x20, 0x0f, 0x21, 0x12, 0x20, 0x16, 0x21, 0x1c, 0x20, 0x17, 0x21, + 0x18, 0x0b, 0x20, 0x18, 0x20, 0x12, 0x20, 0x13, 0x6b, 0x22, 0x17, 0x20, + 0x18, 0x20, 0x17, 0x4a, 0x1b, 0x22, 0x1a, 0x20, 0x1b, 0x41, 0xff, 0xff, + 0xff, 0xff, 0x07, 0x73, 0x4a, 0x0d, 0x05, 0x20, 0x19, 0x20, 0x1b, 0x20, + 0x1a, 0x6a, 0x22, 0x15, 0x20, 0x19, 0x20, 0x15, 0x4a, 0x1b, 0x22, 0x12, + 0x20, 0x14, 0x4a, 0x0d, 0x05, 0x02, 0x40, 0x20, 0x1c, 0x41, 0x80, 0xc0, + 0x04, 0x71, 0x22, 0x1c, 0x0d, 0x00, 0x20, 0x15, 0x20, 0x19, 0x4e, 0x0d, + 0x00, 0x20, 0x05, 0x41, 0xf0, 0x00, 0x6a, 0x41, 0x20, 0x20, 0x12, 0x20, + 0x15, 0x6b, 0x22, 0x14, 0x41, 0x80, 0x02, 0x20, 0x14, 0x41, 0x80, 0x02, + 0x49, 0x22, 0x16, 0x1b, 0x10, 0xa9, 0x80, 0x80, 0x80, 0x00, 0x1a, 0x02, + 0x40, 0x20, 0x16, 0x0d, 0x00, 0x03, 0x40, 0x02, 0x40, 0x20, 0x00, 0x2d, + 0x00, 0x00, 0x41, 0x20, 0x71, 0x0d, 0x00, 0x20, 0x05, 0x41, 0xf0, 0x00, + 0x6a, 0x41, 0x80, 0x02, 0x20, 0x00, 0x10, 0xb7, 0x80, 0x80, 0x80, 0x00, + 0x1a, 0x0b, 0x20, 0x14, 0x41, 0x80, 0x7e, 0x6a, 0x22, 0x14, 0x41, 0xff, + 0x01, 0x4b, 0x0d, 0x00, 0x0b, 0x0b, 0x20, 0x00, 0x2d, 0x00, 0x00, 0x41, + 0x20, 0x71, 0x0d, 0x00, 0x20, 0x05, 0x41, 0xf0, 0x00, 0x6a, 0x20, 0x14, + 0x20, 0x00, 0x10, 0xb7, 0x80, 0x80, 0x80, 0x00, 0x1a, 0x0b, 0x02, 0x40, + 0x20, 0x00, 0x2d, 0x00, 0x00, 0x41, 0x20, 0x71, 0x0d, 0x00, 0x20, 0x1e, + 0x20, 0x1b, 0x20, 0x00, 0x10, 0xb7, 0x80, 0x80, 0x80, 0x00, 0x1a, 0x0b, + 0x02, 0x40, 0x20, 0x1c, 0x41, 0x80, 0x80, 0x04, 0x47, 0x0d, 0x00, 0x20, + 0x15, 0x20, 0x19, 0x4e, 0x0d, 0x00, 0x20, 0x05, 0x41, 0xf0, 0x00, 0x6a, + 0x41, 0x30, 0x20, 0x12, 0x20, 0x15, 0x6b, 0x22, 0x14, 0x41, 0x80, 0x02, + 0x20, 0x14, 0x41, 0x80, 0x02, 0x49, 0x22, 0x1b, 0x1b, 0x10, 0xa9, 0x80, + 0x80, 0x80, 0x00, 0x1a, 0x02, 0x40, 0x20, 0x1b, 0x0d, 0x00, 0x03, 0x40, + 0x02, 0x40, 0x20, 0x00, 0x2d, 0x00, 0x00, 0x41, 0x20, 0x71, 0x0d, 0x00, + 0x20, 0x05, 0x41, 0xf0, 0x00, 0x6a, 0x41, 0x80, 0x02, 0x20, 0x00, 0x10, + 0xb7, 0x80, 0x80, 0x80, 0x00, 0x1a, 0x0b, 0x20, 0x14, 0x41, 0x80, 0x7e, + 0x6a, 0x22, 0x14, 0x41, 0xff, 0x01, 0x4b, 0x0d, 0x00, 0x0b, 0x0b, 0x20, + 0x00, 0x2d, 0x00, 0x00, 0x41, 0x20, 0x71, 0x0d, 0x00, 0x20, 0x05, 0x41, + 0xf0, 0x00, 0x6a, 0x20, 0x14, 0x20, 0x00, 0x10, 0xb7, 0x80, 0x80, 0x80, + 0x00, 0x1a, 0x0b, 0x02, 0x40, 0x20, 0x17, 0x20, 0x18, 0x4e, 0x0d, 0x00, + 0x20, 0x05, 0x41, 0xf0, 0x00, 0x6a, 0x41, 0x30, 0x20, 0x1a, 0x20, 0x17, + 0x6b, 0x22, 0x14, 0x41, 0x80, 0x02, 0x20, 0x14, 0x41, 0x80, 0x02, 0x49, + 0x22, 0x18, 0x1b, 0x10, 0xa9, 0x80, 0x80, 0x80, 0x00, 0x1a, 0x02, 0x40, + 0x20, 0x18, 0x0d, 0x00, 0x03, 0x40, 0x02, 0x40, 0x20, 0x00, 0x2d, 0x00, + 0x00, 0x41, 0x20, 0x71, 0x0d, 0x00, 0x20, 0x05, 0x41, 0xf0, 0x00, 0x6a, + 0x41, 0x80, 0x02, 0x20, 0x00, 0x10, 0xb7, 0x80, 0x80, 0x80, 0x00, 0x1a, + 0x0b, 0x20, 0x14, 0x41, 0x80, 0x7e, 0x6a, 0x22, 0x14, 0x41, 0xff, 0x01, + 0x4b, 0x0d, 0x00, 0x0b, 0x0b, 0x20, 0x00, 0x2d, 0x00, 0x00, 0x41, 0x20, + 0x71, 0x0d, 0x00, 0x20, 0x05, 0x41, 0xf0, 0x00, 0x6a, 0x20, 0x14, 0x20, + 0x00, 0x10, 0xb7, 0x80, 0x80, 0x80, 0x00, 0x1a, 0x0b, 0x02, 0x40, 0x20, + 0x00, 0x2d, 0x00, 0x00, 0x41, 0x20, 0x71, 0x0d, 0x00, 0x20, 0x13, 0x20, + 0x17, 0x20, 0x00, 0x10, 0xb7, 0x80, 0x80, 0x80, 0x00, 0x1a, 0x0b, 0x20, + 0x1c, 0x41, 0x80, 0xc0, 0x00, 0x47, 0x0d, 0x04, 0x20, 0x15, 0x20, 0x19, + 0x4e, 0x0d, 0x04, 0x20, 0x05, 0x41, 0xf0, 0x00, 0x6a, 0x41, 0x20, 0x20, + 0x12, 0x20, 0x15, 0x6b, 0x22, 0x14, 0x41, 0x80, 0x02, 0x20, 0x14, 0x41, + 0x80, 0x02, 0x49, 0x22, 0x15, 0x1b, 0x10, 0xa9, 0x80, 0x80, 0x80, 0x00, + 0x1a, 0x02, 0x40, 0x20, 0x15, 0x0d, 0x00, 0x03, 0x40, 0x02, 0x40, 0x20, + 0x00, 0x2d, 0x00, 0x00, 0x41, 0x20, 0x71, 0x0d, 0x00, 0x20, 0x05, 0x41, + 0xf0, 0x00, 0x6a, 0x41, 0x80, 0x02, 0x20, 0x00, 0x10, 0xb7, 0x80, 0x80, + 0x80, 0x00, 0x1a, 0x0b, 0x20, 0x14, 0x41, 0x80, 0x7e, 0x6a, 0x22, 0x14, + 0x41, 0xff, 0x01, 0x4b, 0x0d, 0x00, 0x0b, 0x0b, 0x20, 0x00, 0x2d, 0x00, + 0x00, 0x41, 0x20, 0x71, 0x0d, 0x04, 0x20, 0x05, 0x41, 0xf0, 0x00, 0x6a, + 0x20, 0x14, 0x20, 0x00, 0x10, 0xb7, 0x80, 0x80, 0x80, 0x00, 0x1a, 0x0c, + 0x04, 0x0b, 0x02, 0x40, 0x20, 0x1a, 0x41, 0x00, 0x48, 0x0d, 0x00, 0x20, + 0x1c, 0x20, 0x15, 0x41, 0x04, 0x6a, 0x20, 0x1c, 0x20, 0x15, 0x4b, 0x1b, + 0x21, 0x1c, 0x20, 0x15, 0x21, 0x17, 0x03, 0x40, 0x02, 0x40, 0x02, 0x40, + 0x20, 0x17, 0x28, 0x02, 0x00, 0x22, 0x12, 0x45, 0x0d, 0x00, 0x41, 0x00, + 0x21, 0x14, 0x03, 0x40, 0x20, 0x05, 0x41, 0xd0, 0x00, 0x6a, 0x20, 0x14, + 0x6a, 0x41, 0x08, 0x6a, 0x20, 0x12, 0x20, 0x12, 0x41, 0x0a, 0x6e, 0x22, + 0x13, 0x41, 0x0a, 0x6c, 0x6b, 0x41, 0x30, 0x72, 0x3a, 0x00, 0x00, 0x20, + 0x14, 0x41, 0x7f, 0x6a, 0x21, 0x14, 0x20, 0x12, 0x41, 0x09, 0x4b, 0x21, + 0x18, 0x20, 0x13, 0x21, 0x12, 0x20, 0x18, 0x0d, 0x00, 0x0b, 0x20, 0x14, + 0x45, 0x0d, 0x00, 0x20, 0x05, 0x41, 0xd0, 0x00, 0x6a, 0x20, 0x14, 0x6a, + 0x41, 0x09, 0x6a, 0x21, 0x12, 0x0c, 0x01, 0x0b, 0x20, 0x05, 0x41, 0x30, + 0x3a, 0x00, 0x58, 0x20, 0x0c, 0x21, 0x12, 0x0b, 0x02, 0x40, 0x02, 0x40, + 0x20, 0x17, 0x20, 0x15, 0x46, 0x0d, 0x00, 0x20, 0x12, 0x20, 0x05, 0x41, + 0xd0, 0x00, 0x6a, 0x4d, 0x0d, 0x01, 0x20, 0x05, 0x41, 0xd0, 0x00, 0x6a, + 0x41, 0x30, 0x20, 0x12, 0x20, 0x05, 0x41, 0xd0, 0x00, 0x6a, 0x6b, 0x10, + 0xa9, 0x80, 0x80, 0x80, 0x00, 0x1a, 0x20, 0x05, 0x41, 0xd0, 0x00, 0x6a, + 0x21, 0x12, 0x0c, 0x01, 0x0b, 0x02, 0x40, 0x20, 0x00, 0x2d, 0x00, 0x00, + 0x41, 0x20, 0x71, 0x0d, 0x00, 0x20, 0x12, 0x41, 0x01, 0x20, 0x00, 0x10, + 0xb7, 0x80, 0x80, 0x80, 0x00, 0x1a, 0x0b, 0x20, 0x12, 0x41, 0x01, 0x6a, + 0x21, 0x12, 0x02, 0x40, 0x20, 0x28, 0x0d, 0x00, 0x20, 0x1a, 0x41, 0x01, + 0x48, 0x0d, 0x01, 0x0b, 0x20, 0x00, 0x2d, 0x00, 0x00, 0x41, 0x20, 0x71, + 0x0d, 0x00, 0x41, 0xfc, 0x95, 0x80, 0x80, 0x00, 0x41, 0x01, 0x20, 0x00, + 0x10, 0xb7, 0x80, 0x80, 0x80, 0x00, 0x1a, 0x0b, 0x20, 0x0d, 0x20, 0x12, + 0x6b, 0x21, 0x14, 0x02, 0x40, 0x20, 0x00, 0x2d, 0x00, 0x00, 0x41, 0x20, + 0x71, 0x0d, 0x00, 0x20, 0x12, 0x20, 0x14, 0x20, 0x1a, 0x20, 0x14, 0x20, + 0x1a, 0x48, 0x1b, 0x20, 0x00, 0x10, 0xb7, 0x80, 0x80, 0x80, 0x00, 0x1a, + 0x0b, 0x20, 0x1a, 0x20, 0x14, 0x6b, 0x21, 0x1a, 0x20, 0x17, 0x41, 0x04, + 0x6a, 0x22, 0x17, 0x20, 0x1c, 0x4f, 0x0d, 0x01, 0x20, 0x1a, 0x41, 0x7f, + 0x4a, 0x0d, 0x00, 0x0b, 0x0b, 0x20, 0x00, 0x41, 0x30, 0x20, 0x1a, 0x41, + 0x12, 0x6a, 0x41, 0x12, 0x41, 0x00, 0x10, 0xc5, 0x80, 0x80, 0x80, 0x00, + 0x20, 0x00, 0x2d, 0x00, 0x00, 0x41, 0x20, 0x71, 0x0d, 0x00, 0x20, 0x27, + 0x20, 0x06, 0x20, 0x27, 0x6b, 0x20, 0x00, 0x10, 0xb7, 0x80, 0x80, 0x80, + 0x00, 0x1a, 0x0b, 0x20, 0x16, 0x41, 0x80, 0xc0, 0x00, 0x47, 0x0d, 0x01, + 0x20, 0x19, 0x20, 0x1b, 0x4c, 0x0d, 0x01, 0x20, 0x05, 0x41, 0xf0, 0x04, + 0x6a, 0x41, 0x20, 0x20, 0x19, 0x20, 0x1b, 0x6b, 0x22, 0x12, 0x41, 0x80, + 0x02, 0x20, 0x12, 0x41, 0x80, 0x02, 0x49, 0x22, 0x14, 0x1b, 0x10, 0xa9, + 0x80, 0x80, 0x80, 0x00, 0x1a, 0x02, 0x40, 0x20, 0x14, 0x0d, 0x00, 0x03, + 0x40, 0x02, 0x40, 0x20, 0x00, 0x2d, 0x00, 0x00, 0x41, 0x20, 0x71, 0x0d, + 0x00, 0x20, 0x05, 0x41, 0xf0, 0x04, 0x6a, 0x41, 0x80, 0x02, 0x20, 0x00, + 0x10, 0xb7, 0x80, 0x80, 0x80, 0x00, 0x1a, 0x0b, 0x20, 0x12, 0x41, 0x80, + 0x7e, 0x6a, 0x22, 0x12, 0x41, 0xff, 0x01, 0x4b, 0x0d, 0x00, 0x0b, 0x0b, + 0x20, 0x00, 0x2d, 0x00, 0x00, 0x41, 0x20, 0x71, 0x0d, 0x01, 0x20, 0x05, + 0x41, 0xf0, 0x04, 0x6a, 0x20, 0x12, 0x20, 0x00, 0x10, 0xb7, 0x80, 0x80, + 0x80, 0x00, 0x1a, 0x0c, 0x01, 0x0b, 0x20, 0x24, 0x20, 0x1d, 0x41, 0x1a, + 0x74, 0x41, 0x1f, 0x75, 0x41, 0x09, 0x71, 0x6a, 0x21, 0x1e, 0x02, 0x40, + 0x20, 0x17, 0x41, 0x0b, 0x4b, 0x0d, 0x00, 0x02, 0x40, 0x02, 0x40, 0x41, + 0x0c, 0x20, 0x17, 0x6b, 0x22, 0x12, 0x41, 0x07, 0x71, 0x22, 0x14, 0x0d, + 0x00, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x40, 0x21, 0x2a, + 0x0c, 0x01, 0x0b, 0x20, 0x17, 0x41, 0x74, 0x6a, 0x21, 0x12, 0x44, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x40, 0x21, 0x2a, 0x03, 0x40, 0x20, + 0x12, 0x41, 0x01, 0x6a, 0x21, 0x12, 0x20, 0x2a, 0x44, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x30, 0x40, 0xa2, 0x21, 0x2a, 0x20, 0x14, 0x41, 0x7f, + 0x6a, 0x22, 0x14, 0x0d, 0x00, 0x0b, 0x41, 0x00, 0x20, 0x12, 0x6b, 0x21, + 0x12, 0x0b, 0x02, 0x40, 0x20, 0x17, 0x41, 0x7b, 0x6a, 0x41, 0x07, 0x49, + 0x0d, 0x00, 0x03, 0x40, 0x20, 0x2a, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x30, 0x40, 0xa2, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, + 0x40, 0xa2, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x40, 0xa2, + 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x40, 0xa2, 0x44, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x40, 0xa2, 0x44, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x30, 0x40, 0xa2, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x30, 0x40, 0xa2, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, + 0x40, 0xa2, 0x21, 0x2a, 0x20, 0x12, 0x41, 0x78, 0x6a, 0x22, 0x12, 0x0d, + 0x00, 0x0b, 0x0b, 0x02, 0x40, 0x20, 0x1e, 0x2d, 0x00, 0x00, 0x41, 0x2d, + 0x47, 0x0d, 0x00, 0x20, 0x2a, 0x20, 0x21, 0x9a, 0x20, 0x2a, 0xa1, 0xa0, + 0x9a, 0x21, 0x21, 0x0c, 0x01, 0x0b, 0x20, 0x21, 0x20, 0x2a, 0xa0, 0x20, + 0x2a, 0xa1, 0x21, 0x21, 0x0b, 0x02, 0x40, 0x02, 0x40, 0x20, 0x05, 0x28, + 0x02, 0x6c, 0x22, 0x18, 0x45, 0x0d, 0x00, 0x20, 0x18, 0x20, 0x18, 0x41, + 0x1f, 0x75, 0x22, 0x12, 0x73, 0x20, 0x12, 0x6b, 0x21, 0x12, 0x41, 0x00, + 0x21, 0x14, 0x03, 0x40, 0x20, 0x05, 0x41, 0xc4, 0x00, 0x6a, 0x20, 0x14, + 0x6a, 0x41, 0x0b, 0x6a, 0x20, 0x12, 0x20, 0x12, 0x41, 0x0a, 0x6e, 0x22, + 0x15, 0x41, 0x0a, 0x6c, 0x6b, 0x41, 0x30, 0x72, 0x3a, 0x00, 0x00, 0x20, + 0x14, 0x41, 0x7f, 0x6a, 0x21, 0x14, 0x20, 0x12, 0x41, 0x09, 0x4b, 0x21, + 0x13, 0x20, 0x15, 0x21, 0x12, 0x20, 0x13, 0x0d, 0x00, 0x0b, 0x20, 0x14, + 0x45, 0x0d, 0x00, 0x20, 0x05, 0x41, 0xc4, 0x00, 0x6a, 0x20, 0x14, 0x6a, + 0x41, 0x0c, 0x6a, 0x21, 0x12, 0x0c, 0x01, 0x0b, 0x20, 0x05, 0x41, 0x30, + 0x3a, 0x00, 0x4f, 0x20, 0x0a, 0x21, 0x12, 0x0b, 0x20, 0x22, 0x41, 0x02, + 0x72, 0x21, 0x1c, 0x20, 0x1d, 0x41, 0x20, 0x71, 0x21, 0x15, 0x20, 0x12, + 0x41, 0x7e, 0x6a, 0x22, 0x1a, 0x20, 0x1d, 0x41, 0x0f, 0x6a, 0x3a, 0x00, + 0x00, 0x20, 0x12, 0x41, 0x7f, 0x6a, 0x41, 0x2d, 0x41, 0x2b, 0x20, 0x18, + 0x41, 0x00, 0x48, 0x1b, 0x3a, 0x00, 0x00, 0x20, 0x16, 0x41, 0x08, 0x71, + 0x21, 0x13, 0x20, 0x05, 0x41, 0xd0, 0x00, 0x6a, 0x21, 0x14, 0x03, 0x40, + 0x20, 0x14, 0x21, 0x12, 0x02, 0x40, 0x02, 0x40, 0x20, 0x21, 0x99, 0x44, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x41, 0x63, 0x45, 0x0d, 0x00, + 0x20, 0x21, 0xaa, 0x21, 0x14, 0x0c, 0x01, 0x0b, 0x41, 0x80, 0x80, 0x80, + 0x80, 0x78, 0x21, 0x14, 0x0b, 0x20, 0x12, 0x20, 0x14, 0x41, 0xb0, 0x9c, + 0x80, 0x80, 0x00, 0x6a, 0x2d, 0x00, 0x00, 0x20, 0x15, 0x72, 0x3a, 0x00, + 0x00, 0x20, 0x21, 0x20, 0x14, 0xb7, 0xa1, 0x44, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x30, 0x40, 0xa2, 0x21, 0x21, 0x02, 0x40, 0x20, 0x12, 0x41, + 0x01, 0x6a, 0x22, 0x14, 0x20, 0x05, 0x41, 0xd0, 0x00, 0x6a, 0x6b, 0x41, + 0x01, 0x47, 0x0d, 0x00, 0x02, 0x40, 0x20, 0x13, 0x0d, 0x00, 0x20, 0x17, + 0x41, 0x00, 0x4a, 0x0d, 0x00, 0x20, 0x21, 0x44, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x61, 0x0d, 0x01, 0x0b, 0x20, 0x12, 0x41, 0x2e, + 0x3a, 0x00, 0x01, 0x20, 0x12, 0x41, 0x02, 0x6a, 0x21, 0x14, 0x0b, 0x20, + 0x21, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x62, 0x0d, + 0x00, 0x0b, 0x41, 0xfd, 0xff, 0xff, 0xff, 0x07, 0x20, 0x06, 0x20, 0x1a, + 0x6b, 0x22, 0x18, 0x20, 0x1c, 0x6a, 0x22, 0x12, 0x6b, 0x20, 0x17, 0x48, + 0x0d, 0x02, 0x20, 0x17, 0x41, 0x02, 0x6a, 0x20, 0x14, 0x20, 0x05, 0x41, + 0xd0, 0x00, 0x6a, 0x6b, 0x22, 0x14, 0x20, 0x14, 0x41, 0x7e, 0x6a, 0x20, + 0x17, 0x48, 0x1b, 0x20, 0x14, 0x20, 0x17, 0x1b, 0x22, 0x13, 0x20, 0x12, + 0x6a, 0x21, 0x1b, 0x02, 0x40, 0x20, 0x16, 0x41, 0x80, 0xc0, 0x04, 0x71, + 0x22, 0x15, 0x0d, 0x00, 0x20, 0x19, 0x20, 0x1b, 0x4c, 0x0d, 0x00, 0x20, + 0x05, 0x41, 0xf0, 0x04, 0x6a, 0x41, 0x20, 0x20, 0x19, 0x20, 0x1b, 0x6b, + 0x22, 0x12, 0x41, 0x80, 0x02, 0x20, 0x12, 0x41, 0x80, 0x02, 0x49, 0x22, + 0x17, 0x1b, 0x10, 0xa9, 0x80, 0x80, 0x80, 0x00, 0x1a, 0x02, 0x40, 0x20, + 0x17, 0x0d, 0x00, 0x03, 0x40, 0x02, 0x40, 0x20, 0x00, 0x2d, 0x00, 0x00, + 0x41, 0x20, 0x71, 0x0d, 0x00, 0x20, 0x05, 0x41, 0xf0, 0x04, 0x6a, 0x41, + 0x80, 0x02, 0x20, 0x00, 0x10, 0xb7, 0x80, 0x80, 0x80, 0x00, 0x1a, 0x0b, + 0x20, 0x12, 0x41, 0x80, 0x7e, 0x6a, 0x22, 0x12, 0x41, 0xff, 0x01, 0x4b, + 0x0d, 0x00, 0x0b, 0x0b, 0x20, 0x00, 0x2d, 0x00, 0x00, 0x41, 0x20, 0x71, + 0x0d, 0x00, 0x20, 0x05, 0x41, 0xf0, 0x04, 0x6a, 0x20, 0x12, 0x20, 0x00, + 0x10, 0xb7, 0x80, 0x80, 0x80, 0x00, 0x1a, 0x0b, 0x02, 0x40, 0x20, 0x00, + 0x2d, 0x00, 0x00, 0x41, 0x20, 0x71, 0x0d, 0x00, 0x20, 0x1e, 0x20, 0x1c, + 0x20, 0x00, 0x10, 0xb7, 0x80, 0x80, 0x80, 0x00, 0x1a, 0x0b, 0x02, 0x40, + 0x20, 0x15, 0x41, 0x80, 0x80, 0x04, 0x47, 0x0d, 0x00, 0x20, 0x19, 0x20, + 0x1b, 0x4c, 0x0d, 0x00, 0x20, 0x05, 0x41, 0xf0, 0x04, 0x6a, 0x41, 0x30, + 0x20, 0x19, 0x20, 0x1b, 0x6b, 0x22, 0x12, 0x41, 0x80, 0x02, 0x20, 0x12, + 0x41, 0x80, 0x02, 0x49, 0x22, 0x17, 0x1b, 0x10, 0xa9, 0x80, 0x80, 0x80, + 0x00, 0x1a, 0x02, 0x40, 0x20, 0x17, 0x0d, 0x00, 0x03, 0x40, 0x02, 0x40, + 0x20, 0x00, 0x2d, 0x00, 0x00, 0x41, 0x20, 0x71, 0x0d, 0x00, 0x20, 0x05, + 0x41, 0xf0, 0x04, 0x6a, 0x41, 0x80, 0x02, 0x20, 0x00, 0x10, 0xb7, 0x80, + 0x80, 0x80, 0x00, 0x1a, 0x0b, 0x20, 0x12, 0x41, 0x80, 0x7e, 0x6a, 0x22, + 0x12, 0x41, 0xff, 0x01, 0x4b, 0x0d, 0x00, 0x0b, 0x0b, 0x20, 0x00, 0x2d, + 0x00, 0x00, 0x41, 0x20, 0x71, 0x0d, 0x00, 0x20, 0x05, 0x41, 0xf0, 0x04, + 0x6a, 0x20, 0x12, 0x20, 0x00, 0x10, 0xb7, 0x80, 0x80, 0x80, 0x00, 0x1a, + 0x0b, 0x02, 0x40, 0x20, 0x00, 0x2d, 0x00, 0x00, 0x41, 0x20, 0x71, 0x0d, + 0x00, 0x20, 0x05, 0x41, 0xd0, 0x00, 0x6a, 0x20, 0x14, 0x20, 0x00, 0x10, + 0xb7, 0x80, 0x80, 0x80, 0x00, 0x1a, 0x0b, 0x02, 0x40, 0x20, 0x13, 0x20, + 0x14, 0x6b, 0x22, 0x12, 0x41, 0x01, 0x48, 0x0d, 0x00, 0x20, 0x05, 0x41, + 0xf0, 0x04, 0x6a, 0x41, 0x30, 0x20, 0x12, 0x41, 0x80, 0x02, 0x20, 0x12, + 0x41, 0x80, 0x02, 0x49, 0x22, 0x14, 0x1b, 0x10, 0xa9, 0x80, 0x80, 0x80, + 0x00, 0x1a, 0x02, 0x40, 0x20, 0x14, 0x0d, 0x00, 0x03, 0x40, 0x02, 0x40, + 0x20, 0x00, 0x2d, 0x00, 0x00, 0x41, 0x20, 0x71, 0x0d, 0x00, 0x20, 0x05, + 0x41, 0xf0, 0x04, 0x6a, 0x41, 0x80, 0x02, 0x20, 0x00, 0x10, 0xb7, 0x80, + 0x80, 0x80, 0x00, 0x1a, 0x0b, 0x20, 0x12, 0x41, 0x80, 0x7e, 0x6a, 0x22, + 0x12, 0x41, 0xff, 0x01, 0x4b, 0x0d, 0x00, 0x0b, 0x0b, 0x20, 0x00, 0x2d, + 0x00, 0x00, 0x41, 0x20, 0x71, 0x0d, 0x00, 0x20, 0x05, 0x41, 0xf0, 0x04, + 0x6a, 0x20, 0x12, 0x20, 0x00, 0x10, 0xb7, 0x80, 0x80, 0x80, 0x00, 0x1a, + 0x0b, 0x02, 0x40, 0x20, 0x00, 0x2d, 0x00, 0x00, 0x41, 0x20, 0x71, 0x0d, + 0x00, 0x20, 0x1a, 0x20, 0x18, 0x20, 0x00, 0x10, 0xb7, 0x80, 0x80, 0x80, + 0x00, 0x1a, 0x0b, 0x20, 0x15, 0x41, 0x80, 0xc0, 0x00, 0x47, 0x0d, 0x00, + 0x20, 0x19, 0x20, 0x1b, 0x4c, 0x0d, 0x00, 0x20, 0x05, 0x41, 0xf0, 0x04, + 0x6a, 0x41, 0x20, 0x20, 0x19, 0x20, 0x1b, 0x6b, 0x22, 0x12, 0x41, 0x80, + 0x02, 0x20, 0x12, 0x41, 0x80, 0x02, 0x49, 0x22, 0x14, 0x1b, 0x10, 0xa9, + 0x80, 0x80, 0x80, 0x00, 0x1a, 0x02, 0x40, 0x20, 0x14, 0x0d, 0x00, 0x03, + 0x40, 0x02, 0x40, 0x20, 0x00, 0x2d, 0x00, 0x00, 0x41, 0x20, 0x71, 0x0d, + 0x00, 0x20, 0x05, 0x41, 0xf0, 0x04, 0x6a, 0x41, 0x80, 0x02, 0x20, 0x00, + 0x10, 0xb7, 0x80, 0x80, 0x80, 0x00, 0x1a, 0x0b, 0x20, 0x12, 0x41, 0x80, + 0x7e, 0x6a, 0x22, 0x12, 0x41, 0xff, 0x01, 0x4b, 0x0d, 0x00, 0x0b, 0x0b, + 0x20, 0x00, 0x2d, 0x00, 0x00, 0x41, 0x20, 0x71, 0x0d, 0x00, 0x20, 0x05, + 0x41, 0xf0, 0x04, 0x6a, 0x20, 0x12, 0x20, 0x00, 0x10, 0xb7, 0x80, 0x80, + 0x80, 0x00, 0x1a, 0x0b, 0x20, 0x1b, 0x20, 0x19, 0x20, 0x1b, 0x20, 0x19, + 0x4a, 0x1b, 0x22, 0x12, 0x41, 0x00, 0x4e, 0x0d, 0x00, 0x0b, 0x0b, 0x41, + 0xb4, 0x9e, 0x80, 0x80, 0x00, 0x41, 0x3d, 0x36, 0x02, 0x00, 0x0b, 0x41, + 0x7f, 0x21, 0x11, 0x0b, 0x20, 0x05, 0x41, 0xf0, 0x06, 0x6a, 0x24, 0x80, + 0x80, 0x80, 0x80, 0x00, 0x20, 0x11, 0x0b, 0xb3, 0x04, 0x00, 0x02, 0x40, + 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, + 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, + 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, + 0x20, 0x01, 0x41, 0x77, 0x6a, 0x0e, 0x12, 0x11, 0x00, 0x01, 0x04, 0x02, + 0x03, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, + 0x10, 0x12, 0x0b, 0x20, 0x02, 0x20, 0x02, 0x28, 0x02, 0x00, 0x22, 0x01, + 0x41, 0x04, 0x6a, 0x36, 0x02, 0x00, 0x20, 0x00, 0x20, 0x01, 0x34, 0x02, + 0x00, 0x37, 0x03, 0x00, 0x0f, 0x0b, 0x20, 0x02, 0x20, 0x02, 0x28, 0x02, + 0x00, 0x22, 0x01, 0x41, 0x04, 0x6a, 0x36, 0x02, 0x00, 0x20, 0x00, 0x20, + 0x01, 0x35, 0x02, 0x00, 0x37, 0x03, 0x00, 0x0f, 0x0b, 0x20, 0x02, 0x20, + 0x02, 0x28, 0x02, 0x00, 0x22, 0x01, 0x41, 0x04, 0x6a, 0x36, 0x02, 0x00, + 0x20, 0x00, 0x20, 0x01, 0x34, 0x02, 0x00, 0x37, 0x03, 0x00, 0x0f, 0x0b, + 0x20, 0x02, 0x20, 0x02, 0x28, 0x02, 0x00, 0x22, 0x01, 0x41, 0x04, 0x6a, + 0x36, 0x02, 0x00, 0x20, 0x00, 0x20, 0x01, 0x35, 0x02, 0x00, 0x37, 0x03, + 0x00, 0x0f, 0x0b, 0x20, 0x02, 0x20, 0x02, 0x28, 0x02, 0x00, 0x41, 0x07, + 0x6a, 0x41, 0x78, 0x71, 0x22, 0x01, 0x41, 0x08, 0x6a, 0x36, 0x02, 0x00, + 0x20, 0x00, 0x20, 0x01, 0x29, 0x03, 0x00, 0x37, 0x03, 0x00, 0x0f, 0x0b, + 0x20, 0x02, 0x20, 0x02, 0x28, 0x02, 0x00, 0x22, 0x01, 0x41, 0x04, 0x6a, + 0x36, 0x02, 0x00, 0x20, 0x00, 0x20, 0x01, 0x32, 0x01, 0x00, 0x37, 0x03, + 0x00, 0x0f, 0x0b, 0x20, 0x02, 0x20, 0x02, 0x28, 0x02, 0x00, 0x22, 0x01, + 0x41, 0x04, 0x6a, 0x36, 0x02, 0x00, 0x20, 0x00, 0x20, 0x01, 0x33, 0x01, + 0x00, 0x37, 0x03, 0x00, 0x0f, 0x0b, 0x20, 0x02, 0x20, 0x02, 0x28, 0x02, + 0x00, 0x22, 0x01, 0x41, 0x04, 0x6a, 0x36, 0x02, 0x00, 0x20, 0x00, 0x20, + 0x01, 0x30, 0x00, 0x00, 0x37, 0x03, 0x00, 0x0f, 0x0b, 0x20, 0x02, 0x20, + 0x02, 0x28, 0x02, 0x00, 0x22, 0x01, 0x41, 0x04, 0x6a, 0x36, 0x02, 0x00, + 0x20, 0x00, 0x20, 0x01, 0x31, 0x00, 0x00, 0x37, 0x03, 0x00, 0x0f, 0x0b, + 0x20, 0x02, 0x20, 0x02, 0x28, 0x02, 0x00, 0x41, 0x07, 0x6a, 0x41, 0x78, + 0x71, 0x22, 0x01, 0x41, 0x08, 0x6a, 0x36, 0x02, 0x00, 0x20, 0x00, 0x20, + 0x01, 0x29, 0x03, 0x00, 0x37, 0x03, 0x00, 0x0f, 0x0b, 0x20, 0x02, 0x20, + 0x02, 0x28, 0x02, 0x00, 0x22, 0x01, 0x41, 0x04, 0x6a, 0x36, 0x02, 0x00, + 0x20, 0x00, 0x20, 0x01, 0x35, 0x02, 0x00, 0x37, 0x03, 0x00, 0x0f, 0x0b, + 0x20, 0x02, 0x20, 0x02, 0x28, 0x02, 0x00, 0x41, 0x07, 0x6a, 0x41, 0x78, + 0x71, 0x22, 0x01, 0x41, 0x08, 0x6a, 0x36, 0x02, 0x00, 0x20, 0x00, 0x20, + 0x01, 0x29, 0x03, 0x00, 0x37, 0x03, 0x00, 0x0f, 0x0b, 0x20, 0x02, 0x20, + 0x02, 0x28, 0x02, 0x00, 0x41, 0x07, 0x6a, 0x41, 0x78, 0x71, 0x22, 0x01, + 0x41, 0x08, 0x6a, 0x36, 0x02, 0x00, 0x20, 0x00, 0x20, 0x01, 0x29, 0x03, + 0x00, 0x37, 0x03, 0x00, 0x0f, 0x0b, 0x20, 0x02, 0x20, 0x02, 0x28, 0x02, + 0x00, 0x22, 0x01, 0x41, 0x04, 0x6a, 0x36, 0x02, 0x00, 0x20, 0x00, 0x20, + 0x01, 0x34, 0x02, 0x00, 0x37, 0x03, 0x00, 0x0f, 0x0b, 0x20, 0x02, 0x20, + 0x02, 0x28, 0x02, 0x00, 0x22, 0x01, 0x41, 0x04, 0x6a, 0x36, 0x02, 0x00, + 0x20, 0x00, 0x20, 0x01, 0x35, 0x02, 0x00, 0x37, 0x03, 0x00, 0x0f, 0x0b, + 0x20, 0x02, 0x20, 0x02, 0x28, 0x02, 0x00, 0x41, 0x07, 0x6a, 0x41, 0x78, + 0x71, 0x22, 0x01, 0x41, 0x08, 0x6a, 0x36, 0x02, 0x00, 0x20, 0x00, 0x20, + 0x01, 0x2b, 0x03, 0x00, 0x39, 0x03, 0x00, 0x0f, 0x0b, 0x10, 0xc6, 0x80, + 0x80, 0x80, 0x00, 0x00, 0x0b, 0x20, 0x02, 0x20, 0x02, 0x28, 0x02, 0x00, + 0x22, 0x01, 0x41, 0x04, 0x6a, 0x36, 0x02, 0x00, 0x20, 0x00, 0x20, 0x01, + 0x28, 0x02, 0x00, 0x36, 0x02, 0x00, 0x0b, 0x0b, 0x9e, 0x01, 0x01, 0x01, + 0x7f, 0x23, 0x80, 0x80, 0x80, 0x80, 0x00, 0x41, 0x80, 0x02, 0x6b, 0x22, + 0x05, 0x24, 0x80, 0x80, 0x80, 0x80, 0x00, 0x02, 0x40, 0x20, 0x02, 0x20, + 0x03, 0x4c, 0x0d, 0x00, 0x20, 0x04, 0x41, 0x80, 0xc0, 0x04, 0x71, 0x0d, + 0x00, 0x20, 0x05, 0x20, 0x01, 0x20, 0x02, 0x20, 0x03, 0x6b, 0x22, 0x03, + 0x41, 0x80, 0x02, 0x20, 0x03, 0x41, 0x80, 0x02, 0x49, 0x22, 0x04, 0x1b, + 0x10, 0xa9, 0x80, 0x80, 0x80, 0x00, 0x21, 0x02, 0x02, 0x40, 0x20, 0x04, + 0x0d, 0x00, 0x03, 0x40, 0x02, 0x40, 0x20, 0x00, 0x2d, 0x00, 0x00, 0x41, + 0x20, 0x71, 0x0d, 0x00, 0x20, 0x02, 0x41, 0x80, 0x02, 0x20, 0x00, 0x10, + 0xb7, 0x80, 0x80, 0x80, 0x00, 0x1a, 0x0b, 0x20, 0x03, 0x41, 0x80, 0x7e, + 0x6a, 0x22, 0x03, 0x41, 0xff, 0x01, 0x4b, 0x0d, 0x00, 0x0b, 0x0b, 0x20, + 0x00, 0x2d, 0x00, 0x00, 0x41, 0x20, 0x71, 0x0d, 0x00, 0x20, 0x02, 0x20, + 0x03, 0x20, 0x00, 0x10, 0xb7, 0x80, 0x80, 0x80, 0x00, 0x1a, 0x0b, 0x20, + 0x05, 0x41, 0x80, 0x02, 0x6a, 0x24, 0x80, 0x80, 0x80, 0x80, 0x00, 0x0b, + 0x1c, 0x00, 0x41, 0xb6, 0x97, 0x80, 0x80, 0x00, 0x41, 0xb8, 0x9d, 0x80, + 0x80, 0x00, 0x10, 0xc1, 0x80, 0x80, 0x80, 0x00, 0x1a, 0x10, 0xa4, 0x80, + 0x80, 0x80, 0x00, 0x00, 0x0b, 0x3b, 0x01, 0x01, 0x7f, 0x23, 0x80, 0x80, + 0x80, 0x80, 0x00, 0x41, 0x10, 0x6b, 0x22, 0x02, 0x24, 0x80, 0x80, 0x80, + 0x80, 0x00, 0x20, 0x02, 0x20, 0x01, 0x36, 0x02, 0x0c, 0x41, 0xc0, 0x9c, + 0x80, 0x80, 0x00, 0x20, 0x00, 0x20, 0x01, 0x10, 0xc2, 0x80, 0x80, 0x80, + 0x00, 0x21, 0x01, 0x20, 0x02, 0x41, 0x10, 0x6a, 0x24, 0x80, 0x80, 0x80, + 0x80, 0x00, 0x20, 0x01, 0x0b, 0x49, 0x01, 0x03, 0x7f, 0x41, 0x00, 0x21, + 0x03, 0x02, 0x40, 0x20, 0x02, 0x45, 0x0d, 0x00, 0x02, 0x40, 0x03, 0x40, + 0x20, 0x00, 0x2d, 0x00, 0x00, 0x22, 0x04, 0x20, 0x01, 0x2d, 0x00, 0x00, + 0x22, 0x05, 0x47, 0x0d, 0x01, 0x20, 0x01, 0x41, 0x01, 0x6a, 0x21, 0x01, + 0x20, 0x00, 0x41, 0x01, 0x6a, 0x21, 0x00, 0x20, 0x02, 0x41, 0x7f, 0x6a, + 0x22, 0x02, 0x0d, 0x00, 0x0c, 0x02, 0x0b, 0x0b, 0x20, 0x04, 0x20, 0x05, + 0x6b, 0x21, 0x03, 0x0b, 0x20, 0x03, 0x0b, 0x2e, 0x01, 0x02, 0x7f, 0x02, + 0x40, 0x20, 0x00, 0x10, 0xaa, 0x80, 0x80, 0x80, 0x00, 0x41, 0x01, 0x6a, + 0x22, 0x01, 0x10, 0x90, 0x80, 0x80, 0x80, 0x00, 0x22, 0x02, 0x45, 0x0d, + 0x00, 0x20, 0x02, 0x20, 0x00, 0x20, 0x01, 0x10, 0xa8, 0x80, 0x80, 0x80, + 0x00, 0x1a, 0x0b, 0x20, 0x02, 0x0b, 0xe0, 0x01, 0x01, 0x04, 0x7f, 0x23, + 0x80, 0x80, 0x80, 0x80, 0x00, 0x41, 0x10, 0x6b, 0x22, 0x00, 0x24, 0x80, + 0x80, 0x80, 0x80, 0x00, 0x02, 0x40, 0x41, 0x00, 0x2d, 0x00, 0xec, 0xaa, + 0x80, 0x80, 0x00, 0x41, 0x01, 0x71, 0x0d, 0x00, 0x41, 0x00, 0x2d, 0x00, + 0xec, 0xaa, 0x80, 0x80, 0x00, 0x41, 0x01, 0x71, 0x0d, 0x00, 0x41, 0x03, + 0x21, 0x01, 0x02, 0x40, 0x02, 0x40, 0x03, 0x40, 0x02, 0x40, 0x20, 0x01, + 0x20, 0x00, 0x41, 0x08, 0x6a, 0x10, 0x9c, 0x80, 0x80, 0x80, 0x00, 0x22, + 0x02, 0x45, 0x0d, 0x00, 0x20, 0x02, 0x41, 0x08, 0x47, 0x0d, 0x02, 0x41, + 0x00, 0x41, 0x01, 0x3a, 0x00, 0xec, 0xaa, 0x80, 0x80, 0x00, 0x0c, 0x04, + 0x0b, 0x02, 0x40, 0x20, 0x00, 0x2d, 0x00, 0x08, 0x0d, 0x00, 0x20, 0x00, + 0x28, 0x02, 0x0c, 0x22, 0x03, 0x41, 0x01, 0x6a, 0x10, 0x90, 0x80, 0x80, + 0x80, 0x00, 0x22, 0x02, 0x45, 0x0d, 0x03, 0x20, 0x01, 0x20, 0x02, 0x20, + 0x03, 0x10, 0x9d, 0x80, 0x80, 0x80, 0x00, 0x0d, 0x02, 0x20, 0x02, 0x20, + 0x00, 0x28, 0x02, 0x0c, 0x6a, 0x41, 0x00, 0x3a, 0x00, 0x00, 0x20, 0x01, + 0x20, 0x02, 0x10, 0xcb, 0x80, 0x80, 0x80, 0x00, 0x0d, 0x03, 0x20, 0x02, + 0x10, 0x92, 0x80, 0x80, 0x80, 0x00, 0x0b, 0x20, 0x01, 0x41, 0x01, 0x6a, + 0x21, 0x01, 0x0c, 0x00, 0x0b, 0x0b, 0x41, 0xc7, 0x00, 0x10, 0x95, 0x80, + 0x80, 0x80, 0x00, 0x00, 0x0b, 0x41, 0xc6, 0x00, 0x10, 0x95, 0x80, 0x80, + 0x80, 0x00, 0x00, 0x0b, 0x20, 0x00, 0x41, 0x10, 0x6a, 0x24, 0x80, 0x80, + 0x80, 0x80, 0x00, 0x0b, 0x97, 0x02, 0x01, 0x04, 0x7f, 0x02, 0x40, 0x02, + 0x40, 0x20, 0x00, 0x41, 0x02, 0x6a, 0x0e, 0x02, 0x01, 0x01, 0x00, 0x0b, + 0x20, 0x01, 0x45, 0x0d, 0x00, 0x02, 0x40, 0x41, 0x00, 0x28, 0x02, 0xe4, + 0xaa, 0x80, 0x80, 0x00, 0x22, 0x02, 0x41, 0x00, 0x28, 0x02, 0xf0, 0xaa, + 0x80, 0x80, 0x00, 0x47, 0x0d, 0x00, 0x41, 0x00, 0x28, 0x02, 0xe8, 0xaa, + 0x80, 0x80, 0x00, 0x21, 0x03, 0x02, 0x40, 0x41, 0x08, 0x20, 0x02, 0x41, + 0x01, 0x74, 0x41, 0x04, 0x20, 0x02, 0x1b, 0x22, 0x04, 0x10, 0x94, 0x80, + 0x80, 0x80, 0x00, 0x22, 0x05, 0x0d, 0x00, 0x41, 0x7f, 0x0f, 0x0b, 0x20, + 0x05, 0x20, 0x03, 0x20, 0x02, 0x41, 0x03, 0x74, 0x10, 0xa8, 0x80, 0x80, + 0x80, 0x00, 0x21, 0x05, 0x41, 0x00, 0x20, 0x04, 0x36, 0x02, 0xf0, 0xaa, + 0x80, 0x80, 0x00, 0x41, 0x00, 0x20, 0x05, 0x36, 0x02, 0xe8, 0xaa, 0x80, + 0x80, 0x00, 0x20, 0x03, 0x10, 0x92, 0x80, 0x80, 0x80, 0x00, 0x0b, 0x02, + 0x40, 0x03, 0x40, 0x02, 0x40, 0x02, 0x40, 0x20, 0x01, 0x22, 0x03, 0x2d, + 0x00, 0x00, 0x41, 0x52, 0x6a, 0x0e, 0x02, 0x01, 0x00, 0x03, 0x0b, 0x20, + 0x03, 0x41, 0x01, 0x6a, 0x21, 0x01, 0x0c, 0x01, 0x0b, 0x20, 0x03, 0x41, + 0x01, 0x6a, 0x21, 0x01, 0x20, 0x03, 0x2d, 0x00, 0x01, 0x22, 0x04, 0x45, + 0x0d, 0x00, 0x20, 0x04, 0x41, 0x2f, 0x47, 0x0d, 0x01, 0x20, 0x03, 0x41, + 0x02, 0x6a, 0x21, 0x01, 0x0c, 0x00, 0x0b, 0x0b, 0x02, 0x40, 0x20, 0x03, + 0x10, 0xc9, 0x80, 0x80, 0x80, 0x00, 0x22, 0x03, 0x0d, 0x00, 0x41, 0x7f, + 0x0f, 0x0b, 0x41, 0x00, 0x20, 0x02, 0x41, 0x01, 0x6a, 0x36, 0x02, 0xe4, + 0xaa, 0x80, 0x80, 0x00, 0x41, 0x00, 0x28, 0x02, 0xe8, 0xaa, 0x80, 0x80, + 0x00, 0x20, 0x02, 0x41, 0x03, 0x74, 0x6a, 0x22, 0x01, 0x20, 0x00, 0x36, + 0x02, 0x04, 0x20, 0x01, 0x20, 0x03, 0x36, 0x02, 0x00, 0x41, 0x00, 0x0f, + 0x0b, 0x10, 0xa4, 0x80, 0x80, 0x80, 0x00, 0x00, 0x0b, 0x5d, 0x01, 0x01, + 0x7f, 0x23, 0x80, 0x80, 0x80, 0x80, 0x00, 0x41, 0x10, 0x6b, 0x22, 0x04, + 0x24, 0x80, 0x80, 0x80, 0x80, 0x00, 0x20, 0x04, 0x20, 0x03, 0x36, 0x02, + 0x0c, 0x02, 0x40, 0x02, 0x40, 0x41, 0x80, 0x80, 0x80, 0x80, 0x00, 0x45, + 0x0d, 0x00, 0x20, 0x00, 0x20, 0x01, 0x20, 0x02, 0x20, 0x04, 0x41, 0x0c, + 0x6a, 0x41, 0x00, 0x10, 0x8e, 0x80, 0x80, 0x80, 0x00, 0x21, 0x03, 0x0c, + 0x01, 0x0b, 0x20, 0x00, 0x20, 0x01, 0x20, 0x02, 0x10, 0xcd, 0x80, 0x80, + 0x80, 0x00, 0x21, 0x03, 0x0b, 0x20, 0x04, 0x41, 0x10, 0x6a, 0x24, 0x80, + 0x80, 0x80, 0x80, 0x00, 0x20, 0x03, 0x0b, 0xbd, 0x02, 0x01, 0x0a, 0x7f, + 0x20, 0x00, 0x41, 0x7f, 0x6a, 0x21, 0x03, 0x10, 0xca, 0x80, 0x80, 0x80, + 0x00, 0x03, 0x40, 0x20, 0x03, 0x41, 0x01, 0x6a, 0x22, 0x03, 0x2d, 0x00, + 0x00, 0x41, 0x2f, 0x46, 0x0d, 0x00, 0x0b, 0x41, 0x00, 0x21, 0x04, 0x02, + 0x40, 0x02, 0x40, 0x41, 0x00, 0x28, 0x02, 0xe4, 0xaa, 0x80, 0x80, 0x00, + 0x22, 0x05, 0x45, 0x0d, 0x00, 0x41, 0x00, 0x28, 0x02, 0xe8, 0xaa, 0x80, + 0x80, 0x00, 0x21, 0x06, 0x41, 0x7f, 0x21, 0x07, 0x03, 0x40, 0x20, 0x06, + 0x20, 0x05, 0x41, 0x7f, 0x6a, 0x22, 0x05, 0x41, 0x03, 0x74, 0x6a, 0x22, + 0x08, 0x28, 0x02, 0x00, 0x22, 0x09, 0x10, 0xaa, 0x80, 0x80, 0x80, 0x00, + 0x21, 0x0a, 0x02, 0x40, 0x02, 0x40, 0x20, 0x07, 0x41, 0x7f, 0x46, 0x0d, + 0x00, 0x20, 0x0a, 0x20, 0x04, 0x4d, 0x0d, 0x01, 0x0b, 0x02, 0x40, 0x02, + 0x40, 0x20, 0x0a, 0x0d, 0x00, 0x20, 0x03, 0x2d, 0x00, 0x00, 0x41, 0xff, + 0x01, 0x71, 0x41, 0x2f, 0x47, 0x0d, 0x01, 0x0b, 0x20, 0x03, 0x20, 0x09, + 0x20, 0x0a, 0x10, 0xc8, 0x80, 0x80, 0x80, 0x00, 0x0d, 0x01, 0x20, 0x09, + 0x41, 0x7f, 0x6a, 0x21, 0x0b, 0x20, 0x0a, 0x21, 0x0c, 0x02, 0x40, 0x03, + 0x40, 0x20, 0x0c, 0x22, 0x00, 0x45, 0x0d, 0x01, 0x20, 0x00, 0x41, 0x7f, + 0x6a, 0x21, 0x0c, 0x20, 0x0b, 0x20, 0x00, 0x6a, 0x2d, 0x00, 0x00, 0x41, + 0x2f, 0x46, 0x0d, 0x00, 0x0b, 0x0b, 0x20, 0x03, 0x20, 0x00, 0x6a, 0x2d, + 0x00, 0x00, 0x22, 0x00, 0x41, 0x2f, 0x46, 0x0d, 0x00, 0x20, 0x00, 0x0d, + 0x01, 0x0b, 0x20, 0x01, 0x20, 0x09, 0x36, 0x02, 0x00, 0x20, 0x08, 0x28, + 0x02, 0x04, 0x21, 0x07, 0x20, 0x0a, 0x21, 0x04, 0x0b, 0x20, 0x05, 0x0d, + 0x00, 0x0b, 0x20, 0x07, 0x41, 0x7f, 0x47, 0x0d, 0x01, 0x0b, 0x41, 0x00, + 0x41, 0x2c, 0x36, 0x02, 0xb4, 0x9e, 0x80, 0x80, 0x00, 0x41, 0x7f, 0x0f, + 0x0b, 0x20, 0x03, 0x20, 0x04, 0x6a, 0x41, 0x7f, 0x6a, 0x21, 0x00, 0x03, + 0x40, 0x20, 0x00, 0x41, 0x01, 0x6a, 0x22, 0x00, 0x2d, 0x00, 0x00, 0x22, + 0x03, 0x41, 0x2f, 0x46, 0x0d, 0x00, 0x0b, 0x20, 0x02, 0x20, 0x00, 0x41, + 0xfc, 0x95, 0x80, 0x80, 0x00, 0x20, 0x03, 0x1b, 0x36, 0x02, 0x00, 0x20, + 0x07, 0x0b, 0x99, 0x02, 0x02, 0x02, 0x7f, 0x02, 0x7e, 0x23, 0x80, 0x80, + 0x80, 0x80, 0x00, 0x41, 0x20, 0x6b, 0x22, 0x03, 0x24, 0x80, 0x80, 0x80, + 0x80, 0x00, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, 0x20, 0x02, + 0x41, 0x80, 0x80, 0x80, 0xf0, 0x01, 0x71, 0x41, 0x80, 0x80, 0x80, 0x70, + 0x6a, 0x41, 0x19, 0x76, 0x22, 0x04, 0x41, 0x09, 0x4b, 0x0d, 0x00, 0x41, + 0x01, 0x20, 0x04, 0x74, 0x22, 0x04, 0x41, 0x82, 0x05, 0x71, 0x0d, 0x01, + 0x42, 0xbc, 0xfd, 0xfe, 0x7d, 0x21, 0x05, 0x20, 0x04, 0x41, 0x09, 0x71, + 0x0d, 0x02, 0x0b, 0x41, 0x00, 0x41, 0x1c, 0x36, 0x02, 0xb4, 0x9e, 0x80, + 0x80, 0x00, 0x41, 0x7f, 0x21, 0x04, 0x0c, 0x02, 0x0b, 0x42, 0xbe, 0xfd, + 0xff, 0x7d, 0x42, 0xbc, 0xfd, 0xfe, 0x7d, 0x20, 0x02, 0x41, 0x80, 0x80, + 0x80, 0x20, 0x71, 0x1b, 0x22, 0x05, 0x42, 0xc1, 0x82, 0x80, 0x02, 0x84, + 0x20, 0x05, 0x20, 0x02, 0x41, 0x80, 0x80, 0x80, 0x80, 0x01, 0x71, 0x1b, + 0x21, 0x05, 0x0b, 0x02, 0x40, 0x20, 0x00, 0x20, 0x03, 0x41, 0x08, 0x6a, + 0x10, 0x9a, 0x80, 0x80, 0x80, 0x00, 0x22, 0x04, 0x45, 0x0d, 0x00, 0x41, + 0x00, 0x20, 0x04, 0x36, 0x02, 0xb4, 0x9e, 0x80, 0x80, 0x00, 0x41, 0x7f, + 0x21, 0x04, 0x0c, 0x01, 0x0b, 0x41, 0x7f, 0x21, 0x04, 0x02, 0x40, 0x20, + 0x00, 0x20, 0x02, 0x41, 0x7f, 0x73, 0x41, 0x18, 0x76, 0x41, 0x01, 0x71, + 0x20, 0x01, 0x20, 0x02, 0x41, 0x0c, 0x76, 0x41, 0xff, 0x1f, 0x71, 0x20, + 0x03, 0x29, 0x03, 0x18, 0x22, 0x06, 0x20, 0x05, 0x83, 0x20, 0x06, 0x20, + 0x02, 0x41, 0xff, 0x1f, 0x71, 0x20, 0x03, 0x41, 0x04, 0x6a, 0x10, 0xa2, + 0x80, 0x80, 0x80, 0x00, 0x22, 0x02, 0x45, 0x0d, 0x00, 0x41, 0x00, 0x20, + 0x02, 0x36, 0x02, 0xb4, 0x9e, 0x80, 0x80, 0x00, 0x0c, 0x01, 0x0b, 0x20, + 0x03, 0x28, 0x02, 0x04, 0x21, 0x04, 0x0b, 0x20, 0x03, 0x41, 0x20, 0x6a, + 0x24, 0x80, 0x80, 0x80, 0x80, 0x00, 0x20, 0x04, 0x0b, 0x23, 0x00, 0x02, + 0x40, 0x20, 0x00, 0x20, 0x01, 0x10, 0xa1, 0x80, 0x80, 0x80, 0x00, 0x22, + 0x01, 0x0d, 0x00, 0x41, 0x00, 0x0f, 0x0b, 0x41, 0x00, 0x20, 0x01, 0x36, + 0x02, 0xb4, 0x9e, 0x80, 0x80, 0x00, 0x41, 0x7f, 0x0b, 0xa1, 0x01, 0x01, + 0x02, 0x7f, 0x23, 0x80, 0x80, 0x80, 0x80, 0x00, 0x41, 0x10, 0x6b, 0x22, + 0x02, 0x24, 0x80, 0x80, 0x80, 0x80, 0x00, 0x02, 0x40, 0x02, 0x40, 0x41, + 0x80, 0x80, 0x80, 0x80, 0x00, 0x45, 0x0d, 0x00, 0x20, 0x00, 0x20, 0x02, + 0x41, 0x0c, 0x6a, 0x41, 0xf4, 0xaa, 0x80, 0x80, 0x00, 0x41, 0xf8, 0xaa, + 0x80, 0x80, 0x00, 0x41, 0x01, 0x10, 0x8e, 0x80, 0x80, 0x80, 0x00, 0x21, + 0x03, 0x0c, 0x01, 0x0b, 0x20, 0x00, 0x20, 0x02, 0x41, 0x0c, 0x6a, 0x41, + 0xf4, 0xaa, 0x80, 0x80, 0x00, 0x41, 0xf8, 0xaa, 0x80, 0x80, 0x00, 0x28, + 0x02, 0x00, 0x10, 0xcc, 0x80, 0x80, 0x80, 0x00, 0x21, 0x03, 0x0b, 0x41, + 0x7f, 0x21, 0x00, 0x02, 0x40, 0x02, 0x40, 0x20, 0x03, 0x41, 0x7f, 0x47, + 0x0d, 0x00, 0x41, 0x00, 0x41, 0x2c, 0x36, 0x02, 0xb4, 0x9e, 0x80, 0x80, + 0x00, 0x0c, 0x01, 0x0b, 0x20, 0x03, 0x41, 0xf4, 0xaa, 0x80, 0x80, 0x00, + 0x28, 0x02, 0x00, 0x20, 0x01, 0x10, 0xce, 0x80, 0x80, 0x80, 0x00, 0x21, + 0x00, 0x0b, 0x20, 0x02, 0x41, 0x10, 0x6a, 0x24, 0x80, 0x80, 0x80, 0x80, + 0x00, 0x20, 0x00, 0x0b, 0x9f, 0x01, 0x01, 0x02, 0x7f, 0x23, 0x80, 0x80, + 0x80, 0x80, 0x00, 0x41, 0x10, 0x6b, 0x22, 0x02, 0x24, 0x80, 0x80, 0x80, + 0x80, 0x00, 0x02, 0x40, 0x02, 0x40, 0x41, 0x80, 0x80, 0x80, 0x80, 0x00, + 0x45, 0x0d, 0x00, 0x20, 0x00, 0x20, 0x02, 0x41, 0x0c, 0x6a, 0x41, 0xf4, + 0xaa, 0x80, 0x80, 0x00, 0x41, 0xf8, 0xaa, 0x80, 0x80, 0x00, 0x41, 0x01, + 0x10, 0x8e, 0x80, 0x80, 0x80, 0x00, 0x21, 0x03, 0x0c, 0x01, 0x0b, 0x20, + 0x00, 0x20, 0x02, 0x41, 0x0c, 0x6a, 0x41, 0xf4, 0xaa, 0x80, 0x80, 0x00, + 0x41, 0xf8, 0xaa, 0x80, 0x80, 0x00, 0x28, 0x02, 0x00, 0x10, 0xcc, 0x80, + 0x80, 0x80, 0x00, 0x21, 0x03, 0x0b, 0x41, 0x7f, 0x21, 0x00, 0x02, 0x40, + 0x02, 0x40, 0x20, 0x03, 0x41, 0x7f, 0x47, 0x0d, 0x00, 0x41, 0x00, 0x41, + 0x2c, 0x36, 0x02, 0xb4, 0x9e, 0x80, 0x80, 0x00, 0x0c, 0x01, 0x0b, 0x20, + 0x03, 0x41, 0xf4, 0xaa, 0x80, 0x80, 0x00, 0x28, 0x02, 0x00, 0x10, 0xcf, + 0x80, 0x80, 0x80, 0x00, 0x21, 0x00, 0x0b, 0x20, 0x02, 0x41, 0x10, 0x6a, + 0x24, 0x80, 0x80, 0x80, 0x80, 0x00, 0x20, 0x00, 0x0b, 0xe1, 0x02, 0x01, + 0x03, 0x7f, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, 0x20, 0x01, + 0x41, 0xff, 0x01, 0x71, 0x22, 0x02, 0x45, 0x0d, 0x00, 0x20, 0x00, 0x41, + 0x03, 0x71, 0x45, 0x0d, 0x02, 0x02, 0x40, 0x20, 0x00, 0x2d, 0x00, 0x00, + 0x22, 0x03, 0x0d, 0x00, 0x20, 0x00, 0x0f, 0x0b, 0x20, 0x03, 0x20, 0x01, + 0x41, 0xff, 0x01, 0x71, 0x47, 0x0d, 0x01, 0x20, 0x00, 0x0f, 0x0b, 0x20, + 0x00, 0x20, 0x00, 0x10, 0xaa, 0x80, 0x80, 0x80, 0x00, 0x6a, 0x0f, 0x0b, + 0x02, 0x40, 0x20, 0x00, 0x41, 0x01, 0x6a, 0x22, 0x03, 0x41, 0x03, 0x71, + 0x0d, 0x00, 0x20, 0x03, 0x21, 0x00, 0x0c, 0x01, 0x0b, 0x20, 0x03, 0x2d, + 0x00, 0x00, 0x22, 0x04, 0x45, 0x0d, 0x01, 0x20, 0x04, 0x20, 0x01, 0x41, + 0xff, 0x01, 0x71, 0x46, 0x0d, 0x01, 0x02, 0x40, 0x20, 0x00, 0x41, 0x02, + 0x6a, 0x22, 0x03, 0x41, 0x03, 0x71, 0x0d, 0x00, 0x20, 0x03, 0x21, 0x00, + 0x0c, 0x01, 0x0b, 0x20, 0x03, 0x2d, 0x00, 0x00, 0x22, 0x04, 0x45, 0x0d, + 0x01, 0x20, 0x04, 0x20, 0x01, 0x41, 0xff, 0x01, 0x71, 0x46, 0x0d, 0x01, + 0x02, 0x40, 0x20, 0x00, 0x41, 0x03, 0x6a, 0x22, 0x03, 0x41, 0x03, 0x71, + 0x0d, 0x00, 0x20, 0x03, 0x21, 0x00, 0x0c, 0x01, 0x0b, 0x20, 0x03, 0x2d, + 0x00, 0x00, 0x22, 0x04, 0x45, 0x0d, 0x01, 0x20, 0x04, 0x20, 0x01, 0x41, + 0xff, 0x01, 0x71, 0x46, 0x0d, 0x01, 0x20, 0x00, 0x41, 0x04, 0x6a, 0x21, + 0x00, 0x0b, 0x02, 0x40, 0x20, 0x00, 0x28, 0x02, 0x00, 0x22, 0x03, 0x41, + 0x7f, 0x73, 0x20, 0x03, 0x41, 0xff, 0xfd, 0xfb, 0x77, 0x6a, 0x71, 0x41, + 0x80, 0x81, 0x82, 0x84, 0x78, 0x71, 0x0d, 0x00, 0x20, 0x02, 0x41, 0x81, + 0x82, 0x84, 0x08, 0x6c, 0x21, 0x02, 0x03, 0x40, 0x20, 0x03, 0x20, 0x02, + 0x73, 0x22, 0x03, 0x41, 0x7f, 0x73, 0x20, 0x03, 0x41, 0xff, 0xfd, 0xfb, + 0x77, 0x6a, 0x71, 0x41, 0x80, 0x81, 0x82, 0x84, 0x78, 0x71, 0x0d, 0x01, + 0x20, 0x00, 0x41, 0x04, 0x6a, 0x22, 0x00, 0x28, 0x02, 0x00, 0x22, 0x03, + 0x41, 0x7f, 0x73, 0x20, 0x03, 0x41, 0xff, 0xfd, 0xfb, 0x77, 0x6a, 0x71, + 0x41, 0x80, 0x81, 0x82, 0x84, 0x78, 0x71, 0x45, 0x0d, 0x00, 0x0b, 0x0b, + 0x20, 0x00, 0x41, 0x7f, 0x6a, 0x21, 0x03, 0x03, 0x40, 0x20, 0x03, 0x41, + 0x01, 0x6a, 0x22, 0x03, 0x2d, 0x00, 0x00, 0x22, 0x00, 0x45, 0x0d, 0x01, + 0x20, 0x00, 0x20, 0x01, 0x41, 0xff, 0x01, 0x71, 0x47, 0x0d, 0x00, 0x0b, + 0x0b, 0x20, 0x03, 0x0b, 0x1d, 0x00, 0x20, 0x00, 0x20, 0x01, 0x10, 0xd2, + 0x80, 0x80, 0x80, 0x00, 0x22, 0x00, 0x41, 0x00, 0x20, 0x00, 0x2d, 0x00, + 0x00, 0x20, 0x01, 0x41, 0xff, 0x01, 0x71, 0x46, 0x1b, 0x0b, 0x65, 0x01, + 0x03, 0x7f, 0x41, 0x80, 0x80, 0x80, 0xa0, 0x01, 0x41, 0x80, 0x80, 0x80, + 0x20, 0x41, 0x80, 0x80, 0x80, 0x80, 0x01, 0x20, 0x00, 0x2d, 0x00, 0x00, + 0x22, 0x01, 0x41, 0xf2, 0x00, 0x46, 0x22, 0x02, 0x1b, 0x20, 0x00, 0x41, + 0x2b, 0x10, 0xd3, 0x80, 0x80, 0x80, 0x00, 0x1b, 0x22, 0x03, 0x41, 0x80, + 0x80, 0x01, 0x72, 0x20, 0x03, 0x20, 0x00, 0x41, 0xf8, 0x00, 0x10, 0xd3, + 0x80, 0x80, 0x80, 0x00, 0x1b, 0x22, 0x00, 0x20, 0x00, 0x41, 0x80, 0x20, + 0x72, 0x20, 0x02, 0x1b, 0x22, 0x00, 0x41, 0x80, 0x80, 0x02, 0x72, 0x20, + 0x00, 0x20, 0x01, 0x41, 0xf7, 0x00, 0x46, 0x1b, 0x20, 0x01, 0x41, 0xe1, + 0x00, 0x46, 0x72, 0x0b, 0x92, 0x02, 0x02, 0x01, 0x7f, 0x02, 0x7e, 0x23, + 0x80, 0x80, 0x80, 0x80, 0x00, 0x41, 0x20, 0x6b, 0x22, 0x03, 0x24, 0x80, + 0x80, 0x80, 0x80, 0x00, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, + 0x02, 0x40, 0x02, 0x40, 0x20, 0x01, 0x41, 0x7f, 0x6a, 0x0e, 0x04, 0x05, + 0x00, 0x01, 0x02, 0x03, 0x0b, 0x41, 0x00, 0x21, 0x01, 0x0c, 0x04, 0x0b, + 0x02, 0x40, 0x20, 0x00, 0x20, 0x03, 0x41, 0x08, 0x6a, 0x10, 0x9a, 0x80, + 0x80, 0x80, 0x00, 0x22, 0x01, 0x45, 0x0d, 0x00, 0x41, 0x00, 0x20, 0x01, + 0x36, 0x02, 0xb4, 0x9e, 0x80, 0x80, 0x00, 0x0c, 0x03, 0x0b, 0x20, 0x03, + 0x29, 0x03, 0x10, 0x22, 0x04, 0x42, 0xc0, 0x00, 0x83, 0x21, 0x05, 0x20, + 0x03, 0x2f, 0x01, 0x0a, 0x21, 0x01, 0x02, 0x40, 0x20, 0x04, 0x42, 0x82, + 0x80, 0x01, 0x83, 0x50, 0x0d, 0x00, 0x02, 0x40, 0x20, 0x05, 0x50, 0x0d, + 0x00, 0x20, 0x01, 0x41, 0x80, 0x80, 0x80, 0xa0, 0x01, 0x72, 0x21, 0x01, + 0x0c, 0x05, 0x0b, 0x20, 0x01, 0x41, 0x80, 0x80, 0x80, 0x20, 0x72, 0x21, + 0x01, 0x0c, 0x04, 0x0b, 0x02, 0x40, 0x20, 0x05, 0x50, 0x0d, 0x00, 0x20, + 0x01, 0x41, 0x80, 0x80, 0x80, 0x80, 0x01, 0x72, 0x21, 0x01, 0x0c, 0x04, + 0x0b, 0x20, 0x01, 0x41, 0x80, 0x80, 0x80, 0xc0, 0x00, 0x72, 0x21, 0x01, + 0x0c, 0x03, 0x0b, 0x20, 0x03, 0x20, 0x02, 0x41, 0x04, 0x6a, 0x36, 0x02, + 0x08, 0x02, 0x40, 0x20, 0x00, 0x20, 0x02, 0x28, 0x02, 0x00, 0x41, 0xff, + 0x1f, 0x71, 0x10, 0x9b, 0x80, 0x80, 0x80, 0x00, 0x22, 0x01, 0x0d, 0x00, + 0x41, 0x00, 0x21, 0x01, 0x0c, 0x03, 0x0b, 0x41, 0x00, 0x20, 0x01, 0x36, + 0x02, 0xb4, 0x9e, 0x80, 0x80, 0x00, 0x0c, 0x01, 0x0b, 0x41, 0x00, 0x41, + 0x1c, 0x36, 0x02, 0xb4, 0x9e, 0x80, 0x80, 0x00, 0x0b, 0x41, 0x7f, 0x21, + 0x01, 0x0b, 0x20, 0x03, 0x41, 0x20, 0x6a, 0x24, 0x80, 0x80, 0x80, 0x80, + 0x00, 0x20, 0x01, 0x0b, 0x71, 0x01, 0x02, 0x7f, 0x23, 0x80, 0x80, 0x80, + 0x80, 0x00, 0x41, 0x10, 0x6b, 0x22, 0x03, 0x24, 0x80, 0x80, 0x80, 0x80, + 0x00, 0x41, 0x7f, 0x21, 0x04, 0x02, 0x40, 0x02, 0x40, 0x20, 0x02, 0x41, + 0x7f, 0x4a, 0x0d, 0x00, 0x41, 0x00, 0x41, 0x1c, 0x36, 0x02, 0xb4, 0x9e, + 0x80, 0x80, 0x00, 0x0c, 0x01, 0x0b, 0x02, 0x40, 0x20, 0x00, 0x20, 0x01, + 0x20, 0x02, 0x20, 0x03, 0x41, 0x0c, 0x6a, 0x10, 0x9e, 0x80, 0x80, 0x80, + 0x00, 0x22, 0x02, 0x45, 0x0d, 0x00, 0x41, 0x00, 0x20, 0x02, 0x36, 0x02, + 0xb4, 0x9e, 0x80, 0x80, 0x00, 0x41, 0x7f, 0x21, 0x04, 0x0c, 0x01, 0x0b, + 0x20, 0x03, 0x28, 0x02, 0x0c, 0x21, 0x04, 0x0b, 0x20, 0x03, 0x41, 0x10, + 0x6a, 0x24, 0x80, 0x80, 0x80, 0x80, 0x00, 0x20, 0x04, 0x0b, 0x70, 0x01, + 0x01, 0x7f, 0x23, 0x80, 0x80, 0x80, 0x80, 0x00, 0x41, 0x10, 0x6b, 0x22, + 0x03, 0x24, 0x80, 0x80, 0x80, 0x80, 0x00, 0x20, 0x03, 0x20, 0x02, 0x36, + 0x02, 0x0c, 0x20, 0x03, 0x20, 0x01, 0x36, 0x02, 0x08, 0x02, 0x40, 0x02, + 0x40, 0x20, 0x00, 0x20, 0x03, 0x41, 0x08, 0x6a, 0x41, 0x01, 0x20, 0x03, + 0x41, 0x04, 0x6a, 0x10, 0x9e, 0x80, 0x80, 0x80, 0x00, 0x22, 0x02, 0x45, + 0x0d, 0x00, 0x41, 0x00, 0x41, 0x08, 0x20, 0x02, 0x20, 0x02, 0x41, 0xcc, + 0x00, 0x46, 0x1b, 0x36, 0x02, 0xb4, 0x9e, 0x80, 0x80, 0x00, 0x41, 0x7f, + 0x21, 0x02, 0x0c, 0x01, 0x0b, 0x20, 0x03, 0x28, 0x02, 0x04, 0x21, 0x02, + 0x0b, 0x20, 0x03, 0x41, 0x10, 0x6a, 0x24, 0x80, 0x80, 0x80, 0x80, 0x00, + 0x20, 0x02, 0x0b, 0xfc, 0x01, 0x01, 0x05, 0x7f, 0x23, 0x80, 0x80, 0x80, + 0x80, 0x00, 0x41, 0x10, 0x6b, 0x22, 0x03, 0x24, 0x80, 0x80, 0x80, 0x80, + 0x00, 0x20, 0x03, 0x20, 0x01, 0x36, 0x02, 0x00, 0x20, 0x03, 0x20, 0x00, + 0x28, 0x02, 0x2c, 0x22, 0x04, 0x36, 0x02, 0x0c, 0x20, 0x03, 0x20, 0x00, + 0x28, 0x02, 0x28, 0x22, 0x05, 0x36, 0x02, 0x08, 0x20, 0x03, 0x20, 0x02, + 0x20, 0x04, 0x41, 0x00, 0x47, 0x6b, 0x22, 0x06, 0x36, 0x02, 0x04, 0x20, + 0x00, 0x28, 0x02, 0x38, 0x21, 0x07, 0x02, 0x40, 0x02, 0x40, 0x20, 0x06, + 0x45, 0x0d, 0x00, 0x20, 0x07, 0x20, 0x03, 0x41, 0x02, 0x10, 0xd6, 0x80, + 0x80, 0x80, 0x00, 0x21, 0x04, 0x0c, 0x01, 0x0b, 0x20, 0x07, 0x20, 0x05, + 0x20, 0x04, 0x10, 0xd7, 0x80, 0x80, 0x80, 0x00, 0x21, 0x04, 0x0b, 0x41, + 0x00, 0x21, 0x06, 0x02, 0x40, 0x02, 0x40, 0x20, 0x04, 0x41, 0x00, 0x4a, + 0x0d, 0x00, 0x20, 0x00, 0x20, 0x00, 0x28, 0x02, 0x00, 0x41, 0x20, 0x41, + 0x10, 0x20, 0x04, 0x1b, 0x72, 0x36, 0x02, 0x00, 0x0c, 0x01, 0x0b, 0x02, + 0x40, 0x20, 0x04, 0x20, 0x03, 0x28, 0x02, 0x04, 0x22, 0x07, 0x4b, 0x0d, + 0x00, 0x20, 0x04, 0x21, 0x06, 0x0c, 0x01, 0x0b, 0x20, 0x00, 0x20, 0x00, + 0x28, 0x02, 0x28, 0x22, 0x06, 0x36, 0x02, 0x04, 0x20, 0x00, 0x20, 0x06, + 0x20, 0x04, 0x20, 0x07, 0x6b, 0x6a, 0x36, 0x02, 0x08, 0x02, 0x40, 0x20, + 0x00, 0x28, 0x02, 0x2c, 0x45, 0x0d, 0x00, 0x20, 0x00, 0x20, 0x06, 0x41, + 0x01, 0x6a, 0x36, 0x02, 0x04, 0x20, 0x02, 0x20, 0x01, 0x6a, 0x41, 0x7f, + 0x6a, 0x20, 0x06, 0x2d, 0x00, 0x00, 0x3a, 0x00, 0x00, 0x0b, 0x20, 0x02, + 0x21, 0x06, 0x0b, 0x20, 0x03, 0x41, 0x10, 0x6a, 0x24, 0x80, 0x80, 0x80, + 0x80, 0x00, 0x20, 0x06, 0x0b, 0x37, 0x01, 0x02, 0x7f, 0x20, 0x00, 0x10, + 0xb3, 0x80, 0x80, 0x80, 0x00, 0x22, 0x01, 0x28, 0x02, 0x00, 0x36, 0x02, + 0x34, 0x02, 0x40, 0x20, 0x01, 0x28, 0x02, 0x00, 0x22, 0x02, 0x45, 0x0d, + 0x00, 0x20, 0x02, 0x20, 0x00, 0x36, 0x02, 0x30, 0x0b, 0x20, 0x01, 0x20, + 0x00, 0x36, 0x02, 0x00, 0x10, 0xb4, 0x80, 0x80, 0x80, 0x00, 0x20, 0x00, + 0x0b, 0x85, 0x03, 0x01, 0x04, 0x7f, 0x23, 0x80, 0x80, 0x80, 0x80, 0x00, + 0x41, 0x20, 0x6b, 0x22, 0x02, 0x24, 0x80, 0x80, 0x80, 0x80, 0x00, 0x02, + 0x40, 0x02, 0x40, 0x41, 0xf0, 0x95, 0x80, 0x80, 0x00, 0x20, 0x01, 0x2c, + 0x00, 0x00, 0x22, 0x03, 0x41, 0x04, 0x10, 0xbc, 0x80, 0x80, 0x80, 0x00, + 0x0d, 0x00, 0x41, 0x00, 0x21, 0x04, 0x41, 0x00, 0x41, 0x1c, 0x36, 0x02, + 0xb4, 0x9e, 0x80, 0x80, 0x00, 0x0c, 0x01, 0x0b, 0x02, 0x40, 0x41, 0xf8, + 0x08, 0x10, 0x90, 0x80, 0x80, 0x80, 0x00, 0x22, 0x04, 0x0d, 0x00, 0x41, + 0x00, 0x21, 0x04, 0x0c, 0x01, 0x0b, 0x41, 0x00, 0x21, 0x05, 0x20, 0x04, + 0x41, 0x00, 0x41, 0xf0, 0x00, 0x10, 0xa9, 0x80, 0x80, 0x80, 0x00, 0x21, + 0x04, 0x02, 0x40, 0x20, 0x01, 0x41, 0x2b, 0x10, 0xd3, 0x80, 0x80, 0x80, + 0x00, 0x0d, 0x00, 0x20, 0x04, 0x41, 0x08, 0x41, 0x04, 0x20, 0x03, 0x41, + 0xf2, 0x00, 0x46, 0x1b, 0x22, 0x05, 0x36, 0x02, 0x00, 0x0b, 0x02, 0x40, + 0x20, 0x01, 0x41, 0xe5, 0x00, 0x10, 0xd3, 0x80, 0x80, 0x80, 0x00, 0x45, + 0x0d, 0x00, 0x20, 0x02, 0x41, 0x01, 0x36, 0x02, 0x10, 0x20, 0x00, 0x41, + 0x02, 0x20, 0x02, 0x41, 0x10, 0x6a, 0x10, 0xd5, 0x80, 0x80, 0x80, 0x00, + 0x1a, 0x20, 0x01, 0x2d, 0x00, 0x00, 0x21, 0x03, 0x0b, 0x02, 0x40, 0x20, + 0x03, 0x41, 0xff, 0x01, 0x71, 0x41, 0xe1, 0x00, 0x47, 0x0d, 0x00, 0x02, + 0x40, 0x20, 0x00, 0x41, 0x03, 0x41, 0x00, 0x10, 0xd5, 0x80, 0x80, 0x80, + 0x00, 0x22, 0x01, 0x41, 0x01, 0x71, 0x0d, 0x00, 0x20, 0x02, 0x20, 0x01, + 0x41, 0x01, 0x72, 0x36, 0x02, 0x00, 0x20, 0x00, 0x41, 0x04, 0x20, 0x02, + 0x10, 0xd5, 0x80, 0x80, 0x80, 0x00, 0x1a, 0x0b, 0x20, 0x04, 0x20, 0x05, + 0x41, 0x80, 0x01, 0x72, 0x22, 0x05, 0x36, 0x02, 0x00, 0x0b, 0x20, 0x04, + 0x41, 0x7f, 0x36, 0x02, 0x40, 0x20, 0x04, 0x41, 0x80, 0x08, 0x36, 0x02, + 0x2c, 0x20, 0x04, 0x20, 0x00, 0x36, 0x02, 0x38, 0x20, 0x04, 0x20, 0x04, + 0x41, 0xf8, 0x00, 0x6a, 0x36, 0x02, 0x28, 0x02, 0x40, 0x20, 0x05, 0x41, + 0x08, 0x71, 0x0d, 0x00, 0x20, 0x00, 0x10, 0xaf, 0x80, 0x80, 0x80, 0x00, + 0x45, 0x0d, 0x00, 0x20, 0x04, 0x41, 0x0a, 0x36, 0x02, 0x40, 0x0b, 0x20, + 0x04, 0x41, 0x84, 0x80, 0x80, 0x80, 0x00, 0x36, 0x02, 0x24, 0x20, 0x04, + 0x41, 0x81, 0x80, 0x80, 0x80, 0x00, 0x36, 0x02, 0x20, 0x20, 0x04, 0x41, + 0x85, 0x80, 0x80, 0x80, 0x00, 0x36, 0x02, 0x1c, 0x20, 0x04, 0x41, 0x82, + 0x80, 0x80, 0x80, 0x00, 0x36, 0x02, 0x0c, 0x20, 0x04, 0x10, 0xd9, 0x80, + 0x80, 0x80, 0x00, 0x21, 0x04, 0x0b, 0x20, 0x02, 0x41, 0x20, 0x6a, 0x24, + 0x80, 0x80, 0x80, 0x80, 0x00, 0x20, 0x04, 0x0b, 0x65, 0x01, 0x01, 0x7f, + 0x02, 0x40, 0x41, 0xf0, 0x95, 0x80, 0x80, 0x00, 0x20, 0x01, 0x2c, 0x00, + 0x00, 0x41, 0x04, 0x10, 0xbc, 0x80, 0x80, 0x80, 0x00, 0x0d, 0x00, 0x41, + 0x00, 0x41, 0x1c, 0x36, 0x02, 0xb4, 0x9e, 0x80, 0x80, 0x00, 0x41, 0x00, + 0x0f, 0x0b, 0x41, 0x00, 0x21, 0x02, 0x02, 0x40, 0x20, 0x00, 0x20, 0x01, + 0x10, 0xd4, 0x80, 0x80, 0x80, 0x00, 0x10, 0xd0, 0x80, 0x80, 0x80, 0x00, + 0x22, 0x00, 0x41, 0x00, 0x48, 0x0d, 0x00, 0x20, 0x00, 0x20, 0x01, 0x10, + 0xda, 0x80, 0x80, 0x80, 0x00, 0x22, 0x02, 0x0d, 0x00, 0x20, 0x00, 0x10, + 0xab, 0x80, 0x80, 0x80, 0x00, 0x1a, 0x41, 0x00, 0x21, 0x02, 0x0b, 0x20, + 0x02, 0x0b, 0xb1, 0x01, 0x01, 0x01, 0x7e, 0x02, 0x40, 0x20, 0x02, 0x41, + 0x03, 0x49, 0x0d, 0x00, 0x41, 0x00, 0x41, 0x1c, 0x36, 0x02, 0xb4, 0x9e, + 0x80, 0x80, 0x00, 0x41, 0x7f, 0x0f, 0x0b, 0x20, 0x01, 0xac, 0x21, 0x03, + 0x02, 0x40, 0x20, 0x02, 0x41, 0x01, 0x47, 0x0d, 0x00, 0x20, 0x00, 0x28, + 0x02, 0x08, 0x22, 0x01, 0x45, 0x0d, 0x00, 0x20, 0x03, 0x20, 0x01, 0x20, + 0x00, 0x28, 0x02, 0x04, 0x6b, 0xac, 0x7d, 0x21, 0x03, 0x0b, 0x02, 0x40, + 0x20, 0x00, 0x28, 0x02, 0x14, 0x20, 0x00, 0x28, 0x02, 0x18, 0x46, 0x0d, + 0x00, 0x20, 0x00, 0x41, 0x00, 0x41, 0x00, 0x20, 0x00, 0x28, 0x02, 0x20, + 0x11, 0x80, 0x80, 0x80, 0x80, 0x00, 0x00, 0x1a, 0x20, 0x00, 0x28, 0x02, + 0x14, 0x0d, 0x00, 0x41, 0x7f, 0x0f, 0x0b, 0x20, 0x00, 0x41, 0x00, 0x36, + 0x02, 0x18, 0x20, 0x00, 0x42, 0x00, 0x37, 0x03, 0x10, 0x02, 0x40, 0x20, + 0x00, 0x20, 0x03, 0x20, 0x02, 0x20, 0x00, 0x28, 0x02, 0x24, 0x11, 0x81, + 0x80, 0x80, 0x80, 0x00, 0x00, 0x42, 0x00, 0x59, 0x0d, 0x00, 0x41, 0x7f, + 0x0f, 0x0b, 0x20, 0x00, 0x42, 0x00, 0x37, 0x02, 0x04, 0x20, 0x00, 0x20, + 0x00, 0x28, 0x02, 0x00, 0x41, 0x6f, 0x71, 0x36, 0x02, 0x00, 0x41, 0x00, + 0x0b, 0x85, 0x01, 0x01, 0x02, 0x7f, 0x20, 0x00, 0x20, 0x00, 0x28, 0x02, + 0x3c, 0x22, 0x01, 0x41, 0x7f, 0x6a, 0x20, 0x01, 0x72, 0x36, 0x02, 0x3c, + 0x02, 0x40, 0x20, 0x00, 0x28, 0x02, 0x14, 0x20, 0x00, 0x28, 0x02, 0x18, + 0x46, 0x0d, 0x00, 0x20, 0x00, 0x41, 0x00, 0x41, 0x00, 0x20, 0x00, 0x28, + 0x02, 0x20, 0x11, 0x80, 0x80, 0x80, 0x80, 0x00, 0x00, 0x1a, 0x0b, 0x20, + 0x00, 0x41, 0x00, 0x36, 0x02, 0x18, 0x20, 0x00, 0x42, 0x00, 0x37, 0x03, + 0x10, 0x02, 0x40, 0x20, 0x00, 0x28, 0x02, 0x00, 0x22, 0x01, 0x41, 0x04, + 0x71, 0x45, 0x0d, 0x00, 0x20, 0x00, 0x20, 0x01, 0x41, 0x20, 0x72, 0x36, + 0x02, 0x00, 0x41, 0x7f, 0x0f, 0x0b, 0x20, 0x00, 0x20, 0x00, 0x28, 0x02, + 0x28, 0x20, 0x00, 0x28, 0x02, 0x2c, 0x6a, 0x22, 0x02, 0x36, 0x02, 0x08, + 0x20, 0x00, 0x20, 0x02, 0x36, 0x02, 0x04, 0x20, 0x01, 0x41, 0x1b, 0x74, + 0x41, 0x1f, 0x75, 0x0b, 0xc4, 0x01, 0x01, 0x03, 0x7f, 0x20, 0x03, 0x20, + 0x03, 0x28, 0x02, 0x3c, 0x22, 0x04, 0x41, 0x7f, 0x6a, 0x20, 0x04, 0x72, + 0x36, 0x02, 0x3c, 0x20, 0x02, 0x20, 0x01, 0x6c, 0x21, 0x05, 0x02, 0x40, + 0x02, 0x40, 0x20, 0x03, 0x28, 0x02, 0x04, 0x22, 0x04, 0x20, 0x03, 0x28, + 0x02, 0x08, 0x22, 0x06, 0x47, 0x0d, 0x00, 0x20, 0x05, 0x21, 0x04, 0x0c, + 0x01, 0x0b, 0x20, 0x00, 0x20, 0x04, 0x20, 0x06, 0x20, 0x04, 0x6b, 0x22, + 0x06, 0x20, 0x05, 0x20, 0x06, 0x20, 0x05, 0x49, 0x1b, 0x22, 0x06, 0x10, + 0xa8, 0x80, 0x80, 0x80, 0x00, 0x21, 0x00, 0x20, 0x03, 0x20, 0x04, 0x20, + 0x06, 0x6a, 0x36, 0x02, 0x04, 0x20, 0x05, 0x20, 0x06, 0x6b, 0x21, 0x04, + 0x20, 0x00, 0x20, 0x06, 0x6a, 0x21, 0x00, 0x0b, 0x20, 0x02, 0x41, 0x00, + 0x20, 0x01, 0x1b, 0x21, 0x06, 0x02, 0x40, 0x20, 0x04, 0x45, 0x0d, 0x00, + 0x03, 0x40, 0x02, 0x40, 0x02, 0x40, 0x20, 0x03, 0x10, 0xdd, 0x80, 0x80, + 0x80, 0x00, 0x0d, 0x00, 0x20, 0x03, 0x20, 0x00, 0x20, 0x04, 0x20, 0x03, + 0x28, 0x02, 0x1c, 0x11, 0x80, 0x80, 0x80, 0x80, 0x00, 0x00, 0x22, 0x02, + 0x0d, 0x01, 0x0b, 0x20, 0x05, 0x20, 0x04, 0x6b, 0x20, 0x01, 0x6e, 0x0f, + 0x0b, 0x20, 0x00, 0x20, 0x02, 0x6a, 0x21, 0x00, 0x20, 0x04, 0x20, 0x02, + 0x6b, 0x22, 0x04, 0x0d, 0x00, 0x0b, 0x0b, 0x20, 0x06, 0x0b, 0xe8, 0x02, + 0x01, 0x03, 0x7f, 0x02, 0x40, 0x20, 0x00, 0x0d, 0x00, 0x41, 0x00, 0x21, + 0x01, 0x02, 0x40, 0x41, 0x00, 0x28, 0x02, 0xb0, 0x9d, 0x80, 0x80, 0x00, + 0x45, 0x0d, 0x00, 0x41, 0x00, 0x28, 0x02, 0xb0, 0x9d, 0x80, 0x80, 0x00, + 0x10, 0xdf, 0x80, 0x80, 0x80, 0x00, 0x21, 0x01, 0x0b, 0x02, 0x40, 0x41, + 0x00, 0x28, 0x02, 0xa8, 0x9e, 0x80, 0x80, 0x00, 0x45, 0x0d, 0x00, 0x41, + 0x00, 0x28, 0x02, 0xa8, 0x9e, 0x80, 0x80, 0x00, 0x10, 0xdf, 0x80, 0x80, + 0x80, 0x00, 0x20, 0x01, 0x72, 0x21, 0x01, 0x0b, 0x02, 0x40, 0x10, 0xb3, + 0x80, 0x80, 0x80, 0x00, 0x28, 0x02, 0x00, 0x22, 0x00, 0x45, 0x0d, 0x00, + 0x03, 0x40, 0x02, 0x40, 0x20, 0x00, 0x28, 0x02, 0x14, 0x20, 0x00, 0x28, + 0x02, 0x18, 0x46, 0x0d, 0x00, 0x20, 0x00, 0x41, 0x00, 0x41, 0x00, 0x20, + 0x00, 0x28, 0x02, 0x20, 0x11, 0x80, 0x80, 0x80, 0x80, 0x00, 0x00, 0x1a, + 0x02, 0x40, 0x02, 0x40, 0x20, 0x00, 0x28, 0x02, 0x14, 0x0d, 0x00, 0x41, + 0x7f, 0x21, 0x02, 0x0c, 0x01, 0x0b, 0x02, 0x40, 0x20, 0x00, 0x28, 0x02, + 0x04, 0x22, 0x02, 0x20, 0x00, 0x28, 0x02, 0x08, 0x22, 0x03, 0x46, 0x0d, + 0x00, 0x20, 0x00, 0x20, 0x02, 0x20, 0x03, 0x6b, 0xac, 0x41, 0x01, 0x20, + 0x00, 0x28, 0x02, 0x24, 0x11, 0x81, 0x80, 0x80, 0x80, 0x00, 0x00, 0x1a, + 0x0b, 0x41, 0x00, 0x21, 0x02, 0x20, 0x00, 0x41, 0x00, 0x36, 0x02, 0x18, + 0x20, 0x00, 0x42, 0x00, 0x37, 0x03, 0x10, 0x20, 0x00, 0x42, 0x00, 0x37, + 0x02, 0x04, 0x0b, 0x20, 0x02, 0x20, 0x01, 0x72, 0x21, 0x01, 0x0b, 0x20, + 0x00, 0x28, 0x02, 0x34, 0x22, 0x00, 0x0d, 0x00, 0x0b, 0x0b, 0x10, 0xb4, + 0x80, 0x80, 0x80, 0x00, 0x20, 0x01, 0x0f, 0x0b, 0x02, 0x40, 0x20, 0x00, + 0x28, 0x02, 0x14, 0x20, 0x00, 0x28, 0x02, 0x18, 0x46, 0x0d, 0x00, 0x20, + 0x00, 0x41, 0x00, 0x41, 0x00, 0x20, 0x00, 0x28, 0x02, 0x20, 0x11, 0x80, + 0x80, 0x80, 0x80, 0x00, 0x00, 0x1a, 0x20, 0x00, 0x28, 0x02, 0x14, 0x0d, + 0x00, 0x41, 0x7f, 0x0f, 0x0b, 0x02, 0x40, 0x20, 0x00, 0x28, 0x02, 0x04, + 0x22, 0x01, 0x20, 0x00, 0x28, 0x02, 0x08, 0x22, 0x02, 0x46, 0x0d, 0x00, + 0x20, 0x00, 0x20, 0x01, 0x20, 0x02, 0x6b, 0xac, 0x41, 0x01, 0x20, 0x00, + 0x28, 0x02, 0x24, 0x11, 0x81, 0x80, 0x80, 0x80, 0x00, 0x00, 0x1a, 0x0b, + 0x20, 0x00, 0x41, 0x00, 0x36, 0x02, 0x18, 0x20, 0x00, 0x42, 0x00, 0x37, + 0x03, 0x10, 0x20, 0x00, 0x42, 0x00, 0x37, 0x02, 0x04, 0x41, 0x00, 0x0b, + 0x02, 0x00, 0x0b, 0x98, 0x01, 0x01, 0x05, 0x7f, 0x20, 0x00, 0x10, 0xdf, + 0x80, 0x80, 0x80, 0x00, 0x21, 0x01, 0x20, 0x00, 0x20, 0x00, 0x28, 0x02, + 0x0c, 0x11, 0x82, 0x80, 0x80, 0x80, 0x00, 0x00, 0x21, 0x02, 0x02, 0x40, + 0x20, 0x00, 0x2d, 0x00, 0x00, 0x41, 0x01, 0x71, 0x0d, 0x00, 0x20, 0x00, + 0x10, 0xe0, 0x80, 0x80, 0x80, 0x00, 0x10, 0xb3, 0x80, 0x80, 0x80, 0x00, + 0x21, 0x03, 0x02, 0x40, 0x20, 0x00, 0x28, 0x02, 0x30, 0x22, 0x04, 0x45, + 0x0d, 0x00, 0x20, 0x04, 0x20, 0x00, 0x28, 0x02, 0x34, 0x36, 0x02, 0x34, + 0x0b, 0x02, 0x40, 0x20, 0x00, 0x28, 0x02, 0x34, 0x22, 0x05, 0x45, 0x0d, + 0x00, 0x20, 0x05, 0x20, 0x04, 0x36, 0x02, 0x30, 0x0b, 0x02, 0x40, 0x20, + 0x03, 0x28, 0x02, 0x00, 0x20, 0x00, 0x47, 0x0d, 0x00, 0x20, 0x03, 0x20, + 0x05, 0x36, 0x02, 0x00, 0x0b, 0x10, 0xb4, 0x80, 0x80, 0x80, 0x00, 0x20, + 0x00, 0x28, 0x02, 0x50, 0x10, 0x92, 0x80, 0x80, 0x80, 0x00, 0x20, 0x00, + 0x10, 0x92, 0x80, 0x80, 0x80, 0x00, 0x0b, 0x20, 0x02, 0x20, 0x01, 0x72, + 0x0b, 0xd2, 0x06, 0x01, 0x51, 0x7f, 0x23, 0x80, 0x80, 0x80, 0x80, 0x00, + 0x21, 0x02, 0x41, 0xb0, 0x01, 0x21, 0x03, 0x20, 0x02, 0x20, 0x03, 0x6b, + 0x21, 0x04, 0x20, 0x04, 0x24, 0x80, 0x80, 0x80, 0x80, 0x00, 0x41, 0x00, + 0x21, 0x05, 0x20, 0x04, 0x20, 0x05, 0x36, 0x02, 0xac, 0x01, 0x20, 0x04, + 0x20, 0x00, 0x36, 0x02, 0xa8, 0x01, 0x20, 0x04, 0x20, 0x01, 0x36, 0x02, + 0xa4, 0x01, 0x41, 0x00, 0x21, 0x06, 0x20, 0x04, 0x20, 0x06, 0x36, 0x02, + 0x9c, 0x01, 0x41, 0xb9, 0x98, 0x80, 0x80, 0x00, 0x21, 0x07, 0x41, 0x00, + 0x21, 0x08, 0x20, 0x07, 0x20, 0x08, 0x10, 0xc7, 0x80, 0x80, 0x80, 0x00, + 0x1a, 0x41, 0xdc, 0x95, 0x80, 0x80, 0x00, 0x21, 0x09, 0x41, 0xff, 0x03, + 0x21, 0x0a, 0x20, 0x09, 0x20, 0x0a, 0x10, 0xd1, 0x80, 0x80, 0x80, 0x00, + 0x21, 0x0b, 0x20, 0x04, 0x20, 0x0b, 0x36, 0x02, 0xa0, 0x01, 0x20, 0x04, + 0x28, 0x02, 0xa0, 0x01, 0x21, 0x0c, 0x41, 0x00, 0x21, 0x0d, 0x20, 0x0c, + 0x21, 0x0e, 0x20, 0x0d, 0x21, 0x0f, 0x20, 0x0e, 0x20, 0x0f, 0x48, 0x21, + 0x10, 0x41, 0x01, 0x21, 0x11, 0x20, 0x10, 0x20, 0x11, 0x71, 0x21, 0x12, + 0x02, 0x40, 0x02, 0x40, 0x20, 0x12, 0x45, 0x0d, 0x00, 0x41, 0xb4, 0x9e, + 0x80, 0x80, 0x00, 0x21, 0x13, 0x20, 0x13, 0x28, 0x02, 0x00, 0x21, 0x14, + 0x20, 0x04, 0x20, 0x14, 0x36, 0x02, 0xa0, 0x01, 0x20, 0x04, 0x28, 0x02, + 0xa0, 0x01, 0x21, 0x15, 0x20, 0x04, 0x20, 0x15, 0x36, 0x02, 0x00, 0x41, + 0xcd, 0x96, 0x80, 0x80, 0x00, 0x21, 0x16, 0x20, 0x16, 0x20, 0x04, 0x10, + 0xc7, 0x80, 0x80, 0x80, 0x00, 0x1a, 0x41, 0x7f, 0x21, 0x17, 0x20, 0x04, + 0x20, 0x17, 0x36, 0x02, 0xac, 0x01, 0x0c, 0x01, 0x0b, 0x20, 0x04, 0x28, + 0x02, 0xa0, 0x01, 0x21, 0x18, 0x20, 0x04, 0x20, 0x18, 0x36, 0x02, 0x50, + 0x41, 0xe9, 0x96, 0x80, 0x80, 0x00, 0x21, 0x19, 0x41, 0xd0, 0x00, 0x21, + 0x1a, 0x20, 0x04, 0x20, 0x1a, 0x6a, 0x21, 0x1b, 0x20, 0x19, 0x20, 0x1b, + 0x10, 0xc7, 0x80, 0x80, 0x80, 0x00, 0x1a, 0x41, 0xc7, 0x95, 0x80, 0x80, + 0x00, 0x21, 0x1c, 0x41, 0xfe, 0x95, 0x80, 0x80, 0x00, 0x21, 0x1d, 0x20, + 0x1c, 0x20, 0x1d, 0x10, 0xdb, 0x80, 0x80, 0x80, 0x00, 0x21, 0x1e, 0x20, + 0x04, 0x20, 0x1e, 0x36, 0x02, 0x98, 0x01, 0x20, 0x04, 0x28, 0x02, 0x98, + 0x01, 0x21, 0x1f, 0x41, 0x00, 0x21, 0x20, 0x20, 0x1f, 0x21, 0x21, 0x20, + 0x20, 0x21, 0x22, 0x20, 0x21, 0x20, 0x22, 0x47, 0x21, 0x23, 0x41, 0x01, + 0x21, 0x24, 0x20, 0x23, 0x20, 0x24, 0x71, 0x21, 0x25, 0x02, 0x40, 0x20, + 0x25, 0x0d, 0x00, 0x41, 0xa8, 0x96, 0x80, 0x80, 0x00, 0x21, 0x26, 0x41, + 0x00, 0x21, 0x27, 0x20, 0x26, 0x20, 0x27, 0x10, 0xc7, 0x80, 0x80, 0x80, + 0x00, 0x1a, 0x41, 0x7f, 0x21, 0x28, 0x20, 0x04, 0x20, 0x28, 0x36, 0x02, + 0xac, 0x01, 0x0c, 0x01, 0x0b, 0x41, 0xbe, 0x96, 0x80, 0x80, 0x00, 0x21, + 0x29, 0x41, 0x00, 0x21, 0x2a, 0x20, 0x29, 0x20, 0x2a, 0x10, 0xc7, 0x80, + 0x80, 0x80, 0x00, 0x1a, 0x41, 0x88, 0x96, 0x80, 0x80, 0x00, 0x21, 0x2b, + 0x20, 0x04, 0x20, 0x2b, 0x36, 0x02, 0x94, 0x01, 0x41, 0x0d, 0x21, 0x2c, + 0x20, 0x04, 0x20, 0x2c, 0x36, 0x02, 0x90, 0x01, 0x20, 0x04, 0x28, 0x02, + 0x94, 0x01, 0x21, 0x2d, 0x20, 0x04, 0x28, 0x02, 0x98, 0x01, 0x21, 0x2e, + 0x41, 0x01, 0x21, 0x2f, 0x41, 0x0d, 0x21, 0x30, 0x20, 0x2d, 0x20, 0x2f, + 0x20, 0x30, 0x20, 0x2e, 0x10, 0xb8, 0x80, 0x80, 0x80, 0x00, 0x21, 0x31, + 0x20, 0x04, 0x20, 0x31, 0x36, 0x02, 0x8c, 0x01, 0x20, 0x04, 0x28, 0x02, + 0x8c, 0x01, 0x21, 0x32, 0x20, 0x04, 0x20, 0x32, 0x36, 0x02, 0x10, 0x41, + 0x8f, 0x97, 0x80, 0x80, 0x00, 0x21, 0x33, 0x41, 0x10, 0x21, 0x34, 0x20, + 0x04, 0x20, 0x34, 0x6a, 0x21, 0x35, 0x20, 0x33, 0x20, 0x35, 0x10, 0xc7, + 0x80, 0x80, 0x80, 0x00, 0x1a, 0x20, 0x04, 0x28, 0x02, 0x98, 0x01, 0x21, + 0x36, 0x41, 0x00, 0x21, 0x37, 0x20, 0x36, 0x20, 0x37, 0x20, 0x37, 0x10, + 0xdc, 0x80, 0x80, 0x80, 0x00, 0x21, 0x38, 0x20, 0x04, 0x20, 0x38, 0x36, + 0x02, 0xa0, 0x01, 0x20, 0x04, 0x28, 0x02, 0xa0, 0x01, 0x21, 0x39, 0x20, + 0x04, 0x20, 0x39, 0x36, 0x02, 0x20, 0x41, 0xfc, 0x96, 0x80, 0x80, 0x00, + 0x21, 0x3a, 0x41, 0x20, 0x21, 0x3b, 0x20, 0x04, 0x20, 0x3b, 0x6a, 0x21, + 0x3c, 0x20, 0x3a, 0x20, 0x3c, 0x10, 0xc7, 0x80, 0x80, 0x80, 0x00, 0x1a, + 0x41, 0xe0, 0x00, 0x21, 0x3d, 0x20, 0x04, 0x20, 0x3d, 0x6a, 0x21, 0x3e, + 0x20, 0x3e, 0x21, 0x3f, 0x20, 0x04, 0x28, 0x02, 0x98, 0x01, 0x21, 0x40, + 0x41, 0x01, 0x21, 0x41, 0x41, 0x20, 0x21, 0x42, 0x20, 0x3f, 0x20, 0x41, + 0x20, 0x42, 0x20, 0x40, 0x10, 0xde, 0x80, 0x80, 0x80, 0x00, 0x21, 0x43, + 0x20, 0x04, 0x20, 0x43, 0x36, 0x02, 0x8c, 0x01, 0x20, 0x04, 0x28, 0x02, + 0x8c, 0x01, 0x21, 0x44, 0x20, 0x04, 0x20, 0x44, 0x36, 0x02, 0x30, 0x41, + 0xa3, 0x97, 0x80, 0x80, 0x00, 0x21, 0x45, 0x41, 0x30, 0x21, 0x46, 0x20, + 0x04, 0x20, 0x46, 0x6a, 0x21, 0x47, 0x20, 0x45, 0x20, 0x47, 0x10, 0xc7, + 0x80, 0x80, 0x80, 0x00, 0x1a, 0x41, 0xe0, 0x00, 0x21, 0x48, 0x20, 0x04, + 0x20, 0x48, 0x6a, 0x21, 0x49, 0x20, 0x49, 0x21, 0x4a, 0x20, 0x04, 0x20, + 0x4a, 0x36, 0x02, 0x40, 0x41, 0x96, 0x96, 0x80, 0x80, 0x00, 0x21, 0x4b, + 0x41, 0xc0, 0x00, 0x21, 0x4c, 0x20, 0x04, 0x20, 0x4c, 0x6a, 0x21, 0x4d, + 0x20, 0x4b, 0x20, 0x4d, 0x10, 0xc7, 0x80, 0x80, 0x80, 0x00, 0x1a, 0x20, + 0x04, 0x28, 0x02, 0x98, 0x01, 0x21, 0x4e, 0x20, 0x4e, 0x10, 0xe1, 0x80, + 0x80, 0x80, 0x00, 0x1a, 0x41, 0x00, 0x21, 0x4f, 0x20, 0x04, 0x20, 0x4f, + 0x36, 0x02, 0xac, 0x01, 0x0b, 0x20, 0x04, 0x28, 0x02, 0xac, 0x01, 0x21, + 0x50, 0x41, 0xb0, 0x01, 0x21, 0x51, 0x20, 0x04, 0x20, 0x51, 0x6a, 0x21, + 0x52, 0x20, 0x52, 0x24, 0x80, 0x80, 0x80, 0x80, 0x00, 0x20, 0x50, 0x0f, + 0x0b, 0x0b, 0xbb, 0x16, 0x02, 0x00, 0x41, 0x80, 0x08, 0x0b, 0xc0, 0x14, + 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x00, 0x49, 0x6c, 0x6c, 0x65, + 0x67, 0x61, 0x6c, 0x20, 0x62, 0x79, 0x74, 0x65, 0x20, 0x73, 0x65, 0x71, + 0x75, 0x65, 0x6e, 0x63, 0x65, 0x00, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, + 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x00, 0x52, 0x65, 0x73, 0x75, 0x6c, + 0x74, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x72, 0x65, 0x70, 0x72, 0x65, 0x73, + 0x65, 0x6e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x00, 0x4e, 0x6f, 0x74, 0x20, + 0x61, 0x20, 0x74, 0x74, 0x79, 0x00, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, + 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x64, 0x65, 0x6e, 0x69, 0x65, 0x64, 0x00, + 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6e, 0x6f, + 0x74, 0x20, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x00, + 0x4e, 0x6f, 0x20, 0x73, 0x75, 0x63, 0x68, 0x20, 0x66, 0x69, 0x6c, 0x65, + 0x20, 0x6f, 0x72, 0x20, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, + 0x79, 0x00, 0x4e, 0x6f, 0x20, 0x73, 0x75, 0x63, 0x68, 0x20, 0x70, 0x72, + 0x6f, 0x63, 0x65, 0x73, 0x73, 0x00, 0x46, 0x69, 0x6c, 0x65, 0x20, 0x65, + 0x78, 0x69, 0x73, 0x74, 0x73, 0x00, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x20, + 0x74, 0x6f, 0x6f, 0x20, 0x6c, 0x61, 0x72, 0x67, 0x65, 0x20, 0x66, 0x6f, + 0x72, 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, 0x74, 0x79, 0x70, 0x65, 0x00, + 0x4e, 0x6f, 0x20, 0x73, 0x70, 0x61, 0x63, 0x65, 0x20, 0x6c, 0x65, 0x66, + 0x74, 0x20, 0x6f, 0x6e, 0x20, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x00, + 0x4f, 0x75, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x6d, 0x65, 0x6d, 0x6f, 0x72, + 0x79, 0x00, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x20, 0x62, + 0x75, 0x73, 0x79, 0x00, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x72, 0x75, 0x70, + 0x74, 0x65, 0x64, 0x20, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x20, 0x63, + 0x61, 0x6c, 0x6c, 0x00, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, + 0x20, 0x74, 0x65, 0x6d, 0x70, 0x6f, 0x72, 0x61, 0x72, 0x69, 0x6c, 0x79, + 0x20, 0x75, 0x6e, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, + 0x00, 0x49, 0x6e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x20, 0x73, 0x65, 0x65, + 0x6b, 0x00, 0x43, 0x72, 0x6f, 0x73, 0x73, 0x2d, 0x64, 0x65, 0x76, 0x69, + 0x63, 0x65, 0x20, 0x6c, 0x69, 0x6e, 0x6b, 0x00, 0x52, 0x65, 0x61, 0x64, + 0x2d, 0x6f, 0x6e, 0x6c, 0x79, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x20, 0x73, + 0x79, 0x73, 0x74, 0x65, 0x6d, 0x00, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, + 0x6f, 0x72, 0x79, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x65, 0x6d, 0x70, 0x74, + 0x79, 0x00, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x72, 0x65, 0x73, 0x65, 0x74, 0x20, 0x62, 0x79, 0x20, 0x70, 0x65, + 0x65, 0x72, 0x00, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x74, 0x69, 0x6d, 0x65, 0x64, 0x20, 0x6f, 0x75, 0x74, 0x00, 0x43, + 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x72, 0x65, + 0x66, 0x75, 0x73, 0x65, 0x64, 0x00, 0x48, 0x6f, 0x73, 0x74, 0x20, 0x69, + 0x73, 0x20, 0x75, 0x6e, 0x72, 0x65, 0x61, 0x63, 0x68, 0x61, 0x62, 0x6c, + 0x65, 0x00, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x20, 0x69, 0x6e, + 0x20, 0x75, 0x73, 0x65, 0x00, 0x42, 0x72, 0x6f, 0x6b, 0x65, 0x6e, 0x20, + 0x70, 0x69, 0x70, 0x65, 0x00, 0x49, 0x2f, 0x4f, 0x20, 0x65, 0x72, 0x72, + 0x6f, 0x72, 0x00, 0x4e, 0x6f, 0x20, 0x73, 0x75, 0x63, 0x68, 0x20, 0x64, + 0x65, 0x76, 0x69, 0x63, 0x65, 0x20, 0x6f, 0x72, 0x20, 0x61, 0x64, 0x64, + 0x72, 0x65, 0x73, 0x73, 0x00, 0x4e, 0x6f, 0x20, 0x73, 0x75, 0x63, 0x68, + 0x20, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x00, 0x4e, 0x6f, 0x74, 0x20, + 0x61, 0x20, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x00, + 0x49, 0x73, 0x20, 0x61, 0x20, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, + 0x72, 0x79, 0x00, 0x54, 0x65, 0x78, 0x74, 0x20, 0x66, 0x69, 0x6c, 0x65, + 0x20, 0x62, 0x75, 0x73, 0x79, 0x00, 0x45, 0x78, 0x65, 0x63, 0x20, 0x66, + 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x00, + 0x49, 0x6e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x20, 0x61, 0x72, 0x67, 0x75, + 0x6d, 0x65, 0x6e, 0x74, 0x00, 0x41, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, + 0x74, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x74, 0x6f, 0x6f, 0x20, 0x6c, + 0x6f, 0x6e, 0x67, 0x00, 0x53, 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x69, 0x63, + 0x20, 0x6c, 0x69, 0x6e, 0x6b, 0x20, 0x6c, 0x6f, 0x6f, 0x70, 0x00, 0x46, + 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x74, 0x6f, 0x6f, 0x20, + 0x6c, 0x6f, 0x6e, 0x67, 0x00, 0x54, 0x6f, 0x6f, 0x20, 0x6d, 0x61, 0x6e, + 0x79, 0x20, 0x6f, 0x70, 0x65, 0x6e, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x73, + 0x20, 0x69, 0x6e, 0x20, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x00, 0x4e, + 0x6f, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x6f, 0x72, 0x73, 0x20, 0x61, 0x76, 0x61, 0x69, 0x6c, + 0x61, 0x62, 0x6c, 0x65, 0x00, 0x42, 0x61, 0x64, 0x20, 0x66, 0x69, 0x6c, + 0x65, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, + 0x00, 0x4e, 0x6f, 0x20, 0x63, 0x68, 0x69, 0x6c, 0x64, 0x20, 0x70, 0x72, + 0x6f, 0x63, 0x65, 0x73, 0x73, 0x00, 0x42, 0x61, 0x64, 0x20, 0x61, 0x64, + 0x64, 0x72, 0x65, 0x73, 0x73, 0x00, 0x46, 0x69, 0x6c, 0x65, 0x20, 0x74, + 0x6f, 0x6f, 0x20, 0x6c, 0x61, 0x72, 0x67, 0x65, 0x00, 0x54, 0x6f, 0x6f, + 0x20, 0x6d, 0x61, 0x6e, 0x79, 0x20, 0x6c, 0x69, 0x6e, 0x6b, 0x73, 0x00, + 0x4e, 0x6f, 0x20, 0x6c, 0x6f, 0x63, 0x6b, 0x73, 0x20, 0x61, 0x76, 0x61, + 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x00, 0x52, 0x65, 0x73, 0x6f, 0x75, + 0x72, 0x63, 0x65, 0x20, 0x64, 0x65, 0x61, 0x64, 0x6c, 0x6f, 0x63, 0x6b, + 0x20, 0x77, 0x6f, 0x75, 0x6c, 0x64, 0x20, 0x6f, 0x63, 0x63, 0x75, 0x72, + 0x00, 0x53, 0x74, 0x61, 0x74, 0x65, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x72, + 0x65, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x61, 0x62, 0x6c, 0x65, 0x00, 0x50, + 0x72, 0x65, 0x76, 0x69, 0x6f, 0x75, 0x73, 0x20, 0x6f, 0x77, 0x6e, 0x65, + 0x72, 0x20, 0x64, 0x69, 0x65, 0x64, 0x00, 0x4f, 0x70, 0x65, 0x72, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x63, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x65, + 0x64, 0x00, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6e, + 0x6f, 0x74, 0x20, 0x69, 0x6d, 0x70, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, + 0x65, 0x64, 0x00, 0x4e, 0x6f, 0x20, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, + 0x65, 0x20, 0x6f, 0x66, 0x20, 0x64, 0x65, 0x73, 0x69, 0x72, 0x65, 0x64, + 0x20, 0x74, 0x79, 0x70, 0x65, 0x00, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, + 0x66, 0x69, 0x65, 0x72, 0x20, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x64, + 0x00, 0x4c, 0x69, 0x6e, 0x6b, 0x20, 0x68, 0x61, 0x73, 0x20, 0x62, 0x65, + 0x65, 0x6e, 0x20, 0x73, 0x65, 0x76, 0x65, 0x72, 0x65, 0x64, 0x00, 0x50, + 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x20, 0x65, 0x72, 0x72, 0x6f, + 0x72, 0x00, 0x42, 0x61, 0x64, 0x20, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, + 0x65, 0x00, 0x4e, 0x6f, 0x74, 0x20, 0x61, 0x20, 0x73, 0x6f, 0x63, 0x6b, + 0x65, 0x74, 0x00, 0x44, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x20, 0x72, + 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x00, 0x4d, 0x65, 0x73, 0x73, + 0x61, 0x67, 0x65, 0x20, 0x74, 0x6f, 0x6f, 0x20, 0x6c, 0x61, 0x72, 0x67, + 0x65, 0x00, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x20, 0x77, + 0x72, 0x6f, 0x6e, 0x67, 0x20, 0x74, 0x79, 0x70, 0x65, 0x20, 0x66, 0x6f, + 0x72, 0x20, 0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x00, 0x50, 0x72, 0x6f, + 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x61, 0x76, + 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x00, 0x50, 0x72, 0x6f, 0x74, + 0x6f, 0x63, 0x6f, 0x6c, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x73, 0x75, 0x70, + 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x00, 0x4e, 0x6f, 0x74, 0x20, 0x73, + 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x00, 0x41, 0x64, 0x64, + 0x72, 0x65, 0x73, 0x73, 0x20, 0x66, 0x61, 0x6d, 0x69, 0x6c, 0x79, 0x20, + 0x6e, 0x6f, 0x74, 0x20, 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x65, + 0x64, 0x20, 0x62, 0x79, 0x20, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, + 0x6c, 0x00, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x20, 0x6e, 0x6f, + 0x74, 0x20, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x00, + 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x20, 0x69, 0x73, 0x20, 0x64, + 0x6f, 0x77, 0x6e, 0x00, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x20, + 0x75, 0x6e, 0x72, 0x65, 0x61, 0x63, 0x68, 0x61, 0x62, 0x6c, 0x65, 0x00, + 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x72, + 0x65, 0x73, 0x65, 0x74, 0x20, 0x62, 0x79, 0x20, 0x6e, 0x65, 0x74, 0x77, + 0x6f, 0x72, 0x6b, 0x00, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x61, 0x62, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x00, 0x4e, + 0x6f, 0x20, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x20, 0x73, 0x70, 0x61, + 0x63, 0x65, 0x20, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, + 0x00, 0x53, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x20, 0x69, 0x73, 0x20, 0x63, + 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x65, 0x64, 0x00, 0x53, 0x6f, 0x63, + 0x6b, 0x65, 0x74, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x63, 0x6f, 0x6e, 0x6e, + 0x65, 0x63, 0x74, 0x65, 0x64, 0x00, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x61, 0x6c, 0x72, 0x65, 0x61, 0x64, 0x79, 0x20, + 0x69, 0x6e, 0x20, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x00, + 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x69, 0x6e, + 0x20, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x00, 0x53, 0x74, + 0x61, 0x6c, 0x65, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x20, 0x68, 0x61, 0x6e, + 0x64, 0x6c, 0x65, 0x00, 0x51, 0x75, 0x6f, 0x74, 0x61, 0x20, 0x65, 0x78, + 0x63, 0x65, 0x65, 0x64, 0x65, 0x64, 0x00, 0x4d, 0x75, 0x6c, 0x74, 0x69, + 0x68, 0x6f, 0x70, 0x20, 0x61, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x65, + 0x64, 0x00, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x69, + 0x65, 0x73, 0x20, 0x69, 0x6e, 0x73, 0x75, 0x66, 0x66, 0x69, 0x63, 0x69, + 0x65, 0x6e, 0x74, 0x00, 0x00, 0x00, 0x75, 0x02, 0x4e, 0x00, 0xd6, 0x01, + 0xe2, 0x04, 0xb9, 0x04, 0x18, 0x01, 0x8e, 0x05, 0xed, 0x02, 0x16, 0x04, + 0xf2, 0x00, 0x97, 0x03, 0x01, 0x03, 0x38, 0x05, 0xaf, 0x01, 0x82, 0x01, + 0x4f, 0x03, 0x2f, 0x04, 0x1e, 0x00, 0xd4, 0x05, 0xa2, 0x00, 0x12, 0x03, + 0x1e, 0x03, 0xc2, 0x01, 0xde, 0x03, 0x08, 0x00, 0xac, 0x05, 0x00, 0x01, + 0x64, 0x02, 0xf1, 0x01, 0x65, 0x05, 0x34, 0x02, 0x8c, 0x02, 0xcf, 0x02, + 0x2d, 0x03, 0x4c, 0x04, 0xe3, 0x05, 0x9f, 0x02, 0xf8, 0x04, 0x1c, 0x05, + 0x08, 0x05, 0xb1, 0x02, 0x4b, 0x05, 0x15, 0x02, 0x78, 0x00, 0x52, 0x02, + 0x3c, 0x03, 0xf1, 0x03, 0xe4, 0x00, 0xc3, 0x03, 0x7d, 0x04, 0xcc, 0x00, + 0xaa, 0x03, 0x79, 0x05, 0x24, 0x02, 0x6e, 0x01, 0x6d, 0x03, 0x22, 0x04, + 0xab, 0x04, 0x44, 0x00, 0xfb, 0x01, 0xae, 0x00, 0x83, 0x03, 0x60, 0x00, + 0xe5, 0x01, 0x07, 0x04, 0x94, 0x04, 0x5e, 0x04, 0x2b, 0x00, 0x58, 0x01, + 0x39, 0x01, 0x92, 0x00, 0xc2, 0x05, 0x9b, 0x01, 0x43, 0x02, 0x46, 0x01, + 0xf6, 0x05, 0x2d, 0x2b, 0x20, 0x20, 0x20, 0x30, 0x58, 0x30, 0x78, 0x00, + 0x2d, 0x30, 0x58, 0x2b, 0x30, 0x58, 0x20, 0x30, 0x58, 0x2d, 0x30, 0x78, + 0x2b, 0x30, 0x78, 0x20, 0x30, 0x78, 0x00, 0x2f, 0x6c, 0x66, 0x73, 0x2f, + 0x66, 0x6f, 0x6c, 0x64, 0x65, 0x72, 0x2f, 0x74, 0x65, 0x73, 0x74, 0x2e, + 0x74, 0x78, 0x74, 0x00, 0x2f, 0x6c, 0x66, 0x73, 0x2f, 0x66, 0x6f, 0x6c, + 0x64, 0x65, 0x72, 0x00, 0x6e, 0x61, 0x6e, 0x00, 0x69, 0x6e, 0x66, 0x00, + 0x72, 0x77, 0x61, 0x00, 0x4e, 0x41, 0x4e, 0x00, 0x49, 0x4e, 0x46, 0x00, + 0x2e, 0x00, 0x77, 0x2b, 0x00, 0x28, 0x6e, 0x75, 0x6c, 0x6c, 0x29, 0x00, + 0x48, 0x65, 0x6c, 0x6c, 0x6f, 0x2c, 0x20, 0x57, 0x6f, 0x72, 0x6c, 0x64, + 0x21, 0x00, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x20, 0x72, 0x65, 0x61, + 0x64, 0x20, 0x3d, 0x20, 0x25, 0x73, 0x0a, 0x00, 0x66, 0x6f, 0x70, 0x65, + 0x6e, 0x20, 0x46, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, + 0x6f, 0x70, 0x65, 0x6e, 0x0a, 0x00, 0x66, 0x6f, 0x70, 0x65, 0x6e, 0x20, + 0x53, 0x75, 0x63, 0x63, 0x65, 0x65, 0x64, 0x0a, 0x00, 0x6d, 0x6b, 0x64, + 0x69, 0x72, 0x20, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x20, 0x77, 0x69, + 0x74, 0x68, 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x20, 0x25, 0x64, 0x0a, + 0x00, 0x6d, 0x6b, 0x64, 0x69, 0x72, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x65, 0x64, 0x20, 0x25, 0x64, 0x0a, 0x00, 0x66, 0x73, 0x65, 0x65, + 0x6b, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x65, 0x64, 0x20, 0x25, + 0x64, 0x0a, 0x00, 0x66, 0x77, 0x72, 0x69, 0x74, 0x65, 0x20, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x65, 0x64, 0x20, 0x25, 0x64, 0x0a, 0x00, 0x66, + 0x72, 0x65, 0x61, 0x64, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x65, + 0x64, 0x20, 0x25, 0x64, 0x0a, 0x00, 0x53, 0x75, 0x70, 0x70, 0x6f, 0x72, + 0x74, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, + 0x74, 0x69, 0x6e, 0x67, 0x20, 0x6c, 0x6f, 0x6e, 0x67, 0x20, 0x64, 0x6f, + 0x75, 0x62, 0x6c, 0x65, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x20, + 0x69, 0x73, 0x20, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x6c, 0x79, + 0x20, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x2e, 0x0a, 0x54, + 0x6f, 0x20, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x69, 0x74, 0x2c, + 0x20, 0x61, 0x64, 0x64, 0x20, 0x2d, 0x6c, 0x63, 0x2d, 0x70, 0x72, 0x69, + 0x6e, 0x74, 0x73, 0x63, 0x61, 0x6e, 0x2d, 0x6c, 0x6f, 0x6e, 0x67, 0x2d, + 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x6c, 0x69, 0x6e, 0x6b, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x61, + 0x6e, 0x64, 0x2e, 0x0a, 0x00, 0x48, 0x65, 0x6c, 0x6c, 0x6f, 0x20, 0x57, + 0x65, 0x62, 0x41, 0x73, 0x73, 0x65, 0x6d, 0x62, 0x6c, 0x79, 0x20, 0x4d, + 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x20, 0x21, 0x0a, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x19, 0x00, 0x0a, 0x00, + 0x19, 0x19, 0x19, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x0b, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x19, 0x00, 0x11, 0x0a, 0x19, 0x19, 0x19, 0x03, + 0x0a, 0x07, 0x00, 0x01, 0x1b, 0x09, 0x0b, 0x18, 0x00, 0x00, 0x09, 0x06, + 0x0b, 0x00, 0x00, 0x0b, 0x00, 0x06, 0x19, 0x00, 0x00, 0x00, 0x19, 0x19, + 0x19, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x19, 0x00, 0x0a, 0x0d, 0x19, 0x19, 0x19, 0x00, 0x0d, 0x00, + 0x00, 0x02, 0x00, 0x09, 0x0e, 0x00, 0x00, 0x00, 0x09, 0x00, 0x0e, 0x00, + 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, + 0x00, 0x09, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x0c, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x0f, 0x00, 0x00, 0x00, 0x04, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x09, + 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, + 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x00, 0x09, 0x12, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x12, 0x00, 0x00, 0x1a, 0x00, + 0x00, 0x00, 0x1a, 0x1a, 0x1a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x00, 0x00, 0x00, 0x1a, 0x1a, + 0x1a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x17, 0x00, 0x00, 0x00, 0x00, + 0x17, 0x00, 0x00, 0x00, 0x00, 0x09, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x14, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x15, 0x00, 0x00, 0x00, 0x00, 0x15, 0x00, + 0x00, 0x00, 0x00, 0x09, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x16, 0x00, + 0x00, 0x16, 0x00, 0x00, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, + 0x38, 0x39, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x00, 0x41, 0xc0, 0x1c, + 0x0b, 0xec, 0x01, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, + 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x38, 0x11, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x0e, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, + 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x64, 0x15, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb8, 0x0e, 0x00, 0x00, 0x00, + 0xcd, 0x0e, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x01, 0xfd, 0x0d, 0x63, 0x00, + 0x2a, 0x5f, 0x5f, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x5f, + 0x77, 0x61, 0x73, 0x69, 0x5f, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, + 0x74, 0x5f, 0x70, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x31, 0x5f, 0x61, + 0x72, 0x67, 0x73, 0x5f, 0x67, 0x65, 0x74, 0x01, 0x30, 0x5f, 0x5f, 0x69, + 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x5f, 0x77, 0x61, 0x73, 0x69, + 0x5f, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x5f, 0x70, 0x72, + 0x65, 0x76, 0x69, 0x65, 0x77, 0x31, 0x5f, 0x61, 0x72, 0x67, 0x73, 0x5f, + 0x73, 0x69, 0x7a, 0x65, 0x73, 0x5f, 0x67, 0x65, 0x74, 0x02, 0x2a, 0x5f, + 0x5f, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x5f, 0x77, 0x61, + 0x73, 0x69, 0x5f, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x5f, + 0x70, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x31, 0x5f, 0x66, 0x64, 0x5f, + 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x03, 0x2f, 0x5f, 0x5f, 0x69, 0x6d, 0x70, + 0x6f, 0x72, 0x74, 0x65, 0x64, 0x5f, 0x77, 0x61, 0x73, 0x69, 0x5f, 0x73, + 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x5f, 0x70, 0x72, 0x65, 0x76, + 0x69, 0x65, 0x77, 0x31, 0x5f, 0x66, 0x64, 0x5f, 0x66, 0x64, 0x73, 0x74, + 0x61, 0x74, 0x5f, 0x67, 0x65, 0x74, 0x04, 0x35, 0x5f, 0x5f, 0x69, 0x6d, + 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x5f, 0x77, 0x61, 0x73, 0x69, 0x5f, + 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x5f, 0x70, 0x72, 0x65, + 0x76, 0x69, 0x65, 0x77, 0x31, 0x5f, 0x66, 0x64, 0x5f, 0x66, 0x64, 0x73, + 0x74, 0x61, 0x74, 0x5f, 0x73, 0x65, 0x74, 0x5f, 0x66, 0x6c, 0x61, 0x67, + 0x73, 0x05, 0x30, 0x5f, 0x5f, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x65, + 0x64, 0x5f, 0x77, 0x61, 0x73, 0x69, 0x5f, 0x73, 0x6e, 0x61, 0x70, 0x73, + 0x68, 0x6f, 0x74, 0x5f, 0x70, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x31, + 0x5f, 0x66, 0x64, 0x5f, 0x70, 0x72, 0x65, 0x73, 0x74, 0x61, 0x74, 0x5f, + 0x67, 0x65, 0x74, 0x06, 0x35, 0x5f, 0x5f, 0x69, 0x6d, 0x70, 0x6f, 0x72, + 0x74, 0x65, 0x64, 0x5f, 0x77, 0x61, 0x73, 0x69, 0x5f, 0x73, 0x6e, 0x61, + 0x70, 0x73, 0x68, 0x6f, 0x74, 0x5f, 0x70, 0x72, 0x65, 0x76, 0x69, 0x65, + 0x77, 0x31, 0x5f, 0x66, 0x64, 0x5f, 0x70, 0x72, 0x65, 0x73, 0x74, 0x61, + 0x74, 0x5f, 0x64, 0x69, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x07, 0x29, + 0x5f, 0x5f, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x5f, 0x77, + 0x61, 0x73, 0x69, 0x5f, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, + 0x5f, 0x70, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x31, 0x5f, 0x66, 0x64, + 0x5f, 0x72, 0x65, 0x61, 0x64, 0x08, 0x29, 0x5f, 0x5f, 0x69, 0x6d, 0x70, + 0x6f, 0x72, 0x74, 0x65, 0x64, 0x5f, 0x77, 0x61, 0x73, 0x69, 0x5f, 0x73, + 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x5f, 0x70, 0x72, 0x65, 0x76, + 0x69, 0x65, 0x77, 0x31, 0x5f, 0x66, 0x64, 0x5f, 0x73, 0x65, 0x65, 0x6b, + 0x09, 0x2a, 0x5f, 0x5f, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64, + 0x5f, 0x77, 0x61, 0x73, 0x69, 0x5f, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, + 0x6f, 0x74, 0x5f, 0x70, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x31, 0x5f, + 0x66, 0x64, 0x5f, 0x77, 0x72, 0x69, 0x74, 0x65, 0x0a, 0x37, 0x5f, 0x5f, + 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x5f, 0x77, 0x61, 0x73, + 0x69, 0x5f, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x5f, 0x70, + 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x31, 0x5f, 0x70, 0x61, 0x74, 0x68, + 0x5f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x5f, 0x64, 0x69, 0x72, 0x65, + 0x63, 0x74, 0x6f, 0x72, 0x79, 0x0b, 0x2b, 0x5f, 0x5f, 0x69, 0x6d, 0x70, + 0x6f, 0x72, 0x74, 0x65, 0x64, 0x5f, 0x77, 0x61, 0x73, 0x69, 0x5f, 0x73, + 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x5f, 0x70, 0x72, 0x65, 0x76, + 0x69, 0x65, 0x77, 0x31, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x5f, 0x6f, 0x70, + 0x65, 0x6e, 0x0c, 0x2b, 0x5f, 0x5f, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, + 0x65, 0x64, 0x5f, 0x77, 0x61, 0x73, 0x69, 0x5f, 0x73, 0x6e, 0x61, 0x70, + 0x73, 0x68, 0x6f, 0x74, 0x5f, 0x70, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, + 0x31, 0x5f, 0x70, 0x72, 0x6f, 0x63, 0x5f, 0x65, 0x78, 0x69, 0x74, 0x0d, + 0x11, 0x5f, 0x5f, 0x77, 0x61, 0x73, 0x6d, 0x5f, 0x63, 0x61, 0x6c, 0x6c, + 0x5f, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x0e, 0x2c, 0x75, 0x6e, 0x64, 0x65, + 0x66, 0x69, 0x6e, 0x65, 0x64, 0x5f, 0x77, 0x65, 0x61, 0x6b, 0x3a, 0x5f, + 0x5f, 0x77, 0x61, 0x73, 0x69, 0x6c, 0x69, 0x62, 0x63, 0x5f, 0x66, 0x69, + 0x6e, 0x64, 0x5f, 0x72, 0x65, 0x6c, 0x70, 0x61, 0x74, 0x68, 0x5f, 0x61, + 0x6c, 0x6c, 0x6f, 0x63, 0x0f, 0x06, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, + 0x10, 0x06, 0x6d, 0x61, 0x6c, 0x6c, 0x6f, 0x63, 0x11, 0x08, 0x64, 0x6c, + 0x6d, 0x61, 0x6c, 0x6c, 0x6f, 0x63, 0x12, 0x04, 0x66, 0x72, 0x65, 0x65, + 0x13, 0x06, 0x64, 0x6c, 0x66, 0x72, 0x65, 0x65, 0x14, 0x06, 0x63, 0x61, + 0x6c, 0x6c, 0x6f, 0x63, 0x15, 0x05, 0x5f, 0x45, 0x78, 0x69, 0x74, 0x16, + 0x0b, 0x5f, 0x5f, 0x6d, 0x61, 0x69, 0x6e, 0x5f, 0x76, 0x6f, 0x69, 0x64, + 0x17, 0x0f, 0x5f, 0x5f, 0x77, 0x61, 0x73, 0x69, 0x5f, 0x61, 0x72, 0x67, + 0x73, 0x5f, 0x67, 0x65, 0x74, 0x18, 0x15, 0x5f, 0x5f, 0x77, 0x61, 0x73, + 0x69, 0x5f, 0x61, 0x72, 0x67, 0x73, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x73, + 0x5f, 0x67, 0x65, 0x74, 0x19, 0x0f, 0x5f, 0x5f, 0x77, 0x61, 0x73, 0x69, + 0x5f, 0x66, 0x64, 0x5f, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x1a, 0x14, 0x5f, + 0x5f, 0x77, 0x61, 0x73, 0x69, 0x5f, 0x66, 0x64, 0x5f, 0x66, 0x64, 0x73, + 0x74, 0x61, 0x74, 0x5f, 0x67, 0x65, 0x74, 0x1b, 0x1a, 0x5f, 0x5f, 0x77, + 0x61, 0x73, 0x69, 0x5f, 0x66, 0x64, 0x5f, 0x66, 0x64, 0x73, 0x74, 0x61, + 0x74, 0x5f, 0x73, 0x65, 0x74, 0x5f, 0x66, 0x6c, 0x61, 0x67, 0x73, 0x1c, + 0x15, 0x5f, 0x5f, 0x77, 0x61, 0x73, 0x69, 0x5f, 0x66, 0x64, 0x5f, 0x70, + 0x72, 0x65, 0x73, 0x74, 0x61, 0x74, 0x5f, 0x67, 0x65, 0x74, 0x1d, 0x1a, + 0x5f, 0x5f, 0x77, 0x61, 0x73, 0x69, 0x5f, 0x66, 0x64, 0x5f, 0x70, 0x72, + 0x65, 0x73, 0x74, 0x61, 0x74, 0x5f, 0x64, 0x69, 0x72, 0x5f, 0x6e, 0x61, + 0x6d, 0x65, 0x1e, 0x0e, 0x5f, 0x5f, 0x77, 0x61, 0x73, 0x69, 0x5f, 0x66, + 0x64, 0x5f, 0x72, 0x65, 0x61, 0x64, 0x1f, 0x0e, 0x5f, 0x5f, 0x77, 0x61, + 0x73, 0x69, 0x5f, 0x66, 0x64, 0x5f, 0x73, 0x65, 0x65, 0x6b, 0x20, 0x0f, + 0x5f, 0x5f, 0x77, 0x61, 0x73, 0x69, 0x5f, 0x66, 0x64, 0x5f, 0x77, 0x72, + 0x69, 0x74, 0x65, 0x21, 0x1c, 0x5f, 0x5f, 0x77, 0x61, 0x73, 0x69, 0x5f, + 0x70, 0x61, 0x74, 0x68, 0x5f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x5f, + 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x22, 0x10, 0x5f, + 0x5f, 0x77, 0x61, 0x73, 0x69, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x5f, 0x6f, + 0x70, 0x65, 0x6e, 0x23, 0x10, 0x5f, 0x5f, 0x77, 0x61, 0x73, 0x69, 0x5f, + 0x70, 0x72, 0x6f, 0x63, 0x5f, 0x65, 0x78, 0x69, 0x74, 0x24, 0x05, 0x61, + 0x62, 0x6f, 0x72, 0x74, 0x25, 0x04, 0x73, 0x62, 0x72, 0x6b, 0x26, 0x05, + 0x64, 0x75, 0x6d, 0x6d, 0x79, 0x27, 0x11, 0x5f, 0x5f, 0x77, 0x61, 0x73, + 0x6d, 0x5f, 0x63, 0x61, 0x6c, 0x6c, 0x5f, 0x64, 0x74, 0x6f, 0x72, 0x73, + 0x28, 0x06, 0x6d, 0x65, 0x6d, 0x63, 0x70, 0x79, 0x29, 0x06, 0x6d, 0x65, + 0x6d, 0x73, 0x65, 0x74, 0x2a, 0x06, 0x73, 0x74, 0x72, 0x6c, 0x65, 0x6e, + 0x2b, 0x05, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x2c, 0x0d, 0x5f, 0x5f, 0x73, + 0x74, 0x64, 0x69, 0x6f, 0x5f, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x2d, 0x06, + 0x77, 0x72, 0x69, 0x74, 0x65, 0x76, 0x2e, 0x0d, 0x5f, 0x5f, 0x73, 0x74, + 0x64, 0x69, 0x6f, 0x5f, 0x77, 0x72, 0x69, 0x74, 0x65, 0x2f, 0x08, 0x5f, + 0x5f, 0x69, 0x73, 0x61, 0x74, 0x74, 0x79, 0x30, 0x0e, 0x5f, 0x5f, 0x73, + 0x74, 0x64, 0x6f, 0x75, 0x74, 0x5f, 0x77, 0x72, 0x69, 0x74, 0x65, 0x31, + 0x07, 0x5f, 0x5f, 0x6c, 0x73, 0x65, 0x65, 0x6b, 0x32, 0x0c, 0x5f, 0x5f, + 0x73, 0x74, 0x64, 0x69, 0x6f, 0x5f, 0x73, 0x65, 0x65, 0x6b, 0x33, 0x0a, + 0x5f, 0x5f, 0x6f, 0x66, 0x6c, 0x5f, 0x6c, 0x6f, 0x63, 0x6b, 0x34, 0x0c, + 0x5f, 0x5f, 0x6f, 0x66, 0x6c, 0x5f, 0x75, 0x6e, 0x6c, 0x6f, 0x63, 0x6b, + 0x35, 0x0c, 0x5f, 0x5f, 0x73, 0x74, 0x64, 0x69, 0x6f, 0x5f, 0x65, 0x78, + 0x69, 0x74, 0x36, 0x09, 0x5f, 0x5f, 0x74, 0x6f, 0x77, 0x72, 0x69, 0x74, + 0x65, 0x37, 0x09, 0x5f, 0x5f, 0x66, 0x77, 0x72, 0x69, 0x74, 0x65, 0x78, + 0x38, 0x06, 0x66, 0x77, 0x72, 0x69, 0x74, 0x65, 0x39, 0x05, 0x64, 0x75, + 0x6d, 0x6d, 0x79, 0x3a, 0x09, 0x5f, 0x5f, 0x6c, 0x63, 0x74, 0x72, 0x61, + 0x6e, 0x73, 0x3b, 0x08, 0x73, 0x74, 0x72, 0x65, 0x72, 0x72, 0x6f, 0x72, + 0x3c, 0x06, 0x6d, 0x65, 0x6d, 0x63, 0x68, 0x72, 0x3d, 0x07, 0x73, 0x74, + 0x72, 0x6e, 0x6c, 0x65, 0x6e, 0x3e, 0x07, 0x77, 0x63, 0x72, 0x74, 0x6f, + 0x6d, 0x62, 0x3f, 0x06, 0x77, 0x63, 0x74, 0x6f, 0x6d, 0x62, 0x40, 0x05, + 0x66, 0x72, 0x65, 0x78, 0x70, 0x41, 0x05, 0x66, 0x70, 0x75, 0x74, 0x73, + 0x42, 0x08, 0x76, 0x66, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x66, 0x43, 0x0b, + 0x70, 0x72, 0x69, 0x6e, 0x74, 0x66, 0x5f, 0x63, 0x6f, 0x72, 0x65, 0x44, + 0x07, 0x70, 0x6f, 0x70, 0x5f, 0x61, 0x72, 0x67, 0x45, 0x03, 0x70, 0x61, + 0x64, 0x46, 0x19, 0x6c, 0x6f, 0x6e, 0x67, 0x5f, 0x64, 0x6f, 0x75, 0x62, + 0x6c, 0x65, 0x5f, 0x6e, 0x6f, 0x74, 0x5f, 0x73, 0x75, 0x70, 0x70, 0x6f, + 0x72, 0x74, 0x65, 0x64, 0x47, 0x06, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x66, + 0x48, 0x06, 0x6d, 0x65, 0x6d, 0x63, 0x6d, 0x70, 0x49, 0x06, 0x73, 0x74, + 0x72, 0x64, 0x75, 0x70, 0x4a, 0x1c, 0x5f, 0x5f, 0x77, 0x61, 0x73, 0x69, + 0x6c, 0x69, 0x62, 0x63, 0x5f, 0x70, 0x6f, 0x70, 0x75, 0x6c, 0x61, 0x74, + 0x65, 0x5f, 0x70, 0x72, 0x65, 0x6f, 0x70, 0x65, 0x6e, 0x73, 0x4b, 0x27, + 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x72, 0x65, 0x67, + 0x69, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, 0x72, 0x65, 0x6f, 0x70, 0x65, + 0x6e, 0x65, 0x64, 0x5f, 0x66, 0x64, 0x5f, 0x75, 0x6e, 0x6c, 0x6f, 0x63, + 0x6b, 0x65, 0x64, 0x4c, 0x17, 0x5f, 0x5f, 0x77, 0x61, 0x73, 0x69, 0x6c, + 0x69, 0x62, 0x63, 0x5f, 0x66, 0x69, 0x6e, 0x64, 0x5f, 0x72, 0x65, 0x6c, + 0x70, 0x61, 0x74, 0x68, 0x4d, 0x17, 0x5f, 0x5f, 0x77, 0x61, 0x73, 0x69, + 0x6c, 0x69, 0x62, 0x63, 0x5f, 0x66, 0x69, 0x6e, 0x64, 0x5f, 0x61, 0x62, + 0x73, 0x70, 0x61, 0x74, 0x68, 0x4e, 0x1e, 0x5f, 0x5f, 0x77, 0x61, 0x73, + 0x69, 0x6c, 0x69, 0x62, 0x63, 0x5f, 0x6e, 0x6f, 0x63, 0x77, 0x64, 0x5f, + 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x74, 0x5f, 0x6e, 0x6f, 0x6d, 0x6f, 0x64, + 0x65, 0x4f, 0x1f, 0x5f, 0x5f, 0x77, 0x61, 0x73, 0x69, 0x6c, 0x69, 0x62, + 0x63, 0x5f, 0x6e, 0x6f, 0x63, 0x77, 0x64, 0x5f, 0x6d, 0x6b, 0x64, 0x69, + 0x72, 0x61, 0x74, 0x5f, 0x6e, 0x6f, 0x6d, 0x6f, 0x64, 0x65, 0x50, 0x16, + 0x5f, 0x5f, 0x77, 0x61, 0x73, 0x69, 0x6c, 0x69, 0x62, 0x63, 0x5f, 0x6f, + 0x70, 0x65, 0x6e, 0x5f, 0x6e, 0x6f, 0x6d, 0x6f, 0x64, 0x65, 0x51, 0x05, + 0x6d, 0x6b, 0x64, 0x69, 0x72, 0x52, 0x0b, 0x5f, 0x5f, 0x73, 0x74, 0x72, + 0x63, 0x68, 0x72, 0x6e, 0x75, 0x6c, 0x53, 0x06, 0x73, 0x74, 0x72, 0x63, + 0x68, 0x72, 0x54, 0x0c, 0x5f, 0x5f, 0x66, 0x6d, 0x6f, 0x64, 0x65, 0x66, + 0x6c, 0x61, 0x67, 0x73, 0x55, 0x05, 0x66, 0x63, 0x6e, 0x74, 0x6c, 0x56, + 0x05, 0x72, 0x65, 0x61, 0x64, 0x76, 0x57, 0x04, 0x72, 0x65, 0x61, 0x64, + 0x58, 0x0c, 0x5f, 0x5f, 0x73, 0x74, 0x64, 0x69, 0x6f, 0x5f, 0x72, 0x65, + 0x61, 0x64, 0x59, 0x09, 0x5f, 0x5f, 0x6f, 0x66, 0x6c, 0x5f, 0x61, 0x64, + 0x64, 0x5a, 0x08, 0x5f, 0x5f, 0x66, 0x64, 0x6f, 0x70, 0x65, 0x6e, 0x5b, + 0x05, 0x66, 0x6f, 0x70, 0x65, 0x6e, 0x5c, 0x05, 0x66, 0x73, 0x65, 0x65, + 0x6b, 0x5d, 0x08, 0x5f, 0x5f, 0x74, 0x6f, 0x72, 0x65, 0x61, 0x64, 0x5e, + 0x05, 0x66, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x06, 0x66, 0x66, 0x6c, 0x75, + 0x73, 0x68, 0x60, 0x05, 0x64, 0x75, 0x6d, 0x6d, 0x79, 0x61, 0x06, 0x66, + 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x62, 0x04, 0x6d, 0x61, 0x69, 0x6e, 0x07, + 0x33, 0x02, 0x00, 0x0f, 0x5f, 0x5f, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x5f, + 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x01, 0x1f, 0x47, 0x4f, 0x54, + 0x2e, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, + 0x61, 0x6c, 0x2e, 0x5f, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, + 0x62, 0x61, 0x73, 0x65, 0x09, 0x11, 0x02, 0x00, 0x07, 0x2e, 0x72, 0x6f, + 0x64, 0x61, 0x74, 0x61, 0x01, 0x05, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x00, + 0x26, 0x09, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x65, 0x72, 0x73, 0x01, + 0x0c, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x65, 0x64, 0x2d, 0x62, + 0x79, 0x01, 0x05, 0x63, 0x6c, 0x61, 0x6e, 0x67, 0x06, 0x31, 0x37, 0x2e, + 0x30, 0x2e, 0x36, 0x00, 0x39, 0x0f, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, + 0x5f, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x03, 0x2b, 0x0b, + 0x62, 0x75, 0x6c, 0x6b, 0x2d, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x2b, + 0x0f, 0x6d, 0x75, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2d, 0x67, 0x6c, 0x6f, + 0x62, 0x61, 0x6c, 0x73, 0x2b, 0x08, 0x73, 0x69, 0x67, 0x6e, 0x2d, 0x65, + 0x78, 0x74 +}; \ No newline at end of file diff --git a/product-mini/platforms/zephyr/simple-file/src/main.c b/product-mini/platforms/zephyr/simple-file/src/main.c new file mode 100644 index 0000000000..405a97f17b --- /dev/null +++ b/product-mini/platforms/zephyr/simple-file/src/main.c @@ -0,0 +1,225 @@ +/* + * Copyright (C) 2019 Intel Corporation. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception + */ + +// #include + +#include +#include +#include "bh_platform.h" +#include "bh_assert.h" +#include "bh_log.h" +#include "wasm_export.h" +#include "file.h" + +#include +#include +#include +#include +#include +#include +#include + +#define CONFIG_HEAP_MEM_POOL_SIZE WASM_GLOBAL_HEAP_SIZE +#define CONFIG_APP_STACK_SIZE 16384 +#define CONFIG_APP_HEAP_SIZE 16384 + +LOG_MODULE_REGISTER(main); + +static char global_heap_buf[CONFIG_HEAP_MEM_POOL_SIZE] = { 0 }; + +static int app_argc; +static char **app_argv; + +//-------------------------------------------------------------------------------------------// +static int +littlefs_flash_erase(unsigned int id) +{ + const struct flash_area *pfa; + int rc; + + rc = flash_area_open(id, &pfa); + if (rc < 0) { + LOG_ERR("FAIL: unable to find flash area %u: %d\n", id, rc); + return rc; + } + + LOG_PRINTK("Area %u at 0x%x on %s for %u bytes\n", id, + (unsigned int)pfa->fa_off, pfa->fa_dev->name, + (unsigned int)pfa->fa_size); + + /* Optional wipe flash contents */ + if (IS_ENABLED(CONFIG_APP_WIPE_STORAGE)) { + rc = flash_area_erase(pfa, 0, pfa->fa_size); + LOG_ERR("Erasing flash area ... %d", rc); + } + + flash_area_close(pfa); + return rc; +} +#define PARTITION_NODE DT_NODELABEL(lfs1) + +#if DT_NODE_EXISTS(PARTITION_NODE) +FS_FSTAB_DECLARE_ENTRY(PARTITION_NODE); +#else /* PARTITION_NODE */ +FS_LITTLEFS_DECLARE_DEFAULT_CONFIG(storage); +static struct fs_mount_t lfs_storage_mnt = { + .type = FS_LITTLEFS, + .fs_data = &storage, + .storage_dev = (void *)FIXED_PARTITION_ID(storage_partition), + .mnt_point = "/lfs", +}; +#endif /* PARTITION_NODE */ + +struct fs_mount_t *mountpoint = +#if DT_NODE_EXISTS(PARTITION_NODE) + &FS_FSTAB_ENTRY(PARTITION_NODE) +#else + &lfs_storage_mnt +#endif + ; + +static int +littlefs_mount(struct fs_mount_t *mp) +{ + int rc; + + rc = littlefs_flash_erase((uintptr_t)mp->storage_dev); + if (rc < 0) { + return rc; + } + + /* Do not mount if auto-mount has been enabled */ +#if !DT_NODE_EXISTS(PARTITION_NODE) \ + || !(FSTAB_ENTRY_DT_MOUNT_FLAGS(PARTITION_NODE) & FS_MOUNT_FLAG_AUTOMOUNT) + rc = fs_mount(mp); + if (rc < 0) { + LOG_PRINTK("FAIL: mount id %" PRIuPTR " at %s: %d\n", + (uintptr_t)mp->storage_dev, mp->mnt_point, rc); + return rc; + } + LOG_PRINTK("%s mount: %d\n", mp->mnt_point, rc); +#else + LOG_PRINTK("%s automounted\n", mp->mnt_point); +#endif + + return 0; +} + +//-------------------------------------------------------------------------------------------// +int +main(void) +{ + int start, end; + start = k_uptime_get_32(); + uint8 *wasm_file_buf = NULL; + uint32 wasm_file_size; + wasm_module_t wasm_module = NULL; + wasm_module_inst_t wasm_module_inst = NULL; + RuntimeInitArgs init_args; + char error_buf[128]; + const char *exception; + int rc; + + int log_verbose_level = 2; + + memset(&init_args, 0, sizeof(RuntimeInitArgs)); + + rc = littlefs_mount(mountpoint); + if (rc < 0) { + LOG_ERR("FAIL: mounting %s: %d\n", mountpoint->mnt_point, rc); + return 0; + } + +#if WASM_ENABLE_GLOBAL_HEAP_POOL != 0 + init_args.mem_alloc_type = Alloc_With_Pool; + init_args.mem_alloc_option.pool.heap_buf = global_heap_buf; + init_args.mem_alloc_option.pool.heap_size = sizeof(global_heap_buf); + LOG_INF("global heap size: %d", sizeof(global_heap_buf)); +#else +#error "memory allocation scheme is not defined." +#endif + + /* initialize runtime environment */ + if (!wasm_runtime_full_init(&init_args)) { + LOG_ERR("Init runtime environment failed."); + return; + } + + /* load WASM byte buffer from byte buffer of include file */ + wasm_file_buf = (uint8 *)wasm_test_file; + wasm_file_size = sizeof(wasm_test_file); + LOG_INF("Wasm file size: %d", wasm_file_size); + + /* load WASM module */ + if (!(wasm_module = wasm_runtime_load(wasm_file_buf, wasm_file_size, + error_buf, sizeof(error_buf)))) { + LOG_ERR("Failed to load module: %s", error_buf); + goto fail1; + } + + /* Set the WASI context */ +#if WASM_ENABLE_LIBC_WASI != 0 +#define DIR_LIST_SIZE 1 + const char *dir_list[DIR_LIST_SIZE] = { + "/lfs", + }; + /* No dir list => No file system + * dir_cont = 0 + * No mapped dir list => No file system + * map_dir_cont = 0 + * No environment variables + * env_count = 0 + * No command line arguments + * argv 0 + */ + wasm_runtime_set_wasi_args(wasm_module, dir_list, DIR_LIST_SIZE, NULL, 0, + NULL, 0, NULL, 0); +#endif + + /* instantiate the module */ + if (!(wasm_module_inst = wasm_runtime_instantiate( + wasm_module, CONFIG_APP_STACK_SIZE, CONFIG_APP_HEAP_SIZE, + error_buf, sizeof(error_buf)))) { + LOG_ERR("Failed to instantiate module: %s", error_buf); + goto fail2; + } + + /* invoke the main function */ + if (wasm_runtime_lookup_function(wasm_module_inst, "_start") + || wasm_runtime_lookup_function(wasm_module_inst, "__main_argc_argv") + || wasm_runtime_lookup_function(wasm_module_inst, "main")) { + + LOG_INF("main found"); + wasm_application_execute_main(wasm_module_inst, 0, NULL); + LOG_INF("main executed"); + } + else { + LOG_ERR("Failed to lookup function main"); + return -1; + } + + if ((exception = wasm_runtime_get_exception(wasm_module_inst))) + LOG_ERR("get exception: %s", exception); + + rc = wasm_runtime_get_wasi_exit_code(wasm_module_inst); + LOG_INF("wasi exit code: %d", rc); + + /* destroy the module instance */ + wasm_runtime_deinstantiate(wasm_module_inst); + +fail2: + /* unload the module */ + wasm_runtime_unload(wasm_module); + +fail1: + /* destroy runtime environment */ + wasm_runtime_destroy(); + + end = k_uptime_get_32(); + + LOG_INF("elapsed: %dms", (end - start)); + + return 0; +} \ No newline at end of file diff --git a/product-mini/platforms/zephyr/simple-file/to_c_header.py b/product-mini/platforms/zephyr/simple-file/to_c_header.py new file mode 100644 index 0000000000..7712c0b5ab --- /dev/null +++ b/product-mini/platforms/zephyr/simple-file/to_c_header.py @@ -0,0 +1,32 @@ +# Copyright (C) 2024 Grenoble INP - ESISAR. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception + +# Python script to convert wasm file to byte array in a .h file +import os + +CWD = os.getcwd() +CMAKE_CURRENT_BINARY_DIR = os.getenv('CMAKE_CURRENT_BINARY_DIR', CWD) +CMAKE_CURRENT_SOURCE_DIR = os.getenv('CMAKE_CURRENT_SOURCE_DIR', f'{CWD}/../src') + +LICENCE_HEADER = """/* + * Copyright (C) 2024 Grenoble INP - ESISAR. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception + */ +""" + +print('CMAKE_CURRENT_BINARY_DIR:', CMAKE_CURRENT_BINARY_DIR) +print('CMAKE_CURRENT_SOURCE_DIR:', CMAKE_CURRENT_SOURCE_DIR) + +# Open the wasm file in binary mode and read the data +with open(f'{CWD}/wasm-apps/file.wasm', 'rb') as f: + wasm_bytes = f.read() + +# Convert the bytes to a comma-separated string of hex values +byte_array = ', '.join(f'0x{byte:02x}' for byte in wasm_bytes) + +# Create the output string +output = f'{LICENCE_HEADER}\nunsigned char __aligned(4) wasm_test_file[] = {{ {byte_array} }};' + +# Write the output string to the .h file +with open(f'{CWD}/src/file.h', 'w') as f: + f.write(output) diff --git a/product-mini/platforms/zephyr/simple-file/wasm-apps/file.c b/product-mini/platforms/zephyr/simple-file/wasm-apps/file.c new file mode 100644 index 0000000000..be25e55166 --- /dev/null +++ b/product-mini/platforms/zephyr/simple-file/wasm-apps/file.c @@ -0,0 +1,55 @@ +/* + * Copyright (C) 2024 Grenoble INP - ESISAR. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception + */ + +#include +#include +#include +#include +#include + +// Zephyr +#define CWD "/lfs" +#define FOLDER_PATH CWD "/folder" +#define FILE_PATH CWD "folder/test.txt" + +int +main(int argc, char **argv) +{ + int rc; + const int zero = 0; + printf("Hello WebAssembly Module !\n"); + + rc = mkdir(FOLDER_PATH, 0777); + if (rc < 0) { + rc = errno; + printf("mkdir failed with error %d\n", rc); + return -1; + } + printf("mkdir returned %d\n", rc); + + FILE *file = fopen(FILE_PATH, "w+"); + if (!file) { + printf("fopen Failed to open\n"); + return -1; + } + printf("fopen Succeed\n"); + + const char *data = "Hello, World!"; + size_t len = 13; + size_t nitems = fwrite(data, sizeof(char), 13, file); + printf("fwrite returned %d\n", (int)nitems); + + rc = fseek(file, 0, SEEK_SET); + printf("fseek returned %d\n", rc); + + char buffer[32]; + nitems = fread(buffer, sizeof(char), 32, file); + printf("fread returned %d\n", (int)nitems); + printf("buffer read = %s\n", buffer); + + fclose(file); + + return 0; +} diff --git a/product-mini/platforms/zephyr/simple-http/CMakeLists.txt b/product-mini/platforms/zephyr/simple-http/CMakeLists.txt new file mode 100644 index 0000000000..e0236c04c1 --- /dev/null +++ b/product-mini/platforms/zephyr/simple-http/CMakeLists.txt @@ -0,0 +1,89 @@ +# Copyright (C) 2019 Intel Corporation. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception + +cmake_minimum_required(VERSION 3.8.2) + +find_package(Zephyr REQUIRED HINTS $ENV{ZEPHYR_BASE}) +project(wamr) + +enable_language (ASM) + +set (WAMR_BUILD_PLATFORM "zephyr") + +# WAMR Configuration: +set (WAMR_BUILD_TARGET "THUMB") +set (WAMR_BUILD_INTERP 1) +set (WAMR_BUILD_AOT 0) +set (WAMR_BUILD_LIBC_BUILTIN 1) # printf +set (WAMR_BUILD_LIBC_WASI 1) +set (WAMR_BUILD_LIB_PTHREAD 0) +set (WAMR_BUILD_GLOBAL_HEAP_POOL 1) +set (WAMR_BUILD_GLOBAL_HEAP_SIZE 98304) # 96 KB + +# Environment variables: + +# Check if WAMR_ROOT_DIR is set +if(DEFINED ENV{WAMR_ROOT_DIR}) + set(WAMR_ROOT_DIR $ENV{WAMR_ROOT_DIR}) +else() + message(FATAL_ERROR "'WAMR_ROOT_DIR' need to be specified") +endif() +message("wasi-sdk was found at ${WAMR_ROOT_DIR}") + +# Check if WASI_SDK_PATH is set +if(NOT $ENV{WASI_SDK_PATH} STREQUAL "") + set(WASI_SDK_PATH $ENV{WASI_SDK_PATH}) +else() + find_program(WASM_C_COMPILER clang /opt/wasi-sdk/bin NO_DEFAULT_PATH) + if(NOT WASM_C_COMPILER) + message(FATAL_ERROR "'wasi-sdk' not found, please ensure wasi-sdk is installed.\ + You can download and install it from\ + https://github.com/WebAssembly/wasi-sdk/releases") + else() + set(WASI_SDK_PATH /opt/wasi-sdk) + endif() +endif() +message("wasi-sdk was found at ${WASI_SDK_PATH}") + +# Check if WAMR_APP_FRAMEWORK_DIR is set +if (DEFINED ENV{WAMR_APP_FRAMEWORK_DIR}) + set(WAMR_APP_FRAMEWORK_DIR $ENV{WAMR_APP_FRAMEWORK_DIR}) +else() + message(FATAL_ERROR "'wamr-app-framework' not found, please ensure they are installed.\ + You can download and install them from\ + https://github.com/bytecodealliance/wamr-app-framework") +endif() +message("wamr-app-framework was found at ${WAMR_APP_FRAMEWORK_DIR}") + +# set the WAMR_SDK_DIR with the path specified in the environment variable +set(WAMR_SDK_DIR + ${WAMR_APP_FRAMEWORK_DIR}/wamr-sdk +) + +# set the WAMR_LIBC_BUILTIN_DIR +set(WAMR_LIBC_BUILTIN_DIR + ${WAMR_SDK_DIR}/wamr-sdk/app/libc-builtin-sysroot +) + +# set the WAMR_SDK_PACKAGE_OUT_DIR +set(WAMR_SDK_PACKAGE_OUT_DIR + ${CMAKE_CURRENT_BINARY_DIR}/wamr-sdk/app-sdk/wamr-app-framework +) + +# # Reset linker flags +# set(CMAKE_SHARED_LIBRARY_LINK_C_FLAGS "") +# set(CMAKE_SHARED_LIBRARY_LINK_CXX_FLAGS "") + +include (${WAMR_ROOT_DIR}/build-scripts/runtime_lib.cmake) +# include (${SHARED_DIR}/utils/uncommon/shared_uncommon.cmake) # in socket-api sample + +# Build the WAMR runtime +target_sources(app PRIVATE + ${WAMR_RUNTIME_LIB_SOURCE} + src/main.c) + +# Link libraries like in samples. +set(WASI_LIBM "${WASI_SDK_PATH}/share/wasi-sysroot/lib/wasm32-wasi/libm.a") +set(WASI_LIBDL "${WASI_SDK_PATH}/share/wasi-sysroot/lib/wasm32-wasi/libdl.a") + +target_link_libraries(app PUBLIC ${WASI_LIBM} ${WASI_LIBDL}) \ No newline at end of file diff --git a/product-mini/platforms/zephyr/simple-http/README.md b/product-mini/platforms/zephyr/simple-http/README.md new file mode 100644 index 0000000000..040c959a7c --- /dev/null +++ b/product-mini/platforms/zephyr/simple-http/README.md @@ -0,0 +1,143 @@ +# Socket sample +this sample demonstrates the use of WASI API to interact with sockets. + +> ❗ **Important:** This sample was ported/adapted from the http_get zephyr sample. The original sample can be found [here]( https://github.com/zephyrproject-rtos/zephyr/blob/main/samples/net/sockets/http_get/src/http_get.c). + +> 🛠️ **Work in progress:** The sample is functional but be aware that just a small part of WASI socket API was tested. +> Actual Zephyr APIs: +> * socket creation = `zsock_socket` +> * socket connection = `zsock_connect` +> * socket emission = `zsock_sendto` +> * socket reception = `zsock_recvfrom` +> * socket destruction = `zsock_close` +> +> With the sockets most API are in fact provided by the runtime instead of WASI because of the lack of socket support in WASI preview1. + +## Setup +1. Connect a network cable to the board ethernet port. +2. Configure the network interface on the host machine + ``` + Internet Protocol Version 4 (TCP/IPv4) Properties: + IP Address: 192.0.2.10 + Subnet Mask: 255.255.255.0 + Default Gateway: 192.0.2.2 + ``` +3. Start a simple HTTP server on the host machine. + ```bash + python3 -m http.server --bind 0.0.0.0 + ``` +4. Disable any firewall that may block the connection. + +## Configuration +To configure the server side IP address and port modify the following lines in the `http_get.c` file. + +1. The `HTTP_HOST` and `HTTP_PORT` macros define the server IP address and port. + ```c + /* HTTP server to connect to */ + #define HTTP_HOST "192.0.2.10" + /* Port to connect to, as string */ + #define HTTP_PORT "8000" + /* HTTP path to request */ + #define HTTP_PATH "/" + + // ... + + #define REQUEST "GET " HTTP_PATH " HTTP/1.0\r\nHost: " HTTP_HOST "\r\n\r\n" + ``` + > 📄 **Notes:** These macros are used to build the request string, but they are not used to instantiate the address structure. Because at one point we didn't want to use `inet_pton` to convert the string to an address and it remained like this. + +2. The `addr` structure is used to store the server address. + ```c + addr.sin_port = htons(8000); + addr.sin_addr.s_addr = + htonl(0xC000020A); // hard coded IP address for 192.0.2.10 + ``` + +To configure the authorized IP address(es) modify the following lines in the `main.c` file. WAMR will only allow the IP addresses in the pool to connect to the server. +```c +#define ADDRESS_POOL_SIZE 1 + const char *addr_pool[ADDRESS_POOL_SIZE] = { + "192.0.2.10/24", + }; +``` +## Run Command +* **Zephyr Build** + 1. **Build:** Replace `nucleo_h743zi` with your board name and the `WAMR_BUILD_TARGET` in `CMakeList.txt` with your target architecture. + ```bash + ZEPHYR_BASE=~/zephyrproject/zephyr \ + WAMR_ROOT_DIR=~/wasm-micro-runtime \ + WASI_SDK_PATH=~/wasi-sdk-21.0 \ + WAMR_APP_FRAMEWORK_DIR=~/wamr-app-framework \ + west build . -b nucleo_h563zi -p always + ``` + ⚠️ **Warning:** The flags `ZEPHYR_BASE`, `WAMR_ROOT_DIR`, `WASI_SDK_PATH`, and `WAMR_APP_FRAMEWORK_DIR` need to be set otherwise the build will fail. + + 2. **Flash:** + ```bash + ZEPHYR_BASE=~/zephyrproject/zephyr west flash + ``` + + 3. **Monitor:** Use a serial link to monitor the output. Personally, I use minicom. + ```bash + minicom -D /dev/ttyACM0 + ``` + + 4. **Debug:** Curently investigating. + +* **WebAssembly Module** + + ❗ **Important:** I used wasi-sdk 21 to compile the module. I still haven't tried the module with the new wasi-sdk 22. + + 0. **Compile a static lib:** in the `wasm-apps` folder. + * **Compile the an object:** + ```bash + ~/wasi-sdk-21.0/bin/clang --sysroot=/home/user/wasi-sdk-21.0/share/wasi-sysroot -Iinc/ -c inc/wasi_socket_ext.c -o inc/wasi_socket_ext.o + ``` + * **Create a static lib:** + ```bash + ~/wasi-sdk-21.0/bin/llvm-ar rcs inc/libwasi_socket_ext.a inc/wasi_socket_ext.o + ``` + 1. **Compile:** in the `wasm-apps` folder. + ```bash + ~/wasi-sdk-21.0/bin/clang --sysroot=/home/user/wasi-sdk-21.0/share/wasi-sysroot -Iinc/ -nodefaultlibs -o http_get.wasm http_get.c -lc -Linc/ -lwasi_socket_ext -z stack-size=8192 -Wl,--initial-memory=65536 -Wl,--export=__heap_base -Wl,--export=__data_end -Wl,--allow-undefined + ``` + 2. **generate a C header:** Use `xxd` or other tool, I also put simple python script. At application root `simple-http/`. + ```bash + python3 to_c_header.py + ``` + Be free to modify the script to fit your needs. + +## Output +The output should be similar to the following: +```bash +*** Booting Zephyr OS build v3.6.0-4305-g2ec8f442a505 *** +[00:00:00.061,000] net_config: Initializing network +[00:00:00.067,000] net_config: Waiting interface 1 (0x2000a910) to be up... +[00:00:03.158,000] phy_mii: PHY (0) Link speed 100 Mb, full duplex + +[00:00:03.288,000] net_config: Interface 1 (0x2000a910) coming up +[00:00:03.295,000] net_config: IPv4 address: 192.0.2.1 +global heap size: 131072 +Wasm file size: 36351 +main found +[wasm-mod] Preparing HTTP GET request for http://192.0.2.10:8000/ +[wasm-mod] sock = 3 +[wasm-mod] connect rc = 0 +[wasm-mod] send rc = 36 +[wasm-mod] Response: + +HTTP/1.0 200 OK +Server: SimpleHTTP/0.6 Python/3.10.10 +Date: Fri, 14 Jun 2024 07:26:56 GMT +Content-type: text/html; charset=utf-8 +Content-Length: 2821 + +# Skip the HTML content + +[wasm-mod] len = 0 break + +[wasm-mod] Connection closed +main executed +wasi exit code: 0 +elapsed: 405ms +``` \ No newline at end of file diff --git a/product-mini/platforms/zephyr/simple-http/prj.conf b/product-mini/platforms/zephyr/simple-http/prj.conf new file mode 100644 index 0000000000..c6f6ff48d3 --- /dev/null +++ b/product-mini/platforms/zephyr/simple-http/prj.conf @@ -0,0 +1,61 @@ +# Copyright (C) 2019 Intel Corporation. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception + +# Log config +CONFIG_PRINTK=y +CONFIG_LOG=y +CONFIG_LOG_MODE_IMMEDIATE=y +CONFIG_NET_LOG=y + +CONFIG_MAIN_STACK_SIZE=8192 +# CONFIG_HEAP_MEM_POOL_SIZE=32768 +CONFIG_REQUIRES_FULL_LIBC=y + +# Networking config +CONFIG_NETWORKING=y +CONFIG_NET_IPV4=y +CONFIG_NET_IPV6=y +CONFIG_NET_TCP=y +CONFIG_NET_SOCKETS=y +CONFIG_POSIX_API=n + +# Stack conf +# CONFIG_NO_OPTIMIZATIONS=y +CONFIG_STACK_SENTINEL=y +CONFIG_HW_STACK_PROTECTION=y +# CONFIG_STACK_CANARIES=y +# CONFIG_ISR_STACK_SIZE=4096 + +# Network driver config +CONFIG_TEST_RANDOM_GENERATOR=y + +# Network address config +CONFIG_NET_CONFIG_SETTINGS=y +CONFIG_NET_CONFIG_NEED_IPV4=y +CONFIG_NET_CONFIG_MY_IPV4_ADDR="192.0.2.1" +CONFIG_NET_CONFIG_PEER_IPV4_ADDR="192.0.2.2" +CONFIG_NET_CONFIG_MY_IPV4_GW="192.0.2.2" + +# Config File System +CONFIG_FILE_SYSTEM=y +CONFIG_FILE_SYSTEM_LITTLEFS=y +# Flash +CONFIG_FLASH=y +CONFIG_FLASH_MAP=y + +# CONFIG_DNS_RESOLVER=y +# CONFIG_DNS_SERVER_IP_ADDRESSES=y +# CONFIG_DNS_SERVER1="192.0.2.2" + +# Config init stack +# CONFIG_INIT_STACKS=y +# CONFIG_NET_PKT_RX_COUNT=100 +# CONFIG_NET_PKT_TX_COUNT=100 +# CONFIG_NET_BUF_RX_COUNT=100 +# CONFIG_NET_BUF_TX_COUNT=100 + +# Flash +CONFIG_FLASH=y + +# Debug +CONFIG_DEBUG=y \ No newline at end of file diff --git a/product-mini/platforms/zephyr/simple-http/src/http_get.h b/product-mini/platforms/zephyr/simple-http/src/http_get.h new file mode 100644 index 0000000000..0b7dcc8704 --- /dev/null +++ b/product-mini/platforms/zephyr/simple-http/src/http_get.h @@ -0,0 +1,3039 @@ +/* + * Copyright (c) 2017 Linaro Limited + * Copyright (C) 2024 Grenoble INP - ESISAR Limited + * + * SPDX-License-Identifier: Apache-2.0 + */ + +unsigned char __aligned(4) wasm_test_file[] = { + 0x00, 0x61, 0x73, 0x6d, 0x01, 0x00, 0x00, 0x00, 0x01, 0x68, 0x10, 0x60, + 0x03, 0x7f, 0x7f, 0x7f, 0x01, 0x7f, 0x60, 0x03, 0x7f, 0x7e, 0x7f, 0x01, + 0x7e, 0x60, 0x02, 0x7f, 0x7f, 0x01, 0x7f, 0x60, 0x01, 0x7f, 0x01, 0x7f, + 0x60, 0x04, 0x7f, 0x7e, 0x7f, 0x7f, 0x01, 0x7f, 0x60, 0x04, 0x7f, 0x7f, + 0x7f, 0x7f, 0x01, 0x7f, 0x60, 0x01, 0x7f, 0x00, 0x60, 0x06, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, 0x01, 0x7f, 0x60, 0x00, 0x00, 0x60, 0x00, 0x01, + 0x7f, 0x60, 0x02, 0x7c, 0x7f, 0x01, 0x7c, 0x60, 0x05, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x01, 0x7f, 0x60, 0x03, 0x7f, 0x7f, 0x7f, 0x00, 0x60, 0x05, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x00, 0x60, 0x04, 0x7f, 0x7f, 0x7f, 0x7f, + 0x00, 0x60, 0x02, 0x7f, 0x7f, 0x00, 0x02, 0xb4, 0x03, 0x0c, 0x16, 0x77, + 0x61, 0x73, 0x69, 0x5f, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, + 0x5f, 0x70, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x31, 0x08, 0x61, 0x72, + 0x67, 0x73, 0x5f, 0x67, 0x65, 0x74, 0x00, 0x02, 0x16, 0x77, 0x61, 0x73, + 0x69, 0x5f, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x5f, 0x70, + 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x31, 0x0e, 0x61, 0x72, 0x67, 0x73, + 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x73, 0x5f, 0x67, 0x65, 0x74, 0x00, 0x02, + 0x16, 0x77, 0x61, 0x73, 0x69, 0x5f, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, + 0x6f, 0x74, 0x5f, 0x70, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x31, 0x08, + 0x66, 0x64, 0x5f, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x00, 0x03, 0x16, 0x77, + 0x61, 0x73, 0x69, 0x5f, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, + 0x5f, 0x70, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x31, 0x0d, 0x66, 0x64, + 0x5f, 0x66, 0x64, 0x73, 0x74, 0x61, 0x74, 0x5f, 0x67, 0x65, 0x74, 0x00, + 0x02, 0x16, 0x77, 0x61, 0x73, 0x69, 0x5f, 0x73, 0x6e, 0x61, 0x70, 0x73, + 0x68, 0x6f, 0x74, 0x5f, 0x70, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x31, + 0x07, 0x66, 0x64, 0x5f, 0x73, 0x65, 0x65, 0x6b, 0x00, 0x04, 0x16, 0x77, + 0x61, 0x73, 0x69, 0x5f, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, + 0x5f, 0x70, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x31, 0x08, 0x66, 0x64, + 0x5f, 0x77, 0x72, 0x69, 0x74, 0x65, 0x00, 0x05, 0x16, 0x77, 0x61, 0x73, + 0x69, 0x5f, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x5f, 0x70, + 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x31, 0x09, 0x70, 0x72, 0x6f, 0x63, + 0x5f, 0x65, 0x78, 0x69, 0x74, 0x00, 0x06, 0x16, 0x77, 0x61, 0x73, 0x69, + 0x5f, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x5f, 0x70, 0x72, + 0x65, 0x76, 0x69, 0x65, 0x77, 0x31, 0x09, 0x73, 0x6f, 0x63, 0x6b, 0x5f, + 0x72, 0x65, 0x63, 0x76, 0x00, 0x07, 0x16, 0x77, 0x61, 0x73, 0x69, 0x5f, + 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x5f, 0x70, 0x72, 0x65, + 0x76, 0x69, 0x65, 0x77, 0x31, 0x0c, 0x73, 0x6f, 0x63, 0x6b, 0x5f, 0x63, + 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x00, 0x02, 0x16, 0x77, 0x61, 0x73, + 0x69, 0x5f, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x5f, 0x70, + 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x31, 0x0c, 0x73, 0x6f, 0x63, 0x6b, + 0x5f, 0x73, 0x65, 0x6e, 0x64, 0x5f, 0x74, 0x6f, 0x00, 0x07, 0x16, 0x77, + 0x61, 0x73, 0x69, 0x5f, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, + 0x5f, 0x70, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x31, 0x0e, 0x73, 0x6f, + 0x63, 0x6b, 0x5f, 0x72, 0x65, 0x63, 0x76, 0x5f, 0x66, 0x72, 0x6f, 0x6d, + 0x00, 0x07, 0x16, 0x77, 0x61, 0x73, 0x69, 0x5f, 0x73, 0x6e, 0x61, 0x70, + 0x73, 0x68, 0x6f, 0x74, 0x5f, 0x70, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, + 0x31, 0x09, 0x73, 0x6f, 0x63, 0x6b, 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x00, + 0x05, 0x03, 0x4c, 0x4b, 0x08, 0x08, 0x02, 0x03, 0x03, 0x06, 0x06, 0x02, + 0x06, 0x09, 0x08, 0x03, 0x02, 0x02, 0x03, 0x02, 0x04, 0x05, 0x06, 0x07, + 0x08, 0x03, 0x08, 0x08, 0x03, 0x03, 0x02, 0x03, 0x00, 0x00, 0x03, 0x00, + 0x01, 0x01, 0x09, 0x08, 0x03, 0x00, 0x05, 0x02, 0x02, 0x03, 0x00, 0x02, + 0x0a, 0x02, 0x00, 0x0b, 0x0c, 0x0d, 0x08, 0x00, 0x00, 0x03, 0x00, 0x02, + 0x00, 0x0e, 0x05, 0x03, 0x03, 0x00, 0x00, 0x0c, 0x0c, 0x00, 0x02, 0x07, + 0x07, 0x07, 0x07, 0x00, 0x05, 0x0f, 0x0f, 0x04, 0x05, 0x01, 0x70, 0x01, + 0x05, 0x05, 0x05, 0x03, 0x01, 0x00, 0x01, 0x06, 0x1a, 0x04, 0x7f, 0x01, + 0x41, 0xc0, 0xf4, 0x00, 0x0b, 0x7f, 0x00, 0x41, 0x00, 0x0b, 0x7f, 0x00, + 0x41, 0xc0, 0xf4, 0x00, 0x0b, 0x7f, 0x00, 0x41, 0xb4, 0x34, 0x0b, 0x07, + 0x2e, 0x04, 0x06, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x02, 0x00, 0x06, + 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x00, 0x0d, 0x0b, 0x5f, 0x5f, 0x68, + 0x65, 0x61, 0x70, 0x5f, 0x62, 0x61, 0x73, 0x65, 0x03, 0x02, 0x0a, 0x5f, + 0x5f, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x65, 0x6e, 0x64, 0x03, 0x03, 0x09, + 0x0a, 0x01, 0x00, 0x41, 0x01, 0x0b, 0x04, 0x29, 0x27, 0x2b, 0x2d, 0x0a, + 0x81, 0xf1, 0x01, 0x4b, 0x02, 0x00, 0x0b, 0x52, 0x01, 0x01, 0x7f, 0x02, + 0x40, 0x02, 0x40, 0x23, 0x81, 0x80, 0x80, 0x80, 0x00, 0x41, 0xf0, 0x9f, + 0x80, 0x80, 0x00, 0x6a, 0x28, 0x02, 0x00, 0x0d, 0x00, 0x23, 0x81, 0x80, + 0x80, 0x80, 0x00, 0x41, 0xf0, 0x9f, 0x80, 0x80, 0x00, 0x6a, 0x41, 0x01, + 0x36, 0x02, 0x00, 0x10, 0x8c, 0x80, 0x80, 0x80, 0x00, 0x10, 0x95, 0x80, + 0x80, 0x80, 0x00, 0x21, 0x00, 0x10, 0xa3, 0x80, 0x80, 0x80, 0x00, 0x20, + 0x00, 0x0d, 0x01, 0x0f, 0x0b, 0x00, 0x00, 0x0b, 0x20, 0x00, 0x10, 0x9e, + 0x80, 0x80, 0x80, 0x00, 0x00, 0x0b, 0xfa, 0x07, 0x03, 0x07, 0x7f, 0x01, + 0x7e, 0x5d, 0x7f, 0x23, 0x80, 0x80, 0x80, 0x80, 0x00, 0x21, 0x02, 0x41, + 0x90, 0x01, 0x21, 0x03, 0x20, 0x02, 0x20, 0x03, 0x6b, 0x21, 0x04, 0x20, + 0x04, 0x24, 0x80, 0x80, 0x80, 0x80, 0x00, 0x41, 0x00, 0x21, 0x05, 0x20, + 0x04, 0x20, 0x05, 0x36, 0x02, 0x8c, 0x01, 0x20, 0x04, 0x20, 0x00, 0x36, + 0x02, 0x88, 0x01, 0x20, 0x04, 0x20, 0x01, 0x36, 0x02, 0x84, 0x01, 0x41, + 0x00, 0x21, 0x06, 0x20, 0x04, 0x20, 0x06, 0x36, 0x02, 0x5c, 0x41, 0xca, + 0x8a, 0x80, 0x80, 0x00, 0x21, 0x07, 0x41, 0x00, 0x21, 0x08, 0x20, 0x07, + 0x20, 0x08, 0x10, 0xa6, 0x80, 0x80, 0x80, 0x00, 0x1a, 0x42, 0x00, 0x21, + 0x09, 0x20, 0x04, 0x20, 0x09, 0x37, 0x03, 0x68, 0x20, 0x04, 0x20, 0x09, + 0x37, 0x03, 0x60, 0x41, 0x01, 0x21, 0x0a, 0x20, 0x04, 0x20, 0x0a, 0x3b, + 0x01, 0x60, 0x41, 0xc0, 0x3e, 0x21, 0x0b, 0x41, 0xff, 0xff, 0x03, 0x21, + 0x0c, 0x20, 0x0b, 0x20, 0x0c, 0x71, 0x21, 0x0d, 0x20, 0x0d, 0x10, 0xa5, + 0x80, 0x80, 0x80, 0x00, 0x21, 0x0e, 0x20, 0x04, 0x20, 0x0e, 0x3b, 0x01, + 0x62, 0x41, 0x8a, 0x84, 0x80, 0x80, 0x7c, 0x21, 0x0f, 0x20, 0x0f, 0x10, + 0xa4, 0x80, 0x80, 0x80, 0x00, 0x21, 0x10, 0x20, 0x04, 0x20, 0x10, 0x36, + 0x02, 0x64, 0x41, 0x01, 0x21, 0x11, 0x41, 0x06, 0x21, 0x12, 0x20, 0x11, + 0x20, 0x12, 0x20, 0x12, 0x10, 0xd3, 0x80, 0x80, 0x80, 0x00, 0x21, 0x13, + 0x20, 0x04, 0x20, 0x13, 0x36, 0x02, 0x7c, 0x20, 0x04, 0x28, 0x02, 0x7c, + 0x21, 0x14, 0x20, 0x04, 0x20, 0x14, 0x36, 0x02, 0x30, 0x41, 0xff, 0x89, + 0x80, 0x80, 0x00, 0x21, 0x15, 0x41, 0x30, 0x21, 0x16, 0x20, 0x04, 0x20, + 0x16, 0x6a, 0x21, 0x17, 0x20, 0x15, 0x20, 0x17, 0x10, 0xa6, 0x80, 0x80, + 0x80, 0x00, 0x1a, 0x20, 0x04, 0x28, 0x02, 0x7c, 0x21, 0x18, 0x41, 0xe0, + 0x00, 0x21, 0x19, 0x20, 0x04, 0x20, 0x19, 0x6a, 0x21, 0x1a, 0x20, 0x1a, + 0x21, 0x1b, 0x41, 0x10, 0x21, 0x1c, 0x20, 0x18, 0x20, 0x1b, 0x20, 0x1c, + 0x10, 0xcd, 0x80, 0x80, 0x80, 0x00, 0x21, 0x1d, 0x20, 0x04, 0x20, 0x1d, + 0x36, 0x02, 0x5c, 0x20, 0x04, 0x28, 0x02, 0x5c, 0x21, 0x1e, 0x20, 0x04, + 0x20, 0x1e, 0x36, 0x02, 0x40, 0x41, 0x95, 0x8a, 0x80, 0x80, 0x00, 0x21, + 0x1f, 0x41, 0xc0, 0x00, 0x21, 0x20, 0x20, 0x04, 0x20, 0x20, 0x6a, 0x21, + 0x21, 0x20, 0x1f, 0x20, 0x21, 0x10, 0xa6, 0x80, 0x80, 0x80, 0x00, 0x1a, + 0x20, 0x04, 0x28, 0x02, 0x7c, 0x21, 0x22, 0x41, 0xb3, 0x8c, 0x80, 0x80, + 0x00, 0x21, 0x23, 0x41, 0x24, 0x21, 0x24, 0x41, 0x00, 0x21, 0x25, 0x41, + 0xe0, 0x00, 0x21, 0x26, 0x20, 0x04, 0x20, 0x26, 0x6a, 0x21, 0x27, 0x20, + 0x27, 0x21, 0x28, 0x41, 0x10, 0x21, 0x29, 0x20, 0x22, 0x20, 0x23, 0x20, + 0x24, 0x20, 0x25, 0x20, 0x28, 0x20, 0x29, 0x10, 0xcf, 0x80, 0x80, 0x80, + 0x00, 0x21, 0x2a, 0x20, 0x04, 0x20, 0x2a, 0x36, 0x02, 0x5c, 0x20, 0x04, + 0x28, 0x02, 0x5c, 0x21, 0x2b, 0x20, 0x04, 0x20, 0x2b, 0x36, 0x02, 0x50, + 0x41, 0xb1, 0x8a, 0x80, 0x80, 0x00, 0x21, 0x2c, 0x41, 0xd0, 0x00, 0x21, + 0x2d, 0x20, 0x04, 0x20, 0x2d, 0x6a, 0x21, 0x2e, 0x20, 0x2c, 0x20, 0x2e, + 0x10, 0xa6, 0x80, 0x80, 0x80, 0x00, 0x1a, 0x20, 0x04, 0x28, 0x02, 0x5c, + 0x21, 0x2f, 0x41, 0x00, 0x21, 0x30, 0x20, 0x2f, 0x21, 0x31, 0x20, 0x30, + 0x21, 0x32, 0x20, 0x31, 0x20, 0x32, 0x48, 0x21, 0x33, 0x41, 0x01, 0x21, + 0x34, 0x20, 0x33, 0x20, 0x34, 0x71, 0x21, 0x35, 0x02, 0x40, 0x02, 0x40, + 0x20, 0x35, 0x45, 0x0d, 0x00, 0x41, 0x80, 0xa8, 0x80, 0x80, 0x00, 0x21, + 0x36, 0x20, 0x36, 0x28, 0x02, 0x00, 0x21, 0x37, 0x20, 0x04, 0x20, 0x37, + 0x36, 0x02, 0x00, 0x41, 0xea, 0x89, 0x80, 0x80, 0x00, 0x21, 0x38, 0x20, + 0x38, 0x20, 0x04, 0x10, 0xa6, 0x80, 0x80, 0x80, 0x00, 0x1a, 0x41, 0x00, + 0x21, 0x39, 0x20, 0x04, 0x20, 0x39, 0x36, 0x02, 0x8c, 0x01, 0x0c, 0x01, + 0x0b, 0x41, 0xd8, 0x8c, 0x80, 0x80, 0x00, 0x21, 0x3a, 0x41, 0x00, 0x21, + 0x3b, 0x20, 0x3a, 0x20, 0x3b, 0x10, 0xa6, 0x80, 0x80, 0x80, 0x00, 0x1a, + 0x03, 0x40, 0x41, 0x10, 0x21, 0x3c, 0x20, 0x04, 0x20, 0x3c, 0x36, 0x02, + 0x58, 0x20, 0x04, 0x28, 0x02, 0x7c, 0x21, 0x3d, 0x41, 0x80, 0xa0, 0x80, + 0x80, 0x00, 0x21, 0x3e, 0x41, 0xff, 0x07, 0x21, 0x3f, 0x41, 0x00, 0x21, + 0x40, 0x41, 0xe0, 0x00, 0x21, 0x41, 0x20, 0x04, 0x20, 0x41, 0x6a, 0x21, + 0x42, 0x20, 0x42, 0x21, 0x43, 0x41, 0xd8, 0x00, 0x21, 0x44, 0x20, 0x04, + 0x20, 0x44, 0x6a, 0x21, 0x45, 0x20, 0x45, 0x21, 0x46, 0x20, 0x3d, 0x20, + 0x3e, 0x20, 0x3f, 0x20, 0x40, 0x20, 0x43, 0x20, 0x46, 0x10, 0xd1, 0x80, + 0x80, 0x80, 0x00, 0x21, 0x47, 0x20, 0x04, 0x20, 0x47, 0x36, 0x02, 0x54, + 0x20, 0x04, 0x28, 0x02, 0x54, 0x21, 0x48, 0x41, 0x00, 0x21, 0x49, 0x20, + 0x48, 0x21, 0x4a, 0x20, 0x49, 0x21, 0x4b, 0x20, 0x4a, 0x20, 0x4b, 0x48, + 0x21, 0x4c, 0x41, 0x01, 0x21, 0x4d, 0x20, 0x4c, 0x20, 0x4d, 0x71, 0x21, + 0x4e, 0x02, 0x40, 0x20, 0x4e, 0x45, 0x0d, 0x00, 0x41, 0x80, 0xa8, 0x80, + 0x80, 0x00, 0x21, 0x4f, 0x20, 0x4f, 0x28, 0x02, 0x00, 0x21, 0x50, 0x20, + 0x04, 0x20, 0x50, 0x36, 0x02, 0x10, 0x41, 0xea, 0x89, 0x80, 0x80, 0x00, + 0x21, 0x51, 0x41, 0x10, 0x21, 0x52, 0x20, 0x04, 0x20, 0x52, 0x6a, 0x21, + 0x53, 0x20, 0x51, 0x20, 0x53, 0x10, 0xa6, 0x80, 0x80, 0x80, 0x00, 0x1a, + 0x41, 0x00, 0x21, 0x54, 0x20, 0x04, 0x20, 0x54, 0x36, 0x02, 0x8c, 0x01, + 0x0c, 0x02, 0x0b, 0x20, 0x04, 0x28, 0x02, 0x54, 0x21, 0x55, 0x41, 0x00, + 0x21, 0x56, 0x20, 0x55, 0x20, 0x56, 0x3a, 0x00, 0x80, 0xa0, 0x80, 0x80, + 0x00, 0x41, 0x80, 0xa0, 0x80, 0x80, 0x00, 0x21, 0x57, 0x20, 0x04, 0x20, + 0x57, 0x36, 0x02, 0x20, 0x41, 0x9d, 0x88, 0x80, 0x80, 0x00, 0x21, 0x58, + 0x41, 0x20, 0x21, 0x59, 0x20, 0x04, 0x20, 0x59, 0x6a, 0x21, 0x5a, 0x20, + 0x58, 0x20, 0x5a, 0x10, 0xa6, 0x80, 0x80, 0x80, 0x00, 0x1a, 0x20, 0x04, + 0x28, 0x02, 0x54, 0x21, 0x5b, 0x02, 0x40, 0x02, 0x40, 0x20, 0x5b, 0x0d, + 0x00, 0x41, 0xb2, 0x89, 0x80, 0x80, 0x00, 0x21, 0x5c, 0x41, 0x00, 0x21, + 0x5d, 0x20, 0x5c, 0x20, 0x5d, 0x10, 0xa6, 0x80, 0x80, 0x80, 0x00, 0x1a, + 0x0c, 0x01, 0x0b, 0x0c, 0x01, 0x0b, 0x0b, 0x41, 0xed, 0x8c, 0x80, 0x80, + 0x00, 0x21, 0x5e, 0x41, 0x00, 0x21, 0x5f, 0x20, 0x5e, 0x20, 0x5f, 0x10, + 0xa6, 0x80, 0x80, 0x80, 0x00, 0x1a, 0x20, 0x04, 0x28, 0x02, 0x7c, 0x21, + 0x60, 0x20, 0x60, 0x10, 0x97, 0x80, 0x80, 0x80, 0x00, 0x1a, 0x41, 0xcc, + 0x89, 0x80, 0x80, 0x00, 0x21, 0x61, 0x41, 0x00, 0x21, 0x62, 0x20, 0x61, + 0x20, 0x62, 0x10, 0xa6, 0x80, 0x80, 0x80, 0x00, 0x1a, 0x41, 0x00, 0x21, + 0x63, 0x20, 0x04, 0x20, 0x63, 0x36, 0x02, 0x8c, 0x01, 0x0b, 0x20, 0x04, + 0x28, 0x02, 0x8c, 0x01, 0x21, 0x64, 0x41, 0x90, 0x01, 0x21, 0x65, 0x20, + 0x04, 0x20, 0x65, 0x6a, 0x21, 0x66, 0x20, 0x66, 0x24, 0x80, 0x80, 0x80, + 0x80, 0x00, 0x20, 0x64, 0x0f, 0x0b, 0x0a, 0x00, 0x20, 0x00, 0x10, 0x90, + 0x80, 0x80, 0x80, 0x00, 0x0b, 0xab, 0x32, 0x01, 0x0b, 0x7f, 0x23, 0x80, + 0x80, 0x80, 0x80, 0x00, 0x41, 0x10, 0x6b, 0x22, 0x01, 0x24, 0x80, 0x80, + 0x80, 0x80, 0x00, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, 0x02, + 0x40, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, 0x02, + 0x40, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, 0x02, + 0x40, 0x41, 0x00, 0x28, 0x02, 0x9c, 0xa8, 0x80, 0x80, 0x00, 0x22, 0x02, + 0x0d, 0x00, 0x02, 0x40, 0x41, 0x00, 0x28, 0x02, 0xdc, 0xab, 0x80, 0x80, + 0x00, 0x22, 0x03, 0x0d, 0x00, 0x41, 0x00, 0x42, 0x7f, 0x37, 0x02, 0xe8, + 0xab, 0x80, 0x80, 0x00, 0x41, 0x00, 0x42, 0x80, 0x80, 0x84, 0x80, 0x80, + 0x80, 0xc0, 0x00, 0x37, 0x02, 0xe0, 0xab, 0x80, 0x80, 0x00, 0x41, 0x00, + 0x20, 0x01, 0x41, 0x08, 0x6a, 0x41, 0x70, 0x71, 0x41, 0xd8, 0xaa, 0xd5, + 0xaa, 0x05, 0x73, 0x22, 0x03, 0x36, 0x02, 0xdc, 0xab, 0x80, 0x80, 0x00, + 0x41, 0x00, 0x41, 0x00, 0x36, 0x02, 0xf0, 0xab, 0x80, 0x80, 0x00, 0x41, + 0x00, 0x41, 0x00, 0x36, 0x02, 0xc0, 0xab, 0x80, 0x80, 0x00, 0x0b, 0x41, + 0x80, 0x80, 0x84, 0x80, 0x00, 0x41, 0xc0, 0xf4, 0x80, 0x80, 0x00, 0x49, + 0x0d, 0x01, 0x41, 0x00, 0x21, 0x02, 0x41, 0x80, 0x80, 0x84, 0x80, 0x00, + 0x41, 0xc0, 0xf4, 0x80, 0x80, 0x00, 0x6b, 0x41, 0xd9, 0x00, 0x49, 0x0d, + 0x00, 0x41, 0x00, 0x21, 0x04, 0x41, 0x00, 0x41, 0xc0, 0xf4, 0x80, 0x80, + 0x00, 0x36, 0x02, 0xc4, 0xab, 0x80, 0x80, 0x00, 0x41, 0x00, 0x41, 0xc0, + 0xf4, 0x80, 0x80, 0x00, 0x36, 0x02, 0x94, 0xa8, 0x80, 0x80, 0x00, 0x41, + 0x00, 0x20, 0x03, 0x36, 0x02, 0xa8, 0xa8, 0x80, 0x80, 0x00, 0x41, 0x00, + 0x41, 0x7f, 0x36, 0x02, 0xa4, 0xa8, 0x80, 0x80, 0x00, 0x41, 0x00, 0x41, + 0x80, 0x80, 0x84, 0x80, 0x00, 0x41, 0xc0, 0xf4, 0x80, 0x80, 0x00, 0x6b, + 0x36, 0x02, 0xc8, 0xab, 0x80, 0x80, 0x00, 0x03, 0x40, 0x20, 0x04, 0x41, + 0xc0, 0xa8, 0x80, 0x80, 0x00, 0x6a, 0x20, 0x04, 0x41, 0xb4, 0xa8, 0x80, + 0x80, 0x00, 0x6a, 0x22, 0x03, 0x36, 0x02, 0x00, 0x20, 0x03, 0x20, 0x04, + 0x41, 0xac, 0xa8, 0x80, 0x80, 0x00, 0x6a, 0x22, 0x05, 0x36, 0x02, 0x00, + 0x20, 0x04, 0x41, 0xb8, 0xa8, 0x80, 0x80, 0x00, 0x6a, 0x20, 0x05, 0x36, + 0x02, 0x00, 0x20, 0x04, 0x41, 0xc8, 0xa8, 0x80, 0x80, 0x00, 0x6a, 0x20, + 0x04, 0x41, 0xbc, 0xa8, 0x80, 0x80, 0x00, 0x6a, 0x22, 0x05, 0x36, 0x02, + 0x00, 0x20, 0x05, 0x20, 0x03, 0x36, 0x02, 0x00, 0x20, 0x04, 0x41, 0xd0, + 0xa8, 0x80, 0x80, 0x00, 0x6a, 0x20, 0x04, 0x41, 0xc4, 0xa8, 0x80, 0x80, + 0x00, 0x6a, 0x22, 0x03, 0x36, 0x02, 0x00, 0x20, 0x03, 0x20, 0x05, 0x36, + 0x02, 0x00, 0x20, 0x04, 0x41, 0xcc, 0xa8, 0x80, 0x80, 0x00, 0x6a, 0x20, + 0x03, 0x36, 0x02, 0x00, 0x20, 0x04, 0x41, 0x20, 0x6a, 0x22, 0x04, 0x41, + 0x80, 0x02, 0x47, 0x0d, 0x00, 0x0b, 0x41, 0xc0, 0xf4, 0x80, 0x80, 0x00, + 0x41, 0x78, 0x41, 0xc0, 0xf4, 0x80, 0x80, 0x00, 0x6b, 0x41, 0x0f, 0x71, + 0x22, 0x04, 0x6a, 0x22, 0x02, 0x41, 0x04, 0x6a, 0x41, 0x80, 0x80, 0x84, + 0x80, 0x00, 0x41, 0xc0, 0xf4, 0x80, 0x80, 0x00, 0x6b, 0x41, 0x48, 0x6a, + 0x22, 0x03, 0x20, 0x04, 0x6b, 0x22, 0x04, 0x41, 0x01, 0x72, 0x36, 0x02, + 0x00, 0x41, 0x00, 0x41, 0x00, 0x28, 0x02, 0xec, 0xab, 0x80, 0x80, 0x00, + 0x36, 0x02, 0xa0, 0xa8, 0x80, 0x80, 0x00, 0x41, 0x00, 0x20, 0x04, 0x36, + 0x02, 0x90, 0xa8, 0x80, 0x80, 0x00, 0x41, 0x00, 0x20, 0x02, 0x36, 0x02, + 0x9c, 0xa8, 0x80, 0x80, 0x00, 0x20, 0x03, 0x41, 0xc0, 0xf4, 0x80, 0x80, + 0x00, 0x6a, 0x41, 0x04, 0x6a, 0x41, 0x38, 0x36, 0x02, 0x00, 0x0b, 0x02, + 0x40, 0x02, 0x40, 0x20, 0x00, 0x41, 0xec, 0x01, 0x4b, 0x0d, 0x00, 0x02, + 0x40, 0x41, 0x00, 0x28, 0x02, 0x84, 0xa8, 0x80, 0x80, 0x00, 0x22, 0x06, + 0x41, 0x10, 0x20, 0x00, 0x41, 0x13, 0x6a, 0x41, 0x70, 0x71, 0x20, 0x00, + 0x41, 0x0b, 0x49, 0x1b, 0x22, 0x07, 0x41, 0x03, 0x76, 0x22, 0x03, 0x76, + 0x22, 0x04, 0x41, 0x03, 0x71, 0x45, 0x0d, 0x00, 0x02, 0x40, 0x02, 0x40, + 0x20, 0x04, 0x41, 0x01, 0x71, 0x20, 0x03, 0x72, 0x41, 0x01, 0x73, 0x22, + 0x05, 0x41, 0x03, 0x74, 0x22, 0x03, 0x41, 0xac, 0xa8, 0x80, 0x80, 0x00, + 0x6a, 0x22, 0x04, 0x20, 0x03, 0x41, 0xb4, 0xa8, 0x80, 0x80, 0x00, 0x6a, + 0x28, 0x02, 0x00, 0x22, 0x03, 0x28, 0x02, 0x08, 0x22, 0x07, 0x47, 0x0d, + 0x00, 0x41, 0x00, 0x20, 0x06, 0x41, 0x7e, 0x20, 0x05, 0x77, 0x71, 0x36, + 0x02, 0x84, 0xa8, 0x80, 0x80, 0x00, 0x0c, 0x01, 0x0b, 0x20, 0x04, 0x20, + 0x07, 0x36, 0x02, 0x08, 0x20, 0x07, 0x20, 0x04, 0x36, 0x02, 0x0c, 0x0b, + 0x20, 0x03, 0x41, 0x08, 0x6a, 0x21, 0x04, 0x20, 0x03, 0x20, 0x05, 0x41, + 0x03, 0x74, 0x22, 0x05, 0x41, 0x03, 0x72, 0x36, 0x02, 0x04, 0x20, 0x03, + 0x20, 0x05, 0x6a, 0x22, 0x03, 0x20, 0x03, 0x28, 0x02, 0x04, 0x41, 0x01, + 0x72, 0x36, 0x02, 0x04, 0x0c, 0x12, 0x0b, 0x20, 0x07, 0x41, 0x00, 0x28, + 0x02, 0x8c, 0xa8, 0x80, 0x80, 0x00, 0x22, 0x08, 0x4d, 0x0d, 0x01, 0x02, + 0x40, 0x20, 0x04, 0x45, 0x0d, 0x00, 0x02, 0x40, 0x02, 0x40, 0x20, 0x04, + 0x20, 0x03, 0x74, 0x41, 0x02, 0x20, 0x03, 0x74, 0x22, 0x04, 0x41, 0x00, + 0x20, 0x04, 0x6b, 0x72, 0x71, 0x68, 0x22, 0x03, 0x41, 0x03, 0x74, 0x22, + 0x04, 0x41, 0xac, 0xa8, 0x80, 0x80, 0x00, 0x6a, 0x22, 0x05, 0x20, 0x04, + 0x41, 0xb4, 0xa8, 0x80, 0x80, 0x00, 0x6a, 0x28, 0x02, 0x00, 0x22, 0x04, + 0x28, 0x02, 0x08, 0x22, 0x00, 0x47, 0x0d, 0x00, 0x41, 0x00, 0x20, 0x06, + 0x41, 0x7e, 0x20, 0x03, 0x77, 0x71, 0x22, 0x06, 0x36, 0x02, 0x84, 0xa8, + 0x80, 0x80, 0x00, 0x0c, 0x01, 0x0b, 0x20, 0x05, 0x20, 0x00, 0x36, 0x02, + 0x08, 0x20, 0x00, 0x20, 0x05, 0x36, 0x02, 0x0c, 0x0b, 0x20, 0x04, 0x20, + 0x07, 0x41, 0x03, 0x72, 0x36, 0x02, 0x04, 0x20, 0x04, 0x20, 0x03, 0x41, + 0x03, 0x74, 0x22, 0x03, 0x6a, 0x20, 0x03, 0x20, 0x07, 0x6b, 0x22, 0x05, + 0x36, 0x02, 0x00, 0x20, 0x04, 0x20, 0x07, 0x6a, 0x22, 0x00, 0x20, 0x05, + 0x41, 0x01, 0x72, 0x36, 0x02, 0x04, 0x02, 0x40, 0x20, 0x08, 0x45, 0x0d, + 0x00, 0x20, 0x08, 0x41, 0x78, 0x71, 0x41, 0xac, 0xa8, 0x80, 0x80, 0x00, + 0x6a, 0x21, 0x07, 0x41, 0x00, 0x28, 0x02, 0x98, 0xa8, 0x80, 0x80, 0x00, + 0x21, 0x03, 0x02, 0x40, 0x02, 0x40, 0x20, 0x06, 0x41, 0x01, 0x20, 0x08, + 0x41, 0x03, 0x76, 0x74, 0x22, 0x09, 0x71, 0x0d, 0x00, 0x41, 0x00, 0x20, + 0x06, 0x20, 0x09, 0x72, 0x36, 0x02, 0x84, 0xa8, 0x80, 0x80, 0x00, 0x20, + 0x07, 0x21, 0x09, 0x0c, 0x01, 0x0b, 0x20, 0x07, 0x28, 0x02, 0x08, 0x21, + 0x09, 0x0b, 0x20, 0x09, 0x20, 0x03, 0x36, 0x02, 0x0c, 0x20, 0x07, 0x20, + 0x03, 0x36, 0x02, 0x08, 0x20, 0x03, 0x20, 0x07, 0x36, 0x02, 0x0c, 0x20, + 0x03, 0x20, 0x09, 0x36, 0x02, 0x08, 0x0b, 0x20, 0x04, 0x41, 0x08, 0x6a, + 0x21, 0x04, 0x41, 0x00, 0x20, 0x00, 0x36, 0x02, 0x98, 0xa8, 0x80, 0x80, + 0x00, 0x41, 0x00, 0x20, 0x05, 0x36, 0x02, 0x8c, 0xa8, 0x80, 0x80, 0x00, + 0x0c, 0x12, 0x0b, 0x41, 0x00, 0x28, 0x02, 0x88, 0xa8, 0x80, 0x80, 0x00, + 0x22, 0x0a, 0x45, 0x0d, 0x01, 0x20, 0x0a, 0x68, 0x41, 0x02, 0x74, 0x41, + 0xb4, 0xaa, 0x80, 0x80, 0x00, 0x6a, 0x28, 0x02, 0x00, 0x22, 0x00, 0x28, + 0x02, 0x04, 0x41, 0x78, 0x71, 0x20, 0x07, 0x6b, 0x21, 0x03, 0x20, 0x00, + 0x21, 0x05, 0x02, 0x40, 0x03, 0x40, 0x02, 0x40, 0x20, 0x05, 0x28, 0x02, + 0x10, 0x22, 0x04, 0x0d, 0x00, 0x20, 0x05, 0x41, 0x14, 0x6a, 0x28, 0x02, + 0x00, 0x22, 0x04, 0x45, 0x0d, 0x02, 0x0b, 0x20, 0x04, 0x28, 0x02, 0x04, + 0x41, 0x78, 0x71, 0x20, 0x07, 0x6b, 0x22, 0x05, 0x20, 0x03, 0x20, 0x05, + 0x20, 0x03, 0x49, 0x22, 0x05, 0x1b, 0x21, 0x03, 0x20, 0x04, 0x20, 0x00, + 0x20, 0x05, 0x1b, 0x21, 0x00, 0x20, 0x04, 0x21, 0x05, 0x0c, 0x00, 0x0b, + 0x0b, 0x20, 0x00, 0x28, 0x02, 0x18, 0x21, 0x0b, 0x02, 0x40, 0x20, 0x00, + 0x28, 0x02, 0x0c, 0x22, 0x09, 0x20, 0x00, 0x46, 0x0d, 0x00, 0x20, 0x00, + 0x28, 0x02, 0x08, 0x22, 0x04, 0x41, 0x00, 0x28, 0x02, 0x94, 0xa8, 0x80, + 0x80, 0x00, 0x49, 0x1a, 0x20, 0x09, 0x20, 0x04, 0x36, 0x02, 0x08, 0x20, + 0x04, 0x20, 0x09, 0x36, 0x02, 0x0c, 0x0c, 0x11, 0x0b, 0x02, 0x40, 0x20, + 0x00, 0x41, 0x14, 0x6a, 0x22, 0x05, 0x28, 0x02, 0x00, 0x22, 0x04, 0x0d, + 0x00, 0x20, 0x00, 0x28, 0x02, 0x10, 0x22, 0x04, 0x45, 0x0d, 0x04, 0x20, + 0x00, 0x41, 0x10, 0x6a, 0x21, 0x05, 0x0b, 0x03, 0x40, 0x20, 0x05, 0x21, + 0x02, 0x20, 0x04, 0x22, 0x09, 0x41, 0x14, 0x6a, 0x22, 0x05, 0x28, 0x02, + 0x00, 0x22, 0x04, 0x0d, 0x00, 0x20, 0x09, 0x41, 0x10, 0x6a, 0x21, 0x05, + 0x20, 0x09, 0x28, 0x02, 0x10, 0x22, 0x04, 0x0d, 0x00, 0x0b, 0x20, 0x02, + 0x41, 0x00, 0x36, 0x02, 0x00, 0x0c, 0x10, 0x0b, 0x41, 0x7f, 0x21, 0x07, + 0x20, 0x00, 0x41, 0xbf, 0x7f, 0x4b, 0x0d, 0x00, 0x20, 0x00, 0x41, 0x13, + 0x6a, 0x22, 0x04, 0x41, 0x70, 0x71, 0x21, 0x07, 0x41, 0x00, 0x28, 0x02, + 0x88, 0xa8, 0x80, 0x80, 0x00, 0x22, 0x0b, 0x45, 0x0d, 0x00, 0x41, 0x00, + 0x21, 0x08, 0x02, 0x40, 0x20, 0x07, 0x41, 0x80, 0x02, 0x49, 0x0d, 0x00, + 0x41, 0x1f, 0x21, 0x08, 0x20, 0x07, 0x41, 0xff, 0xff, 0xff, 0x07, 0x4b, + 0x0d, 0x00, 0x20, 0x07, 0x41, 0x26, 0x20, 0x04, 0x41, 0x08, 0x76, 0x67, + 0x22, 0x04, 0x6b, 0x76, 0x41, 0x01, 0x71, 0x20, 0x04, 0x41, 0x01, 0x74, + 0x6b, 0x41, 0x3e, 0x6a, 0x21, 0x08, 0x0b, 0x41, 0x00, 0x20, 0x07, 0x6b, + 0x21, 0x03, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, 0x20, 0x08, + 0x41, 0x02, 0x74, 0x41, 0xb4, 0xaa, 0x80, 0x80, 0x00, 0x6a, 0x28, 0x02, + 0x00, 0x22, 0x05, 0x0d, 0x00, 0x41, 0x00, 0x21, 0x04, 0x41, 0x00, 0x21, + 0x09, 0x0c, 0x01, 0x0b, 0x41, 0x00, 0x21, 0x04, 0x20, 0x07, 0x41, 0x00, + 0x41, 0x19, 0x20, 0x08, 0x41, 0x01, 0x76, 0x6b, 0x20, 0x08, 0x41, 0x1f, + 0x46, 0x1b, 0x74, 0x21, 0x00, 0x41, 0x00, 0x21, 0x09, 0x03, 0x40, 0x02, + 0x40, 0x20, 0x05, 0x28, 0x02, 0x04, 0x41, 0x78, 0x71, 0x20, 0x07, 0x6b, + 0x22, 0x06, 0x20, 0x03, 0x4f, 0x0d, 0x00, 0x20, 0x06, 0x21, 0x03, 0x20, + 0x05, 0x21, 0x09, 0x20, 0x06, 0x0d, 0x00, 0x41, 0x00, 0x21, 0x03, 0x20, + 0x05, 0x21, 0x09, 0x20, 0x05, 0x21, 0x04, 0x0c, 0x03, 0x0b, 0x20, 0x04, + 0x20, 0x05, 0x41, 0x14, 0x6a, 0x28, 0x02, 0x00, 0x22, 0x06, 0x20, 0x06, + 0x20, 0x05, 0x20, 0x00, 0x41, 0x1d, 0x76, 0x41, 0x04, 0x71, 0x6a, 0x41, + 0x10, 0x6a, 0x28, 0x02, 0x00, 0x22, 0x05, 0x46, 0x1b, 0x20, 0x04, 0x20, + 0x06, 0x1b, 0x21, 0x04, 0x20, 0x00, 0x41, 0x01, 0x74, 0x21, 0x00, 0x20, + 0x05, 0x0d, 0x00, 0x0b, 0x0b, 0x02, 0x40, 0x20, 0x04, 0x20, 0x09, 0x72, + 0x0d, 0x00, 0x41, 0x00, 0x21, 0x09, 0x41, 0x02, 0x20, 0x08, 0x74, 0x22, + 0x04, 0x41, 0x00, 0x20, 0x04, 0x6b, 0x72, 0x20, 0x0b, 0x71, 0x22, 0x04, + 0x45, 0x0d, 0x03, 0x20, 0x04, 0x68, 0x41, 0x02, 0x74, 0x41, 0xb4, 0xaa, + 0x80, 0x80, 0x00, 0x6a, 0x28, 0x02, 0x00, 0x21, 0x04, 0x0b, 0x20, 0x04, + 0x45, 0x0d, 0x01, 0x0b, 0x03, 0x40, 0x20, 0x04, 0x28, 0x02, 0x04, 0x41, + 0x78, 0x71, 0x20, 0x07, 0x6b, 0x22, 0x06, 0x20, 0x03, 0x49, 0x21, 0x00, + 0x02, 0x40, 0x20, 0x04, 0x28, 0x02, 0x10, 0x22, 0x05, 0x0d, 0x00, 0x20, + 0x04, 0x41, 0x14, 0x6a, 0x28, 0x02, 0x00, 0x21, 0x05, 0x0b, 0x20, 0x06, + 0x20, 0x03, 0x20, 0x00, 0x1b, 0x21, 0x03, 0x20, 0x04, 0x20, 0x09, 0x20, + 0x00, 0x1b, 0x21, 0x09, 0x20, 0x05, 0x21, 0x04, 0x20, 0x05, 0x0d, 0x00, + 0x0b, 0x0b, 0x20, 0x09, 0x45, 0x0d, 0x00, 0x20, 0x03, 0x41, 0x00, 0x28, + 0x02, 0x8c, 0xa8, 0x80, 0x80, 0x00, 0x20, 0x07, 0x6b, 0x4f, 0x0d, 0x00, + 0x20, 0x09, 0x28, 0x02, 0x18, 0x21, 0x02, 0x02, 0x40, 0x20, 0x09, 0x28, + 0x02, 0x0c, 0x22, 0x00, 0x20, 0x09, 0x46, 0x0d, 0x00, 0x20, 0x09, 0x28, + 0x02, 0x08, 0x22, 0x04, 0x41, 0x00, 0x28, 0x02, 0x94, 0xa8, 0x80, 0x80, + 0x00, 0x49, 0x1a, 0x20, 0x00, 0x20, 0x04, 0x36, 0x02, 0x08, 0x20, 0x04, + 0x20, 0x00, 0x36, 0x02, 0x0c, 0x0c, 0x0f, 0x0b, 0x02, 0x40, 0x20, 0x09, + 0x41, 0x14, 0x6a, 0x22, 0x05, 0x28, 0x02, 0x00, 0x22, 0x04, 0x0d, 0x00, + 0x20, 0x09, 0x28, 0x02, 0x10, 0x22, 0x04, 0x45, 0x0d, 0x04, 0x20, 0x09, + 0x41, 0x10, 0x6a, 0x21, 0x05, 0x0b, 0x03, 0x40, 0x20, 0x05, 0x21, 0x06, + 0x20, 0x04, 0x22, 0x00, 0x41, 0x14, 0x6a, 0x22, 0x05, 0x28, 0x02, 0x00, + 0x22, 0x04, 0x0d, 0x00, 0x20, 0x00, 0x41, 0x10, 0x6a, 0x21, 0x05, 0x20, + 0x00, 0x28, 0x02, 0x10, 0x22, 0x04, 0x0d, 0x00, 0x0b, 0x20, 0x06, 0x41, + 0x00, 0x36, 0x02, 0x00, 0x0c, 0x0e, 0x0b, 0x02, 0x40, 0x41, 0x00, 0x28, + 0x02, 0x8c, 0xa8, 0x80, 0x80, 0x00, 0x22, 0x04, 0x20, 0x07, 0x49, 0x0d, + 0x00, 0x41, 0x00, 0x28, 0x02, 0x98, 0xa8, 0x80, 0x80, 0x00, 0x21, 0x03, + 0x02, 0x40, 0x02, 0x40, 0x20, 0x04, 0x20, 0x07, 0x6b, 0x22, 0x05, 0x41, + 0x10, 0x49, 0x0d, 0x00, 0x20, 0x03, 0x20, 0x07, 0x6a, 0x22, 0x00, 0x20, + 0x05, 0x41, 0x01, 0x72, 0x36, 0x02, 0x04, 0x20, 0x03, 0x20, 0x04, 0x6a, + 0x20, 0x05, 0x36, 0x02, 0x00, 0x20, 0x03, 0x20, 0x07, 0x41, 0x03, 0x72, + 0x36, 0x02, 0x04, 0x0c, 0x01, 0x0b, 0x20, 0x03, 0x20, 0x04, 0x41, 0x03, + 0x72, 0x36, 0x02, 0x04, 0x20, 0x03, 0x20, 0x04, 0x6a, 0x22, 0x04, 0x20, + 0x04, 0x28, 0x02, 0x04, 0x41, 0x01, 0x72, 0x36, 0x02, 0x04, 0x41, 0x00, + 0x21, 0x00, 0x41, 0x00, 0x21, 0x05, 0x0b, 0x41, 0x00, 0x20, 0x05, 0x36, + 0x02, 0x8c, 0xa8, 0x80, 0x80, 0x00, 0x41, 0x00, 0x20, 0x00, 0x36, 0x02, + 0x98, 0xa8, 0x80, 0x80, 0x00, 0x20, 0x03, 0x41, 0x08, 0x6a, 0x21, 0x04, + 0x0c, 0x10, 0x0b, 0x02, 0x40, 0x41, 0x00, 0x28, 0x02, 0x90, 0xa8, 0x80, + 0x80, 0x00, 0x22, 0x05, 0x20, 0x07, 0x4d, 0x0d, 0x00, 0x20, 0x02, 0x20, + 0x07, 0x6a, 0x22, 0x04, 0x20, 0x05, 0x20, 0x07, 0x6b, 0x22, 0x03, 0x41, + 0x01, 0x72, 0x36, 0x02, 0x04, 0x41, 0x00, 0x20, 0x04, 0x36, 0x02, 0x9c, + 0xa8, 0x80, 0x80, 0x00, 0x41, 0x00, 0x20, 0x03, 0x36, 0x02, 0x90, 0xa8, + 0x80, 0x80, 0x00, 0x20, 0x02, 0x20, 0x07, 0x41, 0x03, 0x72, 0x36, 0x02, + 0x04, 0x20, 0x02, 0x41, 0x08, 0x6a, 0x21, 0x04, 0x0c, 0x10, 0x0b, 0x02, + 0x40, 0x02, 0x40, 0x41, 0x00, 0x28, 0x02, 0xdc, 0xab, 0x80, 0x80, 0x00, + 0x45, 0x0d, 0x00, 0x41, 0x00, 0x28, 0x02, 0xe4, 0xab, 0x80, 0x80, 0x00, + 0x21, 0x03, 0x0c, 0x01, 0x0b, 0x41, 0x00, 0x42, 0x7f, 0x37, 0x02, 0xe8, + 0xab, 0x80, 0x80, 0x00, 0x41, 0x00, 0x42, 0x80, 0x80, 0x84, 0x80, 0x80, + 0x80, 0xc0, 0x00, 0x37, 0x02, 0xe0, 0xab, 0x80, 0x80, 0x00, 0x41, 0x00, + 0x20, 0x01, 0x41, 0x0c, 0x6a, 0x41, 0x70, 0x71, 0x41, 0xd8, 0xaa, 0xd5, + 0xaa, 0x05, 0x73, 0x36, 0x02, 0xdc, 0xab, 0x80, 0x80, 0x00, 0x41, 0x00, + 0x41, 0x00, 0x36, 0x02, 0xf0, 0xab, 0x80, 0x80, 0x00, 0x41, 0x00, 0x41, + 0x00, 0x36, 0x02, 0xc0, 0xab, 0x80, 0x80, 0x00, 0x41, 0x80, 0x80, 0x04, + 0x21, 0x03, 0x0b, 0x41, 0x00, 0x21, 0x04, 0x02, 0x40, 0x20, 0x03, 0x20, + 0x07, 0x41, 0xc7, 0x00, 0x6a, 0x22, 0x08, 0x6a, 0x22, 0x00, 0x41, 0x00, + 0x20, 0x03, 0x6b, 0x22, 0x06, 0x71, 0x22, 0x09, 0x20, 0x07, 0x4b, 0x0d, + 0x00, 0x41, 0x00, 0x41, 0x30, 0x36, 0x02, 0x80, 0xa8, 0x80, 0x80, 0x00, + 0x0c, 0x10, 0x0b, 0x02, 0x40, 0x41, 0x00, 0x28, 0x02, 0xbc, 0xab, 0x80, + 0x80, 0x00, 0x22, 0x04, 0x45, 0x0d, 0x00, 0x02, 0x40, 0x41, 0x00, 0x28, + 0x02, 0xb4, 0xab, 0x80, 0x80, 0x00, 0x22, 0x03, 0x20, 0x09, 0x6a, 0x22, + 0x0b, 0x20, 0x03, 0x4d, 0x0d, 0x00, 0x20, 0x0b, 0x20, 0x04, 0x4d, 0x0d, + 0x01, 0x0b, 0x41, 0x00, 0x21, 0x04, 0x41, 0x00, 0x41, 0x30, 0x36, 0x02, + 0x80, 0xa8, 0x80, 0x80, 0x00, 0x0c, 0x10, 0x0b, 0x41, 0x00, 0x2d, 0x00, + 0xc0, 0xab, 0x80, 0x80, 0x00, 0x41, 0x04, 0x71, 0x0d, 0x05, 0x02, 0x40, + 0x02, 0x40, 0x02, 0x40, 0x20, 0x02, 0x45, 0x0d, 0x00, 0x41, 0xc4, 0xab, + 0x80, 0x80, 0x00, 0x21, 0x04, 0x03, 0x40, 0x02, 0x40, 0x20, 0x04, 0x28, + 0x02, 0x00, 0x22, 0x03, 0x20, 0x02, 0x4b, 0x0d, 0x00, 0x20, 0x03, 0x20, + 0x04, 0x28, 0x02, 0x04, 0x6a, 0x20, 0x02, 0x4b, 0x0d, 0x03, 0x0b, 0x20, + 0x04, 0x28, 0x02, 0x08, 0x22, 0x04, 0x0d, 0x00, 0x0b, 0x0b, 0x41, 0x00, + 0x10, 0xa1, 0x80, 0x80, 0x80, 0x00, 0x22, 0x00, 0x41, 0x7f, 0x46, 0x0d, + 0x06, 0x20, 0x09, 0x21, 0x06, 0x02, 0x40, 0x41, 0x00, 0x28, 0x02, 0xe0, + 0xab, 0x80, 0x80, 0x00, 0x22, 0x04, 0x41, 0x7f, 0x6a, 0x22, 0x03, 0x20, + 0x00, 0x71, 0x45, 0x0d, 0x00, 0x20, 0x09, 0x20, 0x00, 0x6b, 0x20, 0x03, + 0x20, 0x00, 0x6a, 0x41, 0x00, 0x20, 0x04, 0x6b, 0x71, 0x6a, 0x21, 0x06, + 0x0b, 0x20, 0x06, 0x20, 0x07, 0x4d, 0x0d, 0x06, 0x20, 0x06, 0x41, 0xfe, + 0xff, 0xff, 0xff, 0x07, 0x4b, 0x0d, 0x06, 0x02, 0x40, 0x41, 0x00, 0x28, + 0x02, 0xbc, 0xab, 0x80, 0x80, 0x00, 0x22, 0x04, 0x45, 0x0d, 0x00, 0x41, + 0x00, 0x28, 0x02, 0xb4, 0xab, 0x80, 0x80, 0x00, 0x22, 0x03, 0x20, 0x06, + 0x6a, 0x22, 0x05, 0x20, 0x03, 0x4d, 0x0d, 0x07, 0x20, 0x05, 0x20, 0x04, + 0x4b, 0x0d, 0x07, 0x0b, 0x20, 0x06, 0x10, 0xa1, 0x80, 0x80, 0x80, 0x00, + 0x22, 0x04, 0x20, 0x00, 0x47, 0x0d, 0x01, 0x0c, 0x08, 0x0b, 0x20, 0x00, + 0x20, 0x05, 0x6b, 0x20, 0x06, 0x71, 0x22, 0x06, 0x41, 0xfe, 0xff, 0xff, + 0xff, 0x07, 0x4b, 0x0d, 0x05, 0x20, 0x06, 0x10, 0xa1, 0x80, 0x80, 0x80, + 0x00, 0x22, 0x00, 0x20, 0x04, 0x28, 0x02, 0x00, 0x20, 0x04, 0x28, 0x02, + 0x04, 0x6a, 0x46, 0x0d, 0x04, 0x20, 0x00, 0x21, 0x04, 0x0b, 0x02, 0x40, + 0x20, 0x06, 0x20, 0x07, 0x41, 0xc8, 0x00, 0x6a, 0x4f, 0x0d, 0x00, 0x20, + 0x04, 0x41, 0x7f, 0x46, 0x0d, 0x00, 0x02, 0x40, 0x20, 0x08, 0x20, 0x06, + 0x6b, 0x41, 0x00, 0x28, 0x02, 0xe4, 0xab, 0x80, 0x80, 0x00, 0x22, 0x03, + 0x6a, 0x41, 0x00, 0x20, 0x03, 0x6b, 0x71, 0x22, 0x03, 0x41, 0xfe, 0xff, + 0xff, 0xff, 0x07, 0x4d, 0x0d, 0x00, 0x20, 0x04, 0x21, 0x00, 0x0c, 0x08, + 0x0b, 0x02, 0x40, 0x20, 0x03, 0x10, 0xa1, 0x80, 0x80, 0x80, 0x00, 0x41, + 0x7f, 0x46, 0x0d, 0x00, 0x20, 0x03, 0x20, 0x06, 0x6a, 0x21, 0x06, 0x20, + 0x04, 0x21, 0x00, 0x0c, 0x08, 0x0b, 0x41, 0x00, 0x20, 0x06, 0x6b, 0x10, + 0xa1, 0x80, 0x80, 0x80, 0x00, 0x1a, 0x0c, 0x05, 0x0b, 0x20, 0x04, 0x21, + 0x00, 0x20, 0x04, 0x41, 0x7f, 0x47, 0x0d, 0x06, 0x0c, 0x04, 0x0b, 0x00, + 0x00, 0x0b, 0x41, 0x00, 0x21, 0x09, 0x0c, 0x0c, 0x0b, 0x41, 0x00, 0x21, + 0x00, 0x0c, 0x0a, 0x0b, 0x20, 0x00, 0x41, 0x7f, 0x47, 0x0d, 0x02, 0x0b, + 0x41, 0x00, 0x41, 0x00, 0x28, 0x02, 0xc0, 0xab, 0x80, 0x80, 0x00, 0x41, + 0x04, 0x72, 0x36, 0x02, 0xc0, 0xab, 0x80, 0x80, 0x00, 0x0b, 0x20, 0x09, + 0x41, 0xfe, 0xff, 0xff, 0xff, 0x07, 0x4b, 0x0d, 0x01, 0x20, 0x09, 0x10, + 0xa1, 0x80, 0x80, 0x80, 0x00, 0x21, 0x00, 0x41, 0x00, 0x10, 0xa1, 0x80, + 0x80, 0x80, 0x00, 0x21, 0x04, 0x20, 0x00, 0x41, 0x7f, 0x46, 0x0d, 0x01, + 0x20, 0x04, 0x41, 0x7f, 0x46, 0x0d, 0x01, 0x20, 0x00, 0x20, 0x04, 0x4f, + 0x0d, 0x01, 0x20, 0x04, 0x20, 0x00, 0x6b, 0x22, 0x06, 0x20, 0x07, 0x41, + 0x38, 0x6a, 0x4d, 0x0d, 0x01, 0x0b, 0x41, 0x00, 0x41, 0x00, 0x28, 0x02, + 0xb4, 0xab, 0x80, 0x80, 0x00, 0x20, 0x06, 0x6a, 0x22, 0x04, 0x36, 0x02, + 0xb4, 0xab, 0x80, 0x80, 0x00, 0x02, 0x40, 0x20, 0x04, 0x41, 0x00, 0x28, + 0x02, 0xb8, 0xab, 0x80, 0x80, 0x00, 0x4d, 0x0d, 0x00, 0x41, 0x00, 0x20, + 0x04, 0x36, 0x02, 0xb8, 0xab, 0x80, 0x80, 0x00, 0x0b, 0x02, 0x40, 0x02, + 0x40, 0x02, 0x40, 0x02, 0x40, 0x41, 0x00, 0x28, 0x02, 0x9c, 0xa8, 0x80, + 0x80, 0x00, 0x22, 0x03, 0x45, 0x0d, 0x00, 0x41, 0xc4, 0xab, 0x80, 0x80, + 0x00, 0x21, 0x04, 0x03, 0x40, 0x20, 0x00, 0x20, 0x04, 0x28, 0x02, 0x00, + 0x22, 0x05, 0x20, 0x04, 0x28, 0x02, 0x04, 0x22, 0x09, 0x6a, 0x46, 0x0d, + 0x02, 0x20, 0x04, 0x28, 0x02, 0x08, 0x22, 0x04, 0x0d, 0x00, 0x0c, 0x03, + 0x0b, 0x0b, 0x02, 0x40, 0x02, 0x40, 0x41, 0x00, 0x28, 0x02, 0x94, 0xa8, + 0x80, 0x80, 0x00, 0x22, 0x04, 0x45, 0x0d, 0x00, 0x20, 0x00, 0x20, 0x04, + 0x4f, 0x0d, 0x01, 0x0b, 0x41, 0x00, 0x20, 0x00, 0x36, 0x02, 0x94, 0xa8, + 0x80, 0x80, 0x00, 0x0b, 0x41, 0x00, 0x21, 0x04, 0x41, 0x00, 0x20, 0x06, + 0x36, 0x02, 0xc8, 0xab, 0x80, 0x80, 0x00, 0x41, 0x00, 0x20, 0x00, 0x36, + 0x02, 0xc4, 0xab, 0x80, 0x80, 0x00, 0x41, 0x00, 0x41, 0x7f, 0x36, 0x02, + 0xa4, 0xa8, 0x80, 0x80, 0x00, 0x41, 0x00, 0x41, 0x00, 0x28, 0x02, 0xdc, + 0xab, 0x80, 0x80, 0x00, 0x36, 0x02, 0xa8, 0xa8, 0x80, 0x80, 0x00, 0x41, + 0x00, 0x41, 0x00, 0x36, 0x02, 0xd0, 0xab, 0x80, 0x80, 0x00, 0x03, 0x40, + 0x20, 0x04, 0x41, 0xc0, 0xa8, 0x80, 0x80, 0x00, 0x6a, 0x20, 0x04, 0x41, + 0xb4, 0xa8, 0x80, 0x80, 0x00, 0x6a, 0x22, 0x03, 0x36, 0x02, 0x00, 0x20, + 0x03, 0x20, 0x04, 0x41, 0xac, 0xa8, 0x80, 0x80, 0x00, 0x6a, 0x22, 0x05, + 0x36, 0x02, 0x00, 0x20, 0x04, 0x41, 0xb8, 0xa8, 0x80, 0x80, 0x00, 0x6a, + 0x20, 0x05, 0x36, 0x02, 0x00, 0x20, 0x04, 0x41, 0xc8, 0xa8, 0x80, 0x80, + 0x00, 0x6a, 0x20, 0x04, 0x41, 0xbc, 0xa8, 0x80, 0x80, 0x00, 0x6a, 0x22, + 0x05, 0x36, 0x02, 0x00, 0x20, 0x05, 0x20, 0x03, 0x36, 0x02, 0x00, 0x20, + 0x04, 0x41, 0xd0, 0xa8, 0x80, 0x80, 0x00, 0x6a, 0x20, 0x04, 0x41, 0xc4, + 0xa8, 0x80, 0x80, 0x00, 0x6a, 0x22, 0x03, 0x36, 0x02, 0x00, 0x20, 0x03, + 0x20, 0x05, 0x36, 0x02, 0x00, 0x20, 0x04, 0x41, 0xcc, 0xa8, 0x80, 0x80, + 0x00, 0x6a, 0x20, 0x03, 0x36, 0x02, 0x00, 0x20, 0x04, 0x41, 0x20, 0x6a, + 0x22, 0x04, 0x41, 0x80, 0x02, 0x47, 0x0d, 0x00, 0x0b, 0x20, 0x00, 0x41, + 0x78, 0x20, 0x00, 0x6b, 0x41, 0x0f, 0x71, 0x22, 0x04, 0x6a, 0x22, 0x03, + 0x20, 0x06, 0x41, 0x48, 0x6a, 0x22, 0x05, 0x20, 0x04, 0x6b, 0x22, 0x04, + 0x41, 0x01, 0x72, 0x36, 0x02, 0x04, 0x41, 0x00, 0x41, 0x00, 0x28, 0x02, + 0xec, 0xab, 0x80, 0x80, 0x00, 0x36, 0x02, 0xa0, 0xa8, 0x80, 0x80, 0x00, + 0x41, 0x00, 0x20, 0x04, 0x36, 0x02, 0x90, 0xa8, 0x80, 0x80, 0x00, 0x41, + 0x00, 0x20, 0x03, 0x36, 0x02, 0x9c, 0xa8, 0x80, 0x80, 0x00, 0x20, 0x00, + 0x20, 0x05, 0x6a, 0x41, 0x38, 0x36, 0x02, 0x04, 0x0c, 0x02, 0x0b, 0x20, + 0x03, 0x20, 0x00, 0x4f, 0x0d, 0x00, 0x20, 0x03, 0x20, 0x05, 0x49, 0x0d, + 0x00, 0x20, 0x04, 0x28, 0x02, 0x0c, 0x41, 0x08, 0x71, 0x0d, 0x00, 0x20, + 0x03, 0x41, 0x78, 0x20, 0x03, 0x6b, 0x41, 0x0f, 0x71, 0x22, 0x05, 0x6a, + 0x22, 0x00, 0x41, 0x00, 0x28, 0x02, 0x90, 0xa8, 0x80, 0x80, 0x00, 0x20, + 0x06, 0x6a, 0x22, 0x02, 0x20, 0x05, 0x6b, 0x22, 0x05, 0x41, 0x01, 0x72, + 0x36, 0x02, 0x04, 0x20, 0x04, 0x20, 0x09, 0x20, 0x06, 0x6a, 0x36, 0x02, + 0x04, 0x41, 0x00, 0x41, 0x00, 0x28, 0x02, 0xec, 0xab, 0x80, 0x80, 0x00, + 0x36, 0x02, 0xa0, 0xa8, 0x80, 0x80, 0x00, 0x41, 0x00, 0x20, 0x05, 0x36, + 0x02, 0x90, 0xa8, 0x80, 0x80, 0x00, 0x41, 0x00, 0x20, 0x00, 0x36, 0x02, + 0x9c, 0xa8, 0x80, 0x80, 0x00, 0x20, 0x03, 0x20, 0x02, 0x6a, 0x41, 0x38, + 0x36, 0x02, 0x04, 0x0c, 0x01, 0x0b, 0x02, 0x40, 0x20, 0x00, 0x41, 0x00, + 0x28, 0x02, 0x94, 0xa8, 0x80, 0x80, 0x00, 0x22, 0x09, 0x4f, 0x0d, 0x00, + 0x41, 0x00, 0x20, 0x00, 0x36, 0x02, 0x94, 0xa8, 0x80, 0x80, 0x00, 0x20, + 0x00, 0x21, 0x09, 0x0b, 0x20, 0x00, 0x20, 0x06, 0x6a, 0x21, 0x05, 0x41, + 0xc4, 0xab, 0x80, 0x80, 0x00, 0x21, 0x04, 0x02, 0x40, 0x02, 0x40, 0x02, + 0x40, 0x02, 0x40, 0x03, 0x40, 0x20, 0x04, 0x28, 0x02, 0x00, 0x20, 0x05, + 0x46, 0x0d, 0x01, 0x20, 0x04, 0x28, 0x02, 0x08, 0x22, 0x04, 0x0d, 0x00, + 0x0c, 0x02, 0x0b, 0x0b, 0x20, 0x04, 0x2d, 0x00, 0x0c, 0x41, 0x08, 0x71, + 0x45, 0x0d, 0x01, 0x0b, 0x41, 0xc4, 0xab, 0x80, 0x80, 0x00, 0x21, 0x04, + 0x03, 0x40, 0x02, 0x40, 0x20, 0x04, 0x28, 0x02, 0x00, 0x22, 0x05, 0x20, + 0x03, 0x4b, 0x0d, 0x00, 0x20, 0x05, 0x20, 0x04, 0x28, 0x02, 0x04, 0x6a, + 0x22, 0x05, 0x20, 0x03, 0x4b, 0x0d, 0x03, 0x0b, 0x20, 0x04, 0x28, 0x02, + 0x08, 0x21, 0x04, 0x0c, 0x00, 0x0b, 0x0b, 0x20, 0x04, 0x20, 0x00, 0x36, + 0x02, 0x00, 0x20, 0x04, 0x20, 0x04, 0x28, 0x02, 0x04, 0x20, 0x06, 0x6a, + 0x36, 0x02, 0x04, 0x20, 0x00, 0x41, 0x78, 0x20, 0x00, 0x6b, 0x41, 0x0f, + 0x71, 0x6a, 0x22, 0x02, 0x20, 0x07, 0x41, 0x03, 0x72, 0x36, 0x02, 0x04, + 0x20, 0x05, 0x41, 0x78, 0x20, 0x05, 0x6b, 0x41, 0x0f, 0x71, 0x6a, 0x22, + 0x06, 0x20, 0x02, 0x20, 0x07, 0x6a, 0x22, 0x07, 0x6b, 0x21, 0x04, 0x02, + 0x40, 0x20, 0x06, 0x20, 0x03, 0x47, 0x0d, 0x00, 0x41, 0x00, 0x20, 0x07, + 0x36, 0x02, 0x9c, 0xa8, 0x80, 0x80, 0x00, 0x41, 0x00, 0x41, 0x00, 0x28, + 0x02, 0x90, 0xa8, 0x80, 0x80, 0x00, 0x20, 0x04, 0x6a, 0x22, 0x04, 0x36, + 0x02, 0x90, 0xa8, 0x80, 0x80, 0x00, 0x20, 0x07, 0x20, 0x04, 0x41, 0x01, + 0x72, 0x36, 0x02, 0x04, 0x0c, 0x08, 0x0b, 0x02, 0x40, 0x20, 0x06, 0x41, + 0x00, 0x28, 0x02, 0x98, 0xa8, 0x80, 0x80, 0x00, 0x47, 0x0d, 0x00, 0x41, + 0x00, 0x20, 0x07, 0x36, 0x02, 0x98, 0xa8, 0x80, 0x80, 0x00, 0x41, 0x00, + 0x41, 0x00, 0x28, 0x02, 0x8c, 0xa8, 0x80, 0x80, 0x00, 0x20, 0x04, 0x6a, + 0x22, 0x04, 0x36, 0x02, 0x8c, 0xa8, 0x80, 0x80, 0x00, 0x20, 0x07, 0x20, + 0x04, 0x41, 0x01, 0x72, 0x36, 0x02, 0x04, 0x20, 0x07, 0x20, 0x04, 0x6a, + 0x20, 0x04, 0x36, 0x02, 0x00, 0x0c, 0x08, 0x0b, 0x20, 0x06, 0x28, 0x02, + 0x04, 0x22, 0x03, 0x41, 0x03, 0x71, 0x41, 0x01, 0x47, 0x0d, 0x06, 0x20, + 0x03, 0x41, 0x78, 0x71, 0x21, 0x08, 0x02, 0x40, 0x20, 0x03, 0x41, 0xff, + 0x01, 0x4b, 0x0d, 0x00, 0x20, 0x06, 0x28, 0x02, 0x08, 0x22, 0x05, 0x20, + 0x03, 0x41, 0x03, 0x76, 0x22, 0x09, 0x41, 0x03, 0x74, 0x41, 0xac, 0xa8, + 0x80, 0x80, 0x00, 0x6a, 0x22, 0x00, 0x46, 0x1a, 0x02, 0x40, 0x20, 0x06, + 0x28, 0x02, 0x0c, 0x22, 0x03, 0x20, 0x05, 0x47, 0x0d, 0x00, 0x41, 0x00, + 0x41, 0x00, 0x28, 0x02, 0x84, 0xa8, 0x80, 0x80, 0x00, 0x41, 0x7e, 0x20, + 0x09, 0x77, 0x71, 0x36, 0x02, 0x84, 0xa8, 0x80, 0x80, 0x00, 0x0c, 0x07, + 0x0b, 0x20, 0x03, 0x20, 0x00, 0x46, 0x1a, 0x20, 0x03, 0x20, 0x05, 0x36, + 0x02, 0x08, 0x20, 0x05, 0x20, 0x03, 0x36, 0x02, 0x0c, 0x0c, 0x06, 0x0b, + 0x20, 0x06, 0x28, 0x02, 0x18, 0x21, 0x0b, 0x02, 0x40, 0x20, 0x06, 0x28, + 0x02, 0x0c, 0x22, 0x00, 0x20, 0x06, 0x46, 0x0d, 0x00, 0x20, 0x06, 0x28, + 0x02, 0x08, 0x22, 0x03, 0x20, 0x09, 0x49, 0x1a, 0x20, 0x00, 0x20, 0x03, + 0x36, 0x02, 0x08, 0x20, 0x03, 0x20, 0x00, 0x36, 0x02, 0x0c, 0x0c, 0x05, + 0x0b, 0x02, 0x40, 0x20, 0x06, 0x41, 0x14, 0x6a, 0x22, 0x05, 0x28, 0x02, + 0x00, 0x22, 0x03, 0x0d, 0x00, 0x20, 0x06, 0x28, 0x02, 0x10, 0x22, 0x03, + 0x45, 0x0d, 0x04, 0x20, 0x06, 0x41, 0x10, 0x6a, 0x21, 0x05, 0x0b, 0x03, + 0x40, 0x20, 0x05, 0x21, 0x09, 0x20, 0x03, 0x22, 0x00, 0x41, 0x14, 0x6a, + 0x22, 0x05, 0x28, 0x02, 0x00, 0x22, 0x03, 0x0d, 0x00, 0x20, 0x00, 0x41, + 0x10, 0x6a, 0x21, 0x05, 0x20, 0x00, 0x28, 0x02, 0x10, 0x22, 0x03, 0x0d, + 0x00, 0x0b, 0x20, 0x09, 0x41, 0x00, 0x36, 0x02, 0x00, 0x0c, 0x04, 0x0b, + 0x20, 0x00, 0x41, 0x78, 0x20, 0x00, 0x6b, 0x41, 0x0f, 0x71, 0x22, 0x04, + 0x6a, 0x22, 0x02, 0x20, 0x06, 0x41, 0x48, 0x6a, 0x22, 0x09, 0x20, 0x04, + 0x6b, 0x22, 0x04, 0x41, 0x01, 0x72, 0x36, 0x02, 0x04, 0x20, 0x00, 0x20, + 0x09, 0x6a, 0x41, 0x38, 0x36, 0x02, 0x04, 0x20, 0x03, 0x20, 0x05, 0x41, + 0x37, 0x20, 0x05, 0x6b, 0x41, 0x0f, 0x71, 0x6a, 0x41, 0x41, 0x6a, 0x22, + 0x09, 0x20, 0x09, 0x20, 0x03, 0x41, 0x10, 0x6a, 0x49, 0x1b, 0x22, 0x09, + 0x41, 0x23, 0x36, 0x02, 0x04, 0x41, 0x00, 0x41, 0x00, 0x28, 0x02, 0xec, + 0xab, 0x80, 0x80, 0x00, 0x36, 0x02, 0xa0, 0xa8, 0x80, 0x80, 0x00, 0x41, + 0x00, 0x20, 0x04, 0x36, 0x02, 0x90, 0xa8, 0x80, 0x80, 0x00, 0x41, 0x00, + 0x20, 0x02, 0x36, 0x02, 0x9c, 0xa8, 0x80, 0x80, 0x00, 0x20, 0x09, 0x41, + 0x10, 0x6a, 0x41, 0x00, 0x29, 0x02, 0xcc, 0xab, 0x80, 0x80, 0x00, 0x37, + 0x02, 0x00, 0x20, 0x09, 0x41, 0x00, 0x29, 0x02, 0xc4, 0xab, 0x80, 0x80, + 0x00, 0x37, 0x02, 0x08, 0x41, 0x00, 0x20, 0x09, 0x41, 0x08, 0x6a, 0x36, + 0x02, 0xcc, 0xab, 0x80, 0x80, 0x00, 0x41, 0x00, 0x20, 0x06, 0x36, 0x02, + 0xc8, 0xab, 0x80, 0x80, 0x00, 0x41, 0x00, 0x20, 0x00, 0x36, 0x02, 0xc4, + 0xab, 0x80, 0x80, 0x00, 0x41, 0x00, 0x41, 0x00, 0x36, 0x02, 0xd0, 0xab, + 0x80, 0x80, 0x00, 0x20, 0x09, 0x41, 0x24, 0x6a, 0x21, 0x04, 0x03, 0x40, + 0x20, 0x04, 0x41, 0x07, 0x36, 0x02, 0x00, 0x20, 0x04, 0x41, 0x04, 0x6a, + 0x22, 0x04, 0x20, 0x05, 0x49, 0x0d, 0x00, 0x0b, 0x20, 0x09, 0x20, 0x03, + 0x46, 0x0d, 0x00, 0x20, 0x09, 0x20, 0x09, 0x28, 0x02, 0x04, 0x41, 0x7e, + 0x71, 0x36, 0x02, 0x04, 0x20, 0x09, 0x20, 0x09, 0x20, 0x03, 0x6b, 0x22, + 0x00, 0x36, 0x02, 0x00, 0x20, 0x03, 0x20, 0x00, 0x41, 0x01, 0x72, 0x36, + 0x02, 0x04, 0x02, 0x40, 0x20, 0x00, 0x41, 0xff, 0x01, 0x4b, 0x0d, 0x00, + 0x20, 0x00, 0x41, 0x78, 0x71, 0x41, 0xac, 0xa8, 0x80, 0x80, 0x00, 0x6a, + 0x21, 0x04, 0x02, 0x40, 0x02, 0x40, 0x41, 0x00, 0x28, 0x02, 0x84, 0xa8, + 0x80, 0x80, 0x00, 0x22, 0x05, 0x41, 0x01, 0x20, 0x00, 0x41, 0x03, 0x76, + 0x74, 0x22, 0x00, 0x71, 0x0d, 0x00, 0x41, 0x00, 0x20, 0x05, 0x20, 0x00, + 0x72, 0x36, 0x02, 0x84, 0xa8, 0x80, 0x80, 0x00, 0x20, 0x04, 0x21, 0x05, + 0x0c, 0x01, 0x0b, 0x20, 0x04, 0x28, 0x02, 0x08, 0x21, 0x05, 0x0b, 0x20, + 0x05, 0x20, 0x03, 0x36, 0x02, 0x0c, 0x20, 0x04, 0x20, 0x03, 0x36, 0x02, + 0x08, 0x20, 0x03, 0x20, 0x04, 0x36, 0x02, 0x0c, 0x20, 0x03, 0x20, 0x05, + 0x36, 0x02, 0x08, 0x0c, 0x01, 0x0b, 0x41, 0x1f, 0x21, 0x04, 0x02, 0x40, + 0x20, 0x00, 0x41, 0xff, 0xff, 0xff, 0x07, 0x4b, 0x0d, 0x00, 0x20, 0x00, + 0x41, 0x26, 0x20, 0x00, 0x41, 0x08, 0x76, 0x67, 0x22, 0x04, 0x6b, 0x76, + 0x41, 0x01, 0x71, 0x20, 0x04, 0x41, 0x01, 0x74, 0x6b, 0x41, 0x3e, 0x6a, + 0x21, 0x04, 0x0b, 0x20, 0x03, 0x20, 0x04, 0x36, 0x02, 0x1c, 0x20, 0x03, + 0x42, 0x00, 0x37, 0x02, 0x10, 0x20, 0x04, 0x41, 0x02, 0x74, 0x41, 0xb4, + 0xaa, 0x80, 0x80, 0x00, 0x6a, 0x21, 0x05, 0x02, 0x40, 0x41, 0x00, 0x28, + 0x02, 0x88, 0xa8, 0x80, 0x80, 0x00, 0x22, 0x09, 0x41, 0x01, 0x20, 0x04, + 0x74, 0x22, 0x06, 0x71, 0x0d, 0x00, 0x20, 0x05, 0x20, 0x03, 0x36, 0x02, + 0x00, 0x41, 0x00, 0x20, 0x09, 0x20, 0x06, 0x72, 0x36, 0x02, 0x88, 0xa8, + 0x80, 0x80, 0x00, 0x20, 0x03, 0x20, 0x05, 0x36, 0x02, 0x18, 0x20, 0x03, + 0x20, 0x03, 0x36, 0x02, 0x08, 0x20, 0x03, 0x20, 0x03, 0x36, 0x02, 0x0c, + 0x0c, 0x01, 0x0b, 0x20, 0x00, 0x41, 0x00, 0x41, 0x19, 0x20, 0x04, 0x41, + 0x01, 0x76, 0x6b, 0x20, 0x04, 0x41, 0x1f, 0x46, 0x1b, 0x74, 0x21, 0x04, + 0x20, 0x05, 0x28, 0x02, 0x00, 0x21, 0x09, 0x02, 0x40, 0x03, 0x40, 0x20, + 0x09, 0x22, 0x05, 0x28, 0x02, 0x04, 0x41, 0x78, 0x71, 0x20, 0x00, 0x46, + 0x0d, 0x01, 0x20, 0x04, 0x41, 0x1d, 0x76, 0x21, 0x09, 0x20, 0x04, 0x41, + 0x01, 0x74, 0x21, 0x04, 0x20, 0x05, 0x20, 0x09, 0x41, 0x04, 0x71, 0x6a, + 0x41, 0x10, 0x6a, 0x22, 0x06, 0x28, 0x02, 0x00, 0x22, 0x09, 0x0d, 0x00, + 0x0b, 0x20, 0x06, 0x20, 0x03, 0x36, 0x02, 0x00, 0x20, 0x03, 0x20, 0x05, + 0x36, 0x02, 0x18, 0x20, 0x03, 0x20, 0x03, 0x36, 0x02, 0x0c, 0x20, 0x03, + 0x20, 0x03, 0x36, 0x02, 0x08, 0x0c, 0x01, 0x0b, 0x20, 0x05, 0x28, 0x02, + 0x08, 0x22, 0x04, 0x20, 0x03, 0x36, 0x02, 0x0c, 0x20, 0x05, 0x20, 0x03, + 0x36, 0x02, 0x08, 0x20, 0x03, 0x41, 0x00, 0x36, 0x02, 0x18, 0x20, 0x03, + 0x20, 0x05, 0x36, 0x02, 0x0c, 0x20, 0x03, 0x20, 0x04, 0x36, 0x02, 0x08, + 0x0b, 0x41, 0x00, 0x28, 0x02, 0x90, 0xa8, 0x80, 0x80, 0x00, 0x22, 0x04, + 0x20, 0x07, 0x4d, 0x0d, 0x00, 0x41, 0x00, 0x28, 0x02, 0x9c, 0xa8, 0x80, + 0x80, 0x00, 0x22, 0x03, 0x20, 0x07, 0x6a, 0x22, 0x05, 0x20, 0x04, 0x20, + 0x07, 0x6b, 0x22, 0x04, 0x41, 0x01, 0x72, 0x36, 0x02, 0x04, 0x41, 0x00, + 0x20, 0x04, 0x36, 0x02, 0x90, 0xa8, 0x80, 0x80, 0x00, 0x41, 0x00, 0x20, + 0x05, 0x36, 0x02, 0x9c, 0xa8, 0x80, 0x80, 0x00, 0x20, 0x03, 0x20, 0x07, + 0x41, 0x03, 0x72, 0x36, 0x02, 0x04, 0x20, 0x03, 0x41, 0x08, 0x6a, 0x21, + 0x04, 0x0c, 0x08, 0x0b, 0x41, 0x00, 0x21, 0x04, 0x41, 0x00, 0x41, 0x30, + 0x36, 0x02, 0x80, 0xa8, 0x80, 0x80, 0x00, 0x0c, 0x07, 0x0b, 0x41, 0x00, + 0x21, 0x00, 0x0b, 0x20, 0x0b, 0x45, 0x0d, 0x00, 0x02, 0x40, 0x02, 0x40, + 0x20, 0x06, 0x20, 0x06, 0x28, 0x02, 0x1c, 0x22, 0x05, 0x41, 0x02, 0x74, + 0x41, 0xb4, 0xaa, 0x80, 0x80, 0x00, 0x6a, 0x22, 0x03, 0x28, 0x02, 0x00, + 0x47, 0x0d, 0x00, 0x20, 0x03, 0x20, 0x00, 0x36, 0x02, 0x00, 0x20, 0x00, + 0x0d, 0x01, 0x41, 0x00, 0x41, 0x00, 0x28, 0x02, 0x88, 0xa8, 0x80, 0x80, + 0x00, 0x41, 0x7e, 0x20, 0x05, 0x77, 0x71, 0x36, 0x02, 0x88, 0xa8, 0x80, + 0x80, 0x00, 0x0c, 0x02, 0x0b, 0x20, 0x0b, 0x41, 0x10, 0x41, 0x14, 0x20, + 0x0b, 0x28, 0x02, 0x10, 0x20, 0x06, 0x46, 0x1b, 0x6a, 0x20, 0x00, 0x36, + 0x02, 0x00, 0x20, 0x00, 0x45, 0x0d, 0x01, 0x0b, 0x20, 0x00, 0x20, 0x0b, + 0x36, 0x02, 0x18, 0x02, 0x40, 0x20, 0x06, 0x28, 0x02, 0x10, 0x22, 0x03, + 0x45, 0x0d, 0x00, 0x20, 0x00, 0x20, 0x03, 0x36, 0x02, 0x10, 0x20, 0x03, + 0x20, 0x00, 0x36, 0x02, 0x18, 0x0b, 0x20, 0x06, 0x41, 0x14, 0x6a, 0x28, + 0x02, 0x00, 0x22, 0x03, 0x45, 0x0d, 0x00, 0x20, 0x00, 0x41, 0x14, 0x6a, + 0x20, 0x03, 0x36, 0x02, 0x00, 0x20, 0x03, 0x20, 0x00, 0x36, 0x02, 0x18, + 0x0b, 0x20, 0x08, 0x20, 0x04, 0x6a, 0x21, 0x04, 0x20, 0x06, 0x20, 0x08, + 0x6a, 0x22, 0x06, 0x28, 0x02, 0x04, 0x21, 0x03, 0x0b, 0x20, 0x06, 0x20, + 0x03, 0x41, 0x7e, 0x71, 0x36, 0x02, 0x04, 0x20, 0x07, 0x20, 0x04, 0x6a, + 0x20, 0x04, 0x36, 0x02, 0x00, 0x20, 0x07, 0x20, 0x04, 0x41, 0x01, 0x72, + 0x36, 0x02, 0x04, 0x02, 0x40, 0x20, 0x04, 0x41, 0xff, 0x01, 0x4b, 0x0d, + 0x00, 0x20, 0x04, 0x41, 0x78, 0x71, 0x41, 0xac, 0xa8, 0x80, 0x80, 0x00, + 0x6a, 0x21, 0x03, 0x02, 0x40, 0x02, 0x40, 0x41, 0x00, 0x28, 0x02, 0x84, + 0xa8, 0x80, 0x80, 0x00, 0x22, 0x05, 0x41, 0x01, 0x20, 0x04, 0x41, 0x03, + 0x76, 0x74, 0x22, 0x04, 0x71, 0x0d, 0x00, 0x41, 0x00, 0x20, 0x05, 0x20, + 0x04, 0x72, 0x36, 0x02, 0x84, 0xa8, 0x80, 0x80, 0x00, 0x20, 0x03, 0x21, + 0x04, 0x0c, 0x01, 0x0b, 0x20, 0x03, 0x28, 0x02, 0x08, 0x21, 0x04, 0x0b, + 0x20, 0x04, 0x20, 0x07, 0x36, 0x02, 0x0c, 0x20, 0x03, 0x20, 0x07, 0x36, + 0x02, 0x08, 0x20, 0x07, 0x20, 0x03, 0x36, 0x02, 0x0c, 0x20, 0x07, 0x20, + 0x04, 0x36, 0x02, 0x08, 0x0c, 0x01, 0x0b, 0x41, 0x1f, 0x21, 0x03, 0x02, + 0x40, 0x20, 0x04, 0x41, 0xff, 0xff, 0xff, 0x07, 0x4b, 0x0d, 0x00, 0x20, + 0x04, 0x41, 0x26, 0x20, 0x04, 0x41, 0x08, 0x76, 0x67, 0x22, 0x03, 0x6b, + 0x76, 0x41, 0x01, 0x71, 0x20, 0x03, 0x41, 0x01, 0x74, 0x6b, 0x41, 0x3e, + 0x6a, 0x21, 0x03, 0x0b, 0x20, 0x07, 0x20, 0x03, 0x36, 0x02, 0x1c, 0x20, + 0x07, 0x42, 0x00, 0x37, 0x02, 0x10, 0x20, 0x03, 0x41, 0x02, 0x74, 0x41, + 0xb4, 0xaa, 0x80, 0x80, 0x00, 0x6a, 0x21, 0x05, 0x02, 0x40, 0x41, 0x00, + 0x28, 0x02, 0x88, 0xa8, 0x80, 0x80, 0x00, 0x22, 0x00, 0x41, 0x01, 0x20, + 0x03, 0x74, 0x22, 0x09, 0x71, 0x0d, 0x00, 0x20, 0x05, 0x20, 0x07, 0x36, + 0x02, 0x00, 0x41, 0x00, 0x20, 0x00, 0x20, 0x09, 0x72, 0x36, 0x02, 0x88, + 0xa8, 0x80, 0x80, 0x00, 0x20, 0x07, 0x20, 0x05, 0x36, 0x02, 0x18, 0x20, + 0x07, 0x20, 0x07, 0x36, 0x02, 0x08, 0x20, 0x07, 0x20, 0x07, 0x36, 0x02, + 0x0c, 0x0c, 0x01, 0x0b, 0x20, 0x04, 0x41, 0x00, 0x41, 0x19, 0x20, 0x03, + 0x41, 0x01, 0x76, 0x6b, 0x20, 0x03, 0x41, 0x1f, 0x46, 0x1b, 0x74, 0x21, + 0x03, 0x20, 0x05, 0x28, 0x02, 0x00, 0x21, 0x00, 0x02, 0x40, 0x03, 0x40, + 0x20, 0x00, 0x22, 0x05, 0x28, 0x02, 0x04, 0x41, 0x78, 0x71, 0x20, 0x04, + 0x46, 0x0d, 0x01, 0x20, 0x03, 0x41, 0x1d, 0x76, 0x21, 0x00, 0x20, 0x03, + 0x41, 0x01, 0x74, 0x21, 0x03, 0x20, 0x05, 0x20, 0x00, 0x41, 0x04, 0x71, + 0x6a, 0x41, 0x10, 0x6a, 0x22, 0x09, 0x28, 0x02, 0x00, 0x22, 0x00, 0x0d, + 0x00, 0x0b, 0x20, 0x09, 0x20, 0x07, 0x36, 0x02, 0x00, 0x20, 0x07, 0x20, + 0x05, 0x36, 0x02, 0x18, 0x20, 0x07, 0x20, 0x07, 0x36, 0x02, 0x0c, 0x20, + 0x07, 0x20, 0x07, 0x36, 0x02, 0x08, 0x0c, 0x01, 0x0b, 0x20, 0x05, 0x28, + 0x02, 0x08, 0x22, 0x04, 0x20, 0x07, 0x36, 0x02, 0x0c, 0x20, 0x05, 0x20, + 0x07, 0x36, 0x02, 0x08, 0x20, 0x07, 0x41, 0x00, 0x36, 0x02, 0x18, 0x20, + 0x07, 0x20, 0x05, 0x36, 0x02, 0x0c, 0x20, 0x07, 0x20, 0x04, 0x36, 0x02, + 0x08, 0x0b, 0x20, 0x02, 0x41, 0x08, 0x6a, 0x21, 0x04, 0x0c, 0x02, 0x0b, + 0x02, 0x40, 0x20, 0x02, 0x45, 0x0d, 0x00, 0x02, 0x40, 0x02, 0x40, 0x20, + 0x09, 0x20, 0x09, 0x28, 0x02, 0x1c, 0x22, 0x05, 0x41, 0x02, 0x74, 0x41, + 0xb4, 0xaa, 0x80, 0x80, 0x00, 0x6a, 0x22, 0x04, 0x28, 0x02, 0x00, 0x47, + 0x0d, 0x00, 0x20, 0x04, 0x20, 0x00, 0x36, 0x02, 0x00, 0x20, 0x00, 0x0d, + 0x01, 0x41, 0x00, 0x20, 0x0b, 0x41, 0x7e, 0x20, 0x05, 0x77, 0x71, 0x22, + 0x0b, 0x36, 0x02, 0x88, 0xa8, 0x80, 0x80, 0x00, 0x0c, 0x02, 0x0b, 0x20, + 0x02, 0x41, 0x10, 0x41, 0x14, 0x20, 0x02, 0x28, 0x02, 0x10, 0x20, 0x09, + 0x46, 0x1b, 0x6a, 0x20, 0x00, 0x36, 0x02, 0x00, 0x20, 0x00, 0x45, 0x0d, + 0x01, 0x0b, 0x20, 0x00, 0x20, 0x02, 0x36, 0x02, 0x18, 0x02, 0x40, 0x20, + 0x09, 0x28, 0x02, 0x10, 0x22, 0x04, 0x45, 0x0d, 0x00, 0x20, 0x00, 0x20, + 0x04, 0x36, 0x02, 0x10, 0x20, 0x04, 0x20, 0x00, 0x36, 0x02, 0x18, 0x0b, + 0x20, 0x09, 0x41, 0x14, 0x6a, 0x28, 0x02, 0x00, 0x22, 0x04, 0x45, 0x0d, + 0x00, 0x20, 0x00, 0x41, 0x14, 0x6a, 0x20, 0x04, 0x36, 0x02, 0x00, 0x20, + 0x04, 0x20, 0x00, 0x36, 0x02, 0x18, 0x0b, 0x02, 0x40, 0x02, 0x40, 0x20, + 0x03, 0x41, 0x0f, 0x4b, 0x0d, 0x00, 0x20, 0x09, 0x20, 0x03, 0x20, 0x07, + 0x6a, 0x22, 0x04, 0x41, 0x03, 0x72, 0x36, 0x02, 0x04, 0x20, 0x09, 0x20, + 0x04, 0x6a, 0x22, 0x04, 0x20, 0x04, 0x28, 0x02, 0x04, 0x41, 0x01, 0x72, + 0x36, 0x02, 0x04, 0x0c, 0x01, 0x0b, 0x20, 0x09, 0x20, 0x07, 0x6a, 0x22, + 0x00, 0x20, 0x03, 0x41, 0x01, 0x72, 0x36, 0x02, 0x04, 0x20, 0x09, 0x20, + 0x07, 0x41, 0x03, 0x72, 0x36, 0x02, 0x04, 0x20, 0x00, 0x20, 0x03, 0x6a, + 0x20, 0x03, 0x36, 0x02, 0x00, 0x02, 0x40, 0x20, 0x03, 0x41, 0xff, 0x01, + 0x4b, 0x0d, 0x00, 0x20, 0x03, 0x41, 0x78, 0x71, 0x41, 0xac, 0xa8, 0x80, + 0x80, 0x00, 0x6a, 0x21, 0x04, 0x02, 0x40, 0x02, 0x40, 0x41, 0x00, 0x28, + 0x02, 0x84, 0xa8, 0x80, 0x80, 0x00, 0x22, 0x05, 0x41, 0x01, 0x20, 0x03, + 0x41, 0x03, 0x76, 0x74, 0x22, 0x03, 0x71, 0x0d, 0x00, 0x41, 0x00, 0x20, + 0x05, 0x20, 0x03, 0x72, 0x36, 0x02, 0x84, 0xa8, 0x80, 0x80, 0x00, 0x20, + 0x04, 0x21, 0x03, 0x0c, 0x01, 0x0b, 0x20, 0x04, 0x28, 0x02, 0x08, 0x21, + 0x03, 0x0b, 0x20, 0x03, 0x20, 0x00, 0x36, 0x02, 0x0c, 0x20, 0x04, 0x20, + 0x00, 0x36, 0x02, 0x08, 0x20, 0x00, 0x20, 0x04, 0x36, 0x02, 0x0c, 0x20, + 0x00, 0x20, 0x03, 0x36, 0x02, 0x08, 0x0c, 0x01, 0x0b, 0x41, 0x1f, 0x21, + 0x04, 0x02, 0x40, 0x20, 0x03, 0x41, 0xff, 0xff, 0xff, 0x07, 0x4b, 0x0d, + 0x00, 0x20, 0x03, 0x41, 0x26, 0x20, 0x03, 0x41, 0x08, 0x76, 0x67, 0x22, + 0x04, 0x6b, 0x76, 0x41, 0x01, 0x71, 0x20, 0x04, 0x41, 0x01, 0x74, 0x6b, + 0x41, 0x3e, 0x6a, 0x21, 0x04, 0x0b, 0x20, 0x00, 0x20, 0x04, 0x36, 0x02, + 0x1c, 0x20, 0x00, 0x42, 0x00, 0x37, 0x02, 0x10, 0x20, 0x04, 0x41, 0x02, + 0x74, 0x41, 0xb4, 0xaa, 0x80, 0x80, 0x00, 0x6a, 0x21, 0x05, 0x02, 0x40, + 0x20, 0x0b, 0x41, 0x01, 0x20, 0x04, 0x74, 0x22, 0x07, 0x71, 0x0d, 0x00, + 0x20, 0x05, 0x20, 0x00, 0x36, 0x02, 0x00, 0x41, 0x00, 0x20, 0x0b, 0x20, + 0x07, 0x72, 0x36, 0x02, 0x88, 0xa8, 0x80, 0x80, 0x00, 0x20, 0x00, 0x20, + 0x05, 0x36, 0x02, 0x18, 0x20, 0x00, 0x20, 0x00, 0x36, 0x02, 0x08, 0x20, + 0x00, 0x20, 0x00, 0x36, 0x02, 0x0c, 0x0c, 0x01, 0x0b, 0x20, 0x03, 0x41, + 0x00, 0x41, 0x19, 0x20, 0x04, 0x41, 0x01, 0x76, 0x6b, 0x20, 0x04, 0x41, + 0x1f, 0x46, 0x1b, 0x74, 0x21, 0x04, 0x20, 0x05, 0x28, 0x02, 0x00, 0x21, + 0x07, 0x02, 0x40, 0x03, 0x40, 0x20, 0x07, 0x22, 0x05, 0x28, 0x02, 0x04, + 0x41, 0x78, 0x71, 0x20, 0x03, 0x46, 0x0d, 0x01, 0x20, 0x04, 0x41, 0x1d, + 0x76, 0x21, 0x07, 0x20, 0x04, 0x41, 0x01, 0x74, 0x21, 0x04, 0x20, 0x05, + 0x20, 0x07, 0x41, 0x04, 0x71, 0x6a, 0x41, 0x10, 0x6a, 0x22, 0x06, 0x28, + 0x02, 0x00, 0x22, 0x07, 0x0d, 0x00, 0x0b, 0x20, 0x06, 0x20, 0x00, 0x36, + 0x02, 0x00, 0x20, 0x00, 0x20, 0x05, 0x36, 0x02, 0x18, 0x20, 0x00, 0x20, + 0x00, 0x36, 0x02, 0x0c, 0x20, 0x00, 0x20, 0x00, 0x36, 0x02, 0x08, 0x0c, + 0x01, 0x0b, 0x20, 0x05, 0x28, 0x02, 0x08, 0x22, 0x04, 0x20, 0x00, 0x36, + 0x02, 0x0c, 0x20, 0x05, 0x20, 0x00, 0x36, 0x02, 0x08, 0x20, 0x00, 0x41, + 0x00, 0x36, 0x02, 0x18, 0x20, 0x00, 0x20, 0x05, 0x36, 0x02, 0x0c, 0x20, + 0x00, 0x20, 0x04, 0x36, 0x02, 0x08, 0x0b, 0x20, 0x09, 0x41, 0x08, 0x6a, + 0x21, 0x04, 0x0c, 0x01, 0x0b, 0x02, 0x40, 0x20, 0x0b, 0x45, 0x0d, 0x00, + 0x02, 0x40, 0x02, 0x40, 0x20, 0x00, 0x20, 0x00, 0x28, 0x02, 0x1c, 0x22, + 0x05, 0x41, 0x02, 0x74, 0x41, 0xb4, 0xaa, 0x80, 0x80, 0x00, 0x6a, 0x22, + 0x04, 0x28, 0x02, 0x00, 0x47, 0x0d, 0x00, 0x20, 0x04, 0x20, 0x09, 0x36, + 0x02, 0x00, 0x20, 0x09, 0x0d, 0x01, 0x41, 0x00, 0x20, 0x0a, 0x41, 0x7e, + 0x20, 0x05, 0x77, 0x71, 0x36, 0x02, 0x88, 0xa8, 0x80, 0x80, 0x00, 0x0c, + 0x02, 0x0b, 0x20, 0x0b, 0x41, 0x10, 0x41, 0x14, 0x20, 0x0b, 0x28, 0x02, + 0x10, 0x20, 0x00, 0x46, 0x1b, 0x6a, 0x20, 0x09, 0x36, 0x02, 0x00, 0x20, + 0x09, 0x45, 0x0d, 0x01, 0x0b, 0x20, 0x09, 0x20, 0x0b, 0x36, 0x02, 0x18, + 0x02, 0x40, 0x20, 0x00, 0x28, 0x02, 0x10, 0x22, 0x04, 0x45, 0x0d, 0x00, + 0x20, 0x09, 0x20, 0x04, 0x36, 0x02, 0x10, 0x20, 0x04, 0x20, 0x09, 0x36, + 0x02, 0x18, 0x0b, 0x20, 0x00, 0x41, 0x14, 0x6a, 0x28, 0x02, 0x00, 0x22, + 0x04, 0x45, 0x0d, 0x00, 0x20, 0x09, 0x41, 0x14, 0x6a, 0x20, 0x04, 0x36, + 0x02, 0x00, 0x20, 0x04, 0x20, 0x09, 0x36, 0x02, 0x18, 0x0b, 0x02, 0x40, + 0x02, 0x40, 0x20, 0x03, 0x41, 0x0f, 0x4b, 0x0d, 0x00, 0x20, 0x00, 0x20, + 0x03, 0x20, 0x07, 0x6a, 0x22, 0x04, 0x41, 0x03, 0x72, 0x36, 0x02, 0x04, + 0x20, 0x00, 0x20, 0x04, 0x6a, 0x22, 0x04, 0x20, 0x04, 0x28, 0x02, 0x04, + 0x41, 0x01, 0x72, 0x36, 0x02, 0x04, 0x0c, 0x01, 0x0b, 0x20, 0x00, 0x20, + 0x07, 0x6a, 0x22, 0x05, 0x20, 0x03, 0x41, 0x01, 0x72, 0x36, 0x02, 0x04, + 0x20, 0x00, 0x20, 0x07, 0x41, 0x03, 0x72, 0x36, 0x02, 0x04, 0x20, 0x05, + 0x20, 0x03, 0x6a, 0x20, 0x03, 0x36, 0x02, 0x00, 0x02, 0x40, 0x20, 0x08, + 0x45, 0x0d, 0x00, 0x20, 0x08, 0x41, 0x78, 0x71, 0x41, 0xac, 0xa8, 0x80, + 0x80, 0x00, 0x6a, 0x21, 0x07, 0x41, 0x00, 0x28, 0x02, 0x98, 0xa8, 0x80, + 0x80, 0x00, 0x21, 0x04, 0x02, 0x40, 0x02, 0x40, 0x41, 0x01, 0x20, 0x08, + 0x41, 0x03, 0x76, 0x74, 0x22, 0x09, 0x20, 0x06, 0x71, 0x0d, 0x00, 0x41, + 0x00, 0x20, 0x09, 0x20, 0x06, 0x72, 0x36, 0x02, 0x84, 0xa8, 0x80, 0x80, + 0x00, 0x20, 0x07, 0x21, 0x09, 0x0c, 0x01, 0x0b, 0x20, 0x07, 0x28, 0x02, + 0x08, 0x21, 0x09, 0x0b, 0x20, 0x09, 0x20, 0x04, 0x36, 0x02, 0x0c, 0x20, + 0x07, 0x20, 0x04, 0x36, 0x02, 0x08, 0x20, 0x04, 0x20, 0x07, 0x36, 0x02, + 0x0c, 0x20, 0x04, 0x20, 0x09, 0x36, 0x02, 0x08, 0x0b, 0x41, 0x00, 0x20, + 0x05, 0x36, 0x02, 0x98, 0xa8, 0x80, 0x80, 0x00, 0x41, 0x00, 0x20, 0x03, + 0x36, 0x02, 0x8c, 0xa8, 0x80, 0x80, 0x00, 0x0b, 0x20, 0x00, 0x41, 0x08, + 0x6a, 0x21, 0x04, 0x0b, 0x20, 0x01, 0x41, 0x10, 0x6a, 0x24, 0x80, 0x80, + 0x80, 0x80, 0x00, 0x20, 0x04, 0x0b, 0x0a, 0x00, 0x20, 0x00, 0x10, 0x92, + 0x80, 0x80, 0x80, 0x00, 0x0b, 0xb0, 0x0d, 0x01, 0x07, 0x7f, 0x02, 0x40, + 0x20, 0x00, 0x45, 0x0d, 0x00, 0x20, 0x00, 0x41, 0x78, 0x6a, 0x22, 0x01, + 0x20, 0x00, 0x41, 0x7c, 0x6a, 0x28, 0x02, 0x00, 0x22, 0x02, 0x41, 0x78, + 0x71, 0x22, 0x00, 0x6a, 0x21, 0x03, 0x02, 0x40, 0x20, 0x02, 0x41, 0x01, + 0x71, 0x0d, 0x00, 0x20, 0x02, 0x41, 0x03, 0x71, 0x45, 0x0d, 0x01, 0x20, + 0x01, 0x20, 0x01, 0x28, 0x02, 0x00, 0x22, 0x02, 0x6b, 0x22, 0x01, 0x41, + 0x00, 0x28, 0x02, 0x94, 0xa8, 0x80, 0x80, 0x00, 0x22, 0x04, 0x49, 0x0d, + 0x01, 0x20, 0x02, 0x20, 0x00, 0x6a, 0x21, 0x00, 0x02, 0x40, 0x02, 0x40, + 0x02, 0x40, 0x20, 0x01, 0x41, 0x00, 0x28, 0x02, 0x98, 0xa8, 0x80, 0x80, + 0x00, 0x46, 0x0d, 0x00, 0x02, 0x40, 0x20, 0x02, 0x41, 0xff, 0x01, 0x4b, + 0x0d, 0x00, 0x20, 0x01, 0x28, 0x02, 0x08, 0x22, 0x04, 0x20, 0x02, 0x41, + 0x03, 0x76, 0x22, 0x05, 0x41, 0x03, 0x74, 0x41, 0xac, 0xa8, 0x80, 0x80, + 0x00, 0x6a, 0x22, 0x06, 0x46, 0x1a, 0x02, 0x40, 0x20, 0x01, 0x28, 0x02, + 0x0c, 0x22, 0x02, 0x20, 0x04, 0x47, 0x0d, 0x00, 0x41, 0x00, 0x41, 0x00, + 0x28, 0x02, 0x84, 0xa8, 0x80, 0x80, 0x00, 0x41, 0x7e, 0x20, 0x05, 0x77, + 0x71, 0x36, 0x02, 0x84, 0xa8, 0x80, 0x80, 0x00, 0x0c, 0x05, 0x0b, 0x20, + 0x02, 0x20, 0x06, 0x46, 0x1a, 0x20, 0x02, 0x20, 0x04, 0x36, 0x02, 0x08, + 0x20, 0x04, 0x20, 0x02, 0x36, 0x02, 0x0c, 0x0c, 0x04, 0x0b, 0x20, 0x01, + 0x28, 0x02, 0x18, 0x21, 0x07, 0x02, 0x40, 0x20, 0x01, 0x28, 0x02, 0x0c, + 0x22, 0x06, 0x20, 0x01, 0x46, 0x0d, 0x00, 0x20, 0x01, 0x28, 0x02, 0x08, + 0x22, 0x02, 0x20, 0x04, 0x49, 0x1a, 0x20, 0x06, 0x20, 0x02, 0x36, 0x02, + 0x08, 0x20, 0x02, 0x20, 0x06, 0x36, 0x02, 0x0c, 0x0c, 0x03, 0x0b, 0x02, + 0x40, 0x20, 0x01, 0x41, 0x14, 0x6a, 0x22, 0x04, 0x28, 0x02, 0x00, 0x22, + 0x02, 0x0d, 0x00, 0x20, 0x01, 0x28, 0x02, 0x10, 0x22, 0x02, 0x45, 0x0d, + 0x02, 0x20, 0x01, 0x41, 0x10, 0x6a, 0x21, 0x04, 0x0b, 0x03, 0x40, 0x20, + 0x04, 0x21, 0x05, 0x20, 0x02, 0x22, 0x06, 0x41, 0x14, 0x6a, 0x22, 0x04, + 0x28, 0x02, 0x00, 0x22, 0x02, 0x0d, 0x00, 0x20, 0x06, 0x41, 0x10, 0x6a, + 0x21, 0x04, 0x20, 0x06, 0x28, 0x02, 0x10, 0x22, 0x02, 0x0d, 0x00, 0x0b, + 0x20, 0x05, 0x41, 0x00, 0x36, 0x02, 0x00, 0x0c, 0x02, 0x0b, 0x20, 0x03, + 0x28, 0x02, 0x04, 0x22, 0x02, 0x41, 0x03, 0x71, 0x41, 0x03, 0x47, 0x0d, + 0x02, 0x20, 0x03, 0x20, 0x02, 0x41, 0x7e, 0x71, 0x36, 0x02, 0x04, 0x41, + 0x00, 0x20, 0x00, 0x36, 0x02, 0x8c, 0xa8, 0x80, 0x80, 0x00, 0x20, 0x03, + 0x20, 0x00, 0x36, 0x02, 0x00, 0x20, 0x01, 0x20, 0x00, 0x41, 0x01, 0x72, + 0x36, 0x02, 0x04, 0x0f, 0x0b, 0x41, 0x00, 0x21, 0x06, 0x0b, 0x20, 0x07, + 0x45, 0x0d, 0x00, 0x02, 0x40, 0x02, 0x40, 0x20, 0x01, 0x20, 0x01, 0x28, + 0x02, 0x1c, 0x22, 0x04, 0x41, 0x02, 0x74, 0x41, 0xb4, 0xaa, 0x80, 0x80, + 0x00, 0x6a, 0x22, 0x02, 0x28, 0x02, 0x00, 0x47, 0x0d, 0x00, 0x20, 0x02, + 0x20, 0x06, 0x36, 0x02, 0x00, 0x20, 0x06, 0x0d, 0x01, 0x41, 0x00, 0x41, + 0x00, 0x28, 0x02, 0x88, 0xa8, 0x80, 0x80, 0x00, 0x41, 0x7e, 0x20, 0x04, + 0x77, 0x71, 0x36, 0x02, 0x88, 0xa8, 0x80, 0x80, 0x00, 0x0c, 0x02, 0x0b, + 0x20, 0x07, 0x41, 0x10, 0x41, 0x14, 0x20, 0x07, 0x28, 0x02, 0x10, 0x20, + 0x01, 0x46, 0x1b, 0x6a, 0x20, 0x06, 0x36, 0x02, 0x00, 0x20, 0x06, 0x45, + 0x0d, 0x01, 0x0b, 0x20, 0x06, 0x20, 0x07, 0x36, 0x02, 0x18, 0x02, 0x40, + 0x20, 0x01, 0x28, 0x02, 0x10, 0x22, 0x02, 0x45, 0x0d, 0x00, 0x20, 0x06, + 0x20, 0x02, 0x36, 0x02, 0x10, 0x20, 0x02, 0x20, 0x06, 0x36, 0x02, 0x18, + 0x0b, 0x20, 0x01, 0x41, 0x14, 0x6a, 0x28, 0x02, 0x00, 0x22, 0x02, 0x45, + 0x0d, 0x00, 0x20, 0x06, 0x41, 0x14, 0x6a, 0x20, 0x02, 0x36, 0x02, 0x00, + 0x20, 0x02, 0x20, 0x06, 0x36, 0x02, 0x18, 0x0b, 0x20, 0x01, 0x20, 0x03, + 0x4f, 0x0d, 0x00, 0x20, 0x03, 0x28, 0x02, 0x04, 0x22, 0x02, 0x41, 0x01, + 0x71, 0x45, 0x0d, 0x00, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, + 0x02, 0x40, 0x20, 0x02, 0x41, 0x02, 0x71, 0x0d, 0x00, 0x02, 0x40, 0x20, + 0x03, 0x41, 0x00, 0x28, 0x02, 0x9c, 0xa8, 0x80, 0x80, 0x00, 0x47, 0x0d, + 0x00, 0x41, 0x00, 0x20, 0x01, 0x36, 0x02, 0x9c, 0xa8, 0x80, 0x80, 0x00, + 0x41, 0x00, 0x41, 0x00, 0x28, 0x02, 0x90, 0xa8, 0x80, 0x80, 0x00, 0x20, + 0x00, 0x6a, 0x22, 0x00, 0x36, 0x02, 0x90, 0xa8, 0x80, 0x80, 0x00, 0x20, + 0x01, 0x20, 0x00, 0x41, 0x01, 0x72, 0x36, 0x02, 0x04, 0x20, 0x01, 0x41, + 0x00, 0x28, 0x02, 0x98, 0xa8, 0x80, 0x80, 0x00, 0x47, 0x0d, 0x06, 0x41, + 0x00, 0x41, 0x00, 0x36, 0x02, 0x8c, 0xa8, 0x80, 0x80, 0x00, 0x41, 0x00, + 0x41, 0x00, 0x36, 0x02, 0x98, 0xa8, 0x80, 0x80, 0x00, 0x0f, 0x0b, 0x02, + 0x40, 0x20, 0x03, 0x41, 0x00, 0x28, 0x02, 0x98, 0xa8, 0x80, 0x80, 0x00, + 0x47, 0x0d, 0x00, 0x41, 0x00, 0x20, 0x01, 0x36, 0x02, 0x98, 0xa8, 0x80, + 0x80, 0x00, 0x41, 0x00, 0x41, 0x00, 0x28, 0x02, 0x8c, 0xa8, 0x80, 0x80, + 0x00, 0x20, 0x00, 0x6a, 0x22, 0x00, 0x36, 0x02, 0x8c, 0xa8, 0x80, 0x80, + 0x00, 0x20, 0x01, 0x20, 0x00, 0x41, 0x01, 0x72, 0x36, 0x02, 0x04, 0x20, + 0x01, 0x20, 0x00, 0x6a, 0x20, 0x00, 0x36, 0x02, 0x00, 0x0f, 0x0b, 0x20, + 0x02, 0x41, 0x78, 0x71, 0x20, 0x00, 0x6a, 0x21, 0x00, 0x02, 0x40, 0x20, + 0x02, 0x41, 0xff, 0x01, 0x4b, 0x0d, 0x00, 0x20, 0x03, 0x28, 0x02, 0x08, + 0x22, 0x04, 0x20, 0x02, 0x41, 0x03, 0x76, 0x22, 0x05, 0x41, 0x03, 0x74, + 0x41, 0xac, 0xa8, 0x80, 0x80, 0x00, 0x6a, 0x22, 0x06, 0x46, 0x1a, 0x02, + 0x40, 0x20, 0x03, 0x28, 0x02, 0x0c, 0x22, 0x02, 0x20, 0x04, 0x47, 0x0d, + 0x00, 0x41, 0x00, 0x41, 0x00, 0x28, 0x02, 0x84, 0xa8, 0x80, 0x80, 0x00, + 0x41, 0x7e, 0x20, 0x05, 0x77, 0x71, 0x36, 0x02, 0x84, 0xa8, 0x80, 0x80, + 0x00, 0x0c, 0x05, 0x0b, 0x20, 0x02, 0x20, 0x06, 0x46, 0x1a, 0x20, 0x02, + 0x20, 0x04, 0x36, 0x02, 0x08, 0x20, 0x04, 0x20, 0x02, 0x36, 0x02, 0x0c, + 0x0c, 0x04, 0x0b, 0x20, 0x03, 0x28, 0x02, 0x18, 0x21, 0x07, 0x02, 0x40, + 0x20, 0x03, 0x28, 0x02, 0x0c, 0x22, 0x06, 0x20, 0x03, 0x46, 0x0d, 0x00, + 0x20, 0x03, 0x28, 0x02, 0x08, 0x22, 0x02, 0x41, 0x00, 0x28, 0x02, 0x94, + 0xa8, 0x80, 0x80, 0x00, 0x49, 0x1a, 0x20, 0x06, 0x20, 0x02, 0x36, 0x02, + 0x08, 0x20, 0x02, 0x20, 0x06, 0x36, 0x02, 0x0c, 0x0c, 0x03, 0x0b, 0x02, + 0x40, 0x20, 0x03, 0x41, 0x14, 0x6a, 0x22, 0x04, 0x28, 0x02, 0x00, 0x22, + 0x02, 0x0d, 0x00, 0x20, 0x03, 0x28, 0x02, 0x10, 0x22, 0x02, 0x45, 0x0d, + 0x02, 0x20, 0x03, 0x41, 0x10, 0x6a, 0x21, 0x04, 0x0b, 0x03, 0x40, 0x20, + 0x04, 0x21, 0x05, 0x20, 0x02, 0x22, 0x06, 0x41, 0x14, 0x6a, 0x22, 0x04, + 0x28, 0x02, 0x00, 0x22, 0x02, 0x0d, 0x00, 0x20, 0x06, 0x41, 0x10, 0x6a, + 0x21, 0x04, 0x20, 0x06, 0x28, 0x02, 0x10, 0x22, 0x02, 0x0d, 0x00, 0x0b, + 0x20, 0x05, 0x41, 0x00, 0x36, 0x02, 0x00, 0x0c, 0x02, 0x0b, 0x20, 0x03, + 0x20, 0x02, 0x41, 0x7e, 0x71, 0x36, 0x02, 0x04, 0x20, 0x01, 0x20, 0x00, + 0x6a, 0x20, 0x00, 0x36, 0x02, 0x00, 0x20, 0x01, 0x20, 0x00, 0x41, 0x01, + 0x72, 0x36, 0x02, 0x04, 0x0c, 0x03, 0x0b, 0x41, 0x00, 0x21, 0x06, 0x0b, + 0x20, 0x07, 0x45, 0x0d, 0x00, 0x02, 0x40, 0x02, 0x40, 0x20, 0x03, 0x20, + 0x03, 0x28, 0x02, 0x1c, 0x22, 0x04, 0x41, 0x02, 0x74, 0x41, 0xb4, 0xaa, + 0x80, 0x80, 0x00, 0x6a, 0x22, 0x02, 0x28, 0x02, 0x00, 0x47, 0x0d, 0x00, + 0x20, 0x02, 0x20, 0x06, 0x36, 0x02, 0x00, 0x20, 0x06, 0x0d, 0x01, 0x41, + 0x00, 0x41, 0x00, 0x28, 0x02, 0x88, 0xa8, 0x80, 0x80, 0x00, 0x41, 0x7e, + 0x20, 0x04, 0x77, 0x71, 0x36, 0x02, 0x88, 0xa8, 0x80, 0x80, 0x00, 0x0c, + 0x02, 0x0b, 0x20, 0x07, 0x41, 0x10, 0x41, 0x14, 0x20, 0x07, 0x28, 0x02, + 0x10, 0x20, 0x03, 0x46, 0x1b, 0x6a, 0x20, 0x06, 0x36, 0x02, 0x00, 0x20, + 0x06, 0x45, 0x0d, 0x01, 0x0b, 0x20, 0x06, 0x20, 0x07, 0x36, 0x02, 0x18, + 0x02, 0x40, 0x20, 0x03, 0x28, 0x02, 0x10, 0x22, 0x02, 0x45, 0x0d, 0x00, + 0x20, 0x06, 0x20, 0x02, 0x36, 0x02, 0x10, 0x20, 0x02, 0x20, 0x06, 0x36, + 0x02, 0x18, 0x0b, 0x20, 0x03, 0x41, 0x14, 0x6a, 0x28, 0x02, 0x00, 0x22, + 0x02, 0x45, 0x0d, 0x00, 0x20, 0x06, 0x41, 0x14, 0x6a, 0x20, 0x02, 0x36, + 0x02, 0x00, 0x20, 0x02, 0x20, 0x06, 0x36, 0x02, 0x18, 0x0b, 0x20, 0x01, + 0x20, 0x00, 0x6a, 0x20, 0x00, 0x36, 0x02, 0x00, 0x20, 0x01, 0x20, 0x00, + 0x41, 0x01, 0x72, 0x36, 0x02, 0x04, 0x20, 0x01, 0x41, 0x00, 0x28, 0x02, + 0x98, 0xa8, 0x80, 0x80, 0x00, 0x47, 0x0d, 0x00, 0x41, 0x00, 0x20, 0x00, + 0x36, 0x02, 0x8c, 0xa8, 0x80, 0x80, 0x00, 0x0f, 0x0b, 0x02, 0x40, 0x20, + 0x00, 0x41, 0xff, 0x01, 0x4b, 0x0d, 0x00, 0x20, 0x00, 0x41, 0x78, 0x71, + 0x41, 0xac, 0xa8, 0x80, 0x80, 0x00, 0x6a, 0x21, 0x02, 0x02, 0x40, 0x02, + 0x40, 0x41, 0x00, 0x28, 0x02, 0x84, 0xa8, 0x80, 0x80, 0x00, 0x22, 0x04, + 0x41, 0x01, 0x20, 0x00, 0x41, 0x03, 0x76, 0x74, 0x22, 0x00, 0x71, 0x0d, + 0x00, 0x41, 0x00, 0x20, 0x04, 0x20, 0x00, 0x72, 0x36, 0x02, 0x84, 0xa8, + 0x80, 0x80, 0x00, 0x20, 0x02, 0x21, 0x00, 0x0c, 0x01, 0x0b, 0x20, 0x02, + 0x28, 0x02, 0x08, 0x21, 0x00, 0x0b, 0x20, 0x00, 0x20, 0x01, 0x36, 0x02, + 0x0c, 0x20, 0x02, 0x20, 0x01, 0x36, 0x02, 0x08, 0x20, 0x01, 0x20, 0x02, + 0x36, 0x02, 0x0c, 0x20, 0x01, 0x20, 0x00, 0x36, 0x02, 0x08, 0x0f, 0x0b, + 0x41, 0x1f, 0x21, 0x02, 0x02, 0x40, 0x20, 0x00, 0x41, 0xff, 0xff, 0xff, + 0x07, 0x4b, 0x0d, 0x00, 0x20, 0x00, 0x41, 0x26, 0x20, 0x00, 0x41, 0x08, + 0x76, 0x67, 0x22, 0x02, 0x6b, 0x76, 0x41, 0x01, 0x71, 0x20, 0x02, 0x41, + 0x01, 0x74, 0x6b, 0x41, 0x3e, 0x6a, 0x21, 0x02, 0x0b, 0x20, 0x01, 0x20, + 0x02, 0x36, 0x02, 0x1c, 0x20, 0x01, 0x42, 0x00, 0x37, 0x02, 0x10, 0x20, + 0x02, 0x41, 0x02, 0x74, 0x41, 0xb4, 0xaa, 0x80, 0x80, 0x00, 0x6a, 0x21, + 0x04, 0x02, 0x40, 0x02, 0x40, 0x41, 0x00, 0x28, 0x02, 0x88, 0xa8, 0x80, + 0x80, 0x00, 0x22, 0x06, 0x41, 0x01, 0x20, 0x02, 0x74, 0x22, 0x03, 0x71, + 0x0d, 0x00, 0x20, 0x04, 0x20, 0x01, 0x36, 0x02, 0x00, 0x41, 0x00, 0x20, + 0x06, 0x20, 0x03, 0x72, 0x36, 0x02, 0x88, 0xa8, 0x80, 0x80, 0x00, 0x20, + 0x01, 0x20, 0x04, 0x36, 0x02, 0x18, 0x20, 0x01, 0x20, 0x01, 0x36, 0x02, + 0x08, 0x20, 0x01, 0x20, 0x01, 0x36, 0x02, 0x0c, 0x0c, 0x01, 0x0b, 0x20, + 0x00, 0x41, 0x00, 0x41, 0x19, 0x20, 0x02, 0x41, 0x01, 0x76, 0x6b, 0x20, + 0x02, 0x41, 0x1f, 0x46, 0x1b, 0x74, 0x21, 0x02, 0x20, 0x04, 0x28, 0x02, + 0x00, 0x21, 0x06, 0x02, 0x40, 0x03, 0x40, 0x20, 0x06, 0x22, 0x04, 0x28, + 0x02, 0x04, 0x41, 0x78, 0x71, 0x20, 0x00, 0x46, 0x0d, 0x01, 0x20, 0x02, + 0x41, 0x1d, 0x76, 0x21, 0x06, 0x20, 0x02, 0x41, 0x01, 0x74, 0x21, 0x02, + 0x20, 0x04, 0x20, 0x06, 0x41, 0x04, 0x71, 0x6a, 0x41, 0x10, 0x6a, 0x22, + 0x03, 0x28, 0x02, 0x00, 0x22, 0x06, 0x0d, 0x00, 0x0b, 0x20, 0x03, 0x20, + 0x01, 0x36, 0x02, 0x00, 0x20, 0x01, 0x20, 0x04, 0x36, 0x02, 0x18, 0x20, + 0x01, 0x20, 0x01, 0x36, 0x02, 0x0c, 0x20, 0x01, 0x20, 0x01, 0x36, 0x02, + 0x08, 0x0c, 0x01, 0x0b, 0x20, 0x04, 0x28, 0x02, 0x08, 0x22, 0x00, 0x20, + 0x01, 0x36, 0x02, 0x0c, 0x20, 0x04, 0x20, 0x01, 0x36, 0x02, 0x08, 0x20, + 0x01, 0x41, 0x00, 0x36, 0x02, 0x18, 0x20, 0x01, 0x20, 0x04, 0x36, 0x02, + 0x0c, 0x20, 0x01, 0x20, 0x00, 0x36, 0x02, 0x08, 0x0b, 0x41, 0x00, 0x41, + 0x00, 0x28, 0x02, 0xa4, 0xa8, 0x80, 0x80, 0x00, 0x41, 0x7f, 0x6a, 0x22, + 0x01, 0x41, 0x7f, 0x20, 0x01, 0x1b, 0x36, 0x02, 0xa4, 0xa8, 0x80, 0x80, + 0x00, 0x0b, 0x0b, 0x6b, 0x02, 0x01, 0x7f, 0x01, 0x7e, 0x02, 0x40, 0x02, + 0x40, 0x20, 0x00, 0x0d, 0x00, 0x41, 0x00, 0x21, 0x02, 0x0c, 0x01, 0x0b, + 0x20, 0x00, 0xad, 0x20, 0x01, 0xad, 0x7e, 0x22, 0x03, 0xa7, 0x21, 0x02, + 0x20, 0x01, 0x20, 0x00, 0x72, 0x41, 0x80, 0x80, 0x04, 0x49, 0x0d, 0x00, + 0x41, 0x7f, 0x20, 0x02, 0x20, 0x03, 0x42, 0x20, 0x88, 0xa7, 0x41, 0x00, + 0x47, 0x1b, 0x21, 0x02, 0x0b, 0x02, 0x40, 0x20, 0x02, 0x10, 0x90, 0x80, + 0x80, 0x80, 0x00, 0x22, 0x00, 0x45, 0x0d, 0x00, 0x20, 0x00, 0x41, 0x7c, + 0x6a, 0x2d, 0x00, 0x00, 0x41, 0x03, 0x71, 0x45, 0x0d, 0x00, 0x20, 0x00, + 0x41, 0x00, 0x20, 0x02, 0x10, 0xc0, 0x80, 0x80, 0x80, 0x00, 0x1a, 0x0b, + 0x20, 0x00, 0x0b, 0x0b, 0x00, 0x20, 0x00, 0x10, 0x9e, 0x80, 0x80, 0x80, + 0x00, 0x00, 0x0b, 0xd5, 0x01, 0x01, 0x03, 0x7f, 0x23, 0x80, 0x80, 0x80, + 0x80, 0x00, 0x41, 0x10, 0x6b, 0x22, 0x00, 0x24, 0x80, 0x80, 0x80, 0x80, + 0x00, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, 0x20, + 0x00, 0x41, 0x08, 0x6a, 0x20, 0x00, 0x41, 0x0c, 0x6a, 0x10, 0x99, 0x80, + 0x80, 0x80, 0x00, 0x0d, 0x00, 0x20, 0x00, 0x28, 0x02, 0x08, 0x41, 0x01, + 0x6a, 0x22, 0x01, 0x45, 0x0d, 0x01, 0x20, 0x00, 0x28, 0x02, 0x0c, 0x10, + 0x8f, 0x80, 0x80, 0x80, 0x00, 0x22, 0x02, 0x45, 0x0d, 0x02, 0x20, 0x01, + 0x41, 0x04, 0x10, 0x93, 0x80, 0x80, 0x80, 0x00, 0x22, 0x01, 0x45, 0x0d, + 0x03, 0x20, 0x01, 0x20, 0x02, 0x10, 0x98, 0x80, 0x80, 0x80, 0x00, 0x0d, + 0x04, 0x20, 0x00, 0x28, 0x02, 0x08, 0x20, 0x01, 0x10, 0x8e, 0x80, 0x80, + 0x80, 0x00, 0x21, 0x01, 0x20, 0x00, 0x41, 0x10, 0x6a, 0x24, 0x80, 0x80, + 0x80, 0x80, 0x00, 0x20, 0x01, 0x0f, 0x0b, 0x41, 0xc7, 0x00, 0x10, 0x94, + 0x80, 0x80, 0x80, 0x00, 0x00, 0x0b, 0x41, 0xc6, 0x00, 0x10, 0x94, 0x80, + 0x80, 0x80, 0x00, 0x00, 0x0b, 0x41, 0xc6, 0x00, 0x10, 0x94, 0x80, 0x80, + 0x80, 0x00, 0x00, 0x0b, 0x20, 0x02, 0x10, 0x91, 0x80, 0x80, 0x80, 0x00, + 0x41, 0xc6, 0x00, 0x10, 0x94, 0x80, 0x80, 0x80, 0x00, 0x00, 0x0b, 0x20, + 0x02, 0x10, 0x91, 0x80, 0x80, 0x80, 0x00, 0x20, 0x01, 0x10, 0x91, 0x80, + 0x80, 0x80, 0x00, 0x41, 0xc7, 0x00, 0x10, 0x94, 0x80, 0x80, 0x80, 0x00, + 0x00, 0x0b, 0x02, 0x00, 0x0b, 0x27, 0x00, 0x10, 0x96, 0x80, 0x80, 0x80, + 0x00, 0x02, 0x40, 0x20, 0x00, 0x10, 0x9a, 0x80, 0x80, 0x80, 0x00, 0x22, + 0x00, 0x0d, 0x00, 0x41, 0x00, 0x0f, 0x0b, 0x41, 0x00, 0x20, 0x00, 0x36, + 0x02, 0x80, 0xa8, 0x80, 0x80, 0x00, 0x41, 0x7f, 0x0b, 0x11, 0x00, 0x20, + 0x00, 0x20, 0x01, 0x10, 0x80, 0x80, 0x80, 0x80, 0x00, 0x41, 0xff, 0xff, + 0x03, 0x71, 0x0b, 0x11, 0x00, 0x20, 0x00, 0x20, 0x01, 0x10, 0x81, 0x80, + 0x80, 0x80, 0x00, 0x41, 0xff, 0xff, 0x03, 0x71, 0x0b, 0x0f, 0x00, 0x20, + 0x00, 0x10, 0x82, 0x80, 0x80, 0x80, 0x00, 0x41, 0xff, 0xff, 0x03, 0x71, + 0x0b, 0x11, 0x00, 0x20, 0x00, 0x20, 0x01, 0x10, 0x83, 0x80, 0x80, 0x80, + 0x00, 0x41, 0xff, 0xff, 0x03, 0x71, 0x0b, 0x15, 0x00, 0x20, 0x00, 0x20, + 0x01, 0x20, 0x02, 0x20, 0x03, 0x10, 0x84, 0x80, 0x80, 0x80, 0x00, 0x41, + 0xff, 0xff, 0x03, 0x71, 0x0b, 0x15, 0x00, 0x20, 0x00, 0x20, 0x01, 0x20, + 0x02, 0x20, 0x03, 0x10, 0x85, 0x80, 0x80, 0x80, 0x00, 0x41, 0xff, 0xff, + 0x03, 0x71, 0x0b, 0x0b, 0x00, 0x20, 0x00, 0x10, 0x86, 0x80, 0x80, 0x80, + 0x00, 0x00, 0x0b, 0x19, 0x00, 0x20, 0x00, 0x20, 0x01, 0x20, 0x02, 0x20, + 0x03, 0x20, 0x04, 0x20, 0x05, 0x10, 0x87, 0x80, 0x80, 0x80, 0x00, 0x41, + 0xff, 0xff, 0x03, 0x71, 0x0b, 0x04, 0x00, 0x00, 0x00, 0x0b, 0x4e, 0x00, + 0x02, 0x40, 0x20, 0x00, 0x0d, 0x00, 0x3f, 0x00, 0x41, 0x10, 0x74, 0x0f, + 0x0b, 0x02, 0x40, 0x20, 0x00, 0x41, 0xff, 0xff, 0x03, 0x71, 0x0d, 0x00, + 0x20, 0x00, 0x41, 0x7f, 0x4c, 0x0d, 0x00, 0x02, 0x40, 0x20, 0x00, 0x41, + 0x10, 0x76, 0x40, 0x00, 0x22, 0x00, 0x41, 0x7f, 0x47, 0x0d, 0x00, 0x41, + 0x00, 0x41, 0x30, 0x36, 0x02, 0x80, 0xa8, 0x80, 0x80, 0x00, 0x41, 0x7f, + 0x0f, 0x0b, 0x20, 0x00, 0x41, 0x10, 0x74, 0x0f, 0x0b, 0x10, 0xa0, 0x80, + 0x80, 0x80, 0x00, 0x00, 0x0b, 0x02, 0x00, 0x0b, 0x0e, 0x00, 0x10, 0xa2, + 0x80, 0x80, 0x80, 0x00, 0x10, 0xaf, 0x80, 0x80, 0x80, 0x00, 0x0b, 0x23, + 0x00, 0x20, 0x00, 0x41, 0x18, 0x74, 0x20, 0x00, 0x41, 0x80, 0xfe, 0x03, + 0x71, 0x41, 0x08, 0x74, 0x72, 0x20, 0x00, 0x41, 0x08, 0x76, 0x41, 0x80, + 0xfe, 0x03, 0x71, 0x20, 0x00, 0x41, 0x18, 0x76, 0x72, 0x72, 0x0b, 0x12, + 0x00, 0x20, 0x00, 0x41, 0x08, 0x74, 0x20, 0x00, 0x41, 0x08, 0x76, 0x72, + 0x41, 0xff, 0xff, 0x03, 0x71, 0x0b, 0x3b, 0x01, 0x01, 0x7f, 0x23, 0x80, + 0x80, 0x80, 0x80, 0x00, 0x41, 0x10, 0x6b, 0x22, 0x02, 0x24, 0x80, 0x80, + 0x80, 0x80, 0x00, 0x20, 0x02, 0x20, 0x01, 0x36, 0x02, 0x0c, 0x41, 0x80, + 0x9e, 0x80, 0x80, 0x00, 0x20, 0x00, 0x20, 0x01, 0x10, 0xba, 0x80, 0x80, + 0x80, 0x00, 0x21, 0x01, 0x20, 0x02, 0x41, 0x10, 0x6a, 0x24, 0x80, 0x80, + 0x80, 0x80, 0x00, 0x20, 0x01, 0x0b, 0x0d, 0x00, 0x20, 0x00, 0x28, 0x02, + 0x38, 0x10, 0x97, 0x80, 0x80, 0x80, 0x00, 0x0b, 0x71, 0x01, 0x02, 0x7f, + 0x23, 0x80, 0x80, 0x80, 0x80, 0x00, 0x41, 0x10, 0x6b, 0x22, 0x03, 0x24, + 0x80, 0x80, 0x80, 0x80, 0x00, 0x41, 0x7f, 0x21, 0x04, 0x02, 0x40, 0x02, + 0x40, 0x20, 0x02, 0x41, 0x7f, 0x4a, 0x0d, 0x00, 0x41, 0x00, 0x41, 0x1c, + 0x36, 0x02, 0x80, 0xa8, 0x80, 0x80, 0x00, 0x0c, 0x01, 0x0b, 0x02, 0x40, + 0x20, 0x00, 0x20, 0x01, 0x20, 0x02, 0x20, 0x03, 0x41, 0x0c, 0x6a, 0x10, + 0x9d, 0x80, 0x80, 0x80, 0x00, 0x22, 0x02, 0x45, 0x0d, 0x00, 0x41, 0x00, + 0x20, 0x02, 0x36, 0x02, 0x80, 0xa8, 0x80, 0x80, 0x00, 0x41, 0x7f, 0x21, + 0x04, 0x0c, 0x01, 0x0b, 0x20, 0x03, 0x28, 0x02, 0x0c, 0x21, 0x04, 0x0b, + 0x20, 0x03, 0x41, 0x10, 0x6a, 0x24, 0x80, 0x80, 0x80, 0x80, 0x00, 0x20, + 0x04, 0x0b, 0xbb, 0x02, 0x01, 0x07, 0x7f, 0x23, 0x80, 0x80, 0x80, 0x80, + 0x00, 0x41, 0x10, 0x6b, 0x22, 0x03, 0x24, 0x80, 0x80, 0x80, 0x80, 0x00, + 0x20, 0x03, 0x20, 0x02, 0x36, 0x02, 0x0c, 0x20, 0x03, 0x20, 0x01, 0x36, + 0x02, 0x08, 0x20, 0x03, 0x20, 0x00, 0x28, 0x02, 0x18, 0x22, 0x01, 0x36, + 0x02, 0x00, 0x20, 0x03, 0x20, 0x00, 0x28, 0x02, 0x14, 0x20, 0x01, 0x6b, + 0x22, 0x04, 0x36, 0x02, 0x04, 0x41, 0x02, 0x21, 0x05, 0x02, 0x40, 0x02, + 0x40, 0x20, 0x00, 0x28, 0x02, 0x38, 0x20, 0x03, 0x41, 0x02, 0x10, 0xa8, + 0x80, 0x80, 0x80, 0x00, 0x22, 0x01, 0x20, 0x04, 0x20, 0x02, 0x6a, 0x22, + 0x06, 0x46, 0x0d, 0x00, 0x20, 0x03, 0x21, 0x04, 0x03, 0x40, 0x02, 0x40, + 0x20, 0x01, 0x41, 0x7f, 0x4a, 0x0d, 0x00, 0x41, 0x00, 0x21, 0x01, 0x20, + 0x00, 0x41, 0x00, 0x36, 0x02, 0x18, 0x20, 0x00, 0x42, 0x00, 0x37, 0x03, + 0x10, 0x20, 0x00, 0x20, 0x00, 0x28, 0x02, 0x00, 0x41, 0x20, 0x72, 0x36, + 0x02, 0x00, 0x20, 0x05, 0x41, 0x02, 0x46, 0x0d, 0x03, 0x20, 0x02, 0x20, + 0x04, 0x28, 0x02, 0x04, 0x6b, 0x21, 0x01, 0x0c, 0x03, 0x0b, 0x20, 0x04, + 0x20, 0x01, 0x20, 0x04, 0x28, 0x02, 0x04, 0x22, 0x07, 0x4b, 0x22, 0x08, + 0x41, 0x03, 0x74, 0x6a, 0x22, 0x09, 0x20, 0x09, 0x28, 0x02, 0x00, 0x20, + 0x01, 0x20, 0x07, 0x41, 0x00, 0x20, 0x08, 0x1b, 0x6b, 0x22, 0x07, 0x6a, + 0x36, 0x02, 0x00, 0x20, 0x04, 0x41, 0x0c, 0x41, 0x04, 0x20, 0x08, 0x1b, + 0x6a, 0x22, 0x04, 0x20, 0x04, 0x28, 0x02, 0x00, 0x20, 0x07, 0x6b, 0x36, + 0x02, 0x00, 0x20, 0x09, 0x21, 0x04, 0x20, 0x06, 0x20, 0x01, 0x6b, 0x22, + 0x06, 0x20, 0x00, 0x28, 0x02, 0x38, 0x20, 0x09, 0x20, 0x05, 0x20, 0x08, + 0x6b, 0x22, 0x05, 0x10, 0xa8, 0x80, 0x80, 0x80, 0x00, 0x22, 0x01, 0x47, + 0x0d, 0x00, 0x0b, 0x0b, 0x20, 0x00, 0x20, 0x00, 0x28, 0x02, 0x28, 0x22, + 0x01, 0x36, 0x02, 0x18, 0x20, 0x00, 0x20, 0x01, 0x36, 0x02, 0x14, 0x20, + 0x00, 0x20, 0x01, 0x20, 0x00, 0x28, 0x02, 0x2c, 0x6a, 0x36, 0x02, 0x10, + 0x20, 0x02, 0x21, 0x01, 0x0b, 0x20, 0x03, 0x41, 0x10, 0x6a, 0x24, 0x80, + 0x80, 0x80, 0x80, 0x00, 0x20, 0x01, 0x0b, 0x66, 0x01, 0x02, 0x7f, 0x23, + 0x80, 0x80, 0x80, 0x80, 0x00, 0x41, 0x20, 0x6b, 0x22, 0x01, 0x24, 0x80, + 0x80, 0x80, 0x80, 0x00, 0x02, 0x40, 0x02, 0x40, 0x20, 0x00, 0x20, 0x01, + 0x41, 0x08, 0x6a, 0x10, 0x9b, 0x80, 0x80, 0x80, 0x00, 0x22, 0x00, 0x0d, + 0x00, 0x41, 0x3b, 0x21, 0x00, 0x20, 0x01, 0x2d, 0x00, 0x08, 0x41, 0x02, + 0x47, 0x0d, 0x00, 0x20, 0x01, 0x2d, 0x00, 0x10, 0x41, 0x24, 0x71, 0x0d, + 0x00, 0x41, 0x01, 0x21, 0x02, 0x0c, 0x01, 0x0b, 0x41, 0x00, 0x21, 0x02, + 0x41, 0x00, 0x20, 0x00, 0x36, 0x02, 0x80, 0xa8, 0x80, 0x80, 0x00, 0x0b, + 0x20, 0x01, 0x41, 0x20, 0x6a, 0x24, 0x80, 0x80, 0x80, 0x80, 0x00, 0x20, + 0x02, 0x0b, 0x3b, 0x00, 0x20, 0x00, 0x41, 0x81, 0x80, 0x80, 0x80, 0x00, + 0x36, 0x02, 0x20, 0x02, 0x40, 0x20, 0x00, 0x2d, 0x00, 0x00, 0x41, 0xc0, + 0x00, 0x71, 0x0d, 0x00, 0x20, 0x00, 0x28, 0x02, 0x38, 0x10, 0xaa, 0x80, + 0x80, 0x80, 0x00, 0x0d, 0x00, 0x20, 0x00, 0x41, 0x7f, 0x36, 0x02, 0x40, + 0x0b, 0x20, 0x00, 0x20, 0x01, 0x20, 0x02, 0x10, 0xa9, 0x80, 0x80, 0x80, + 0x00, 0x0b, 0x64, 0x01, 0x01, 0x7f, 0x23, 0x80, 0x80, 0x80, 0x80, 0x00, + 0x41, 0x10, 0x6b, 0x22, 0x03, 0x24, 0x80, 0x80, 0x80, 0x80, 0x00, 0x02, + 0x40, 0x02, 0x40, 0x20, 0x00, 0x20, 0x01, 0x20, 0x02, 0x41, 0xff, 0x01, + 0x71, 0x20, 0x03, 0x41, 0x08, 0x6a, 0x10, 0x9c, 0x80, 0x80, 0x80, 0x00, + 0x22, 0x02, 0x45, 0x0d, 0x00, 0x41, 0x00, 0x41, 0xc6, 0x00, 0x20, 0x02, + 0x20, 0x02, 0x41, 0xcc, 0x00, 0x46, 0x1b, 0x36, 0x02, 0x80, 0xa8, 0x80, + 0x80, 0x00, 0x42, 0x7f, 0x21, 0x01, 0x0c, 0x01, 0x0b, 0x20, 0x03, 0x29, + 0x03, 0x08, 0x21, 0x01, 0x0b, 0x20, 0x03, 0x41, 0x10, 0x6a, 0x24, 0x80, + 0x80, 0x80, 0x80, 0x00, 0x20, 0x01, 0x0b, 0x11, 0x00, 0x20, 0x00, 0x28, + 0x02, 0x38, 0x20, 0x01, 0x20, 0x02, 0x10, 0xac, 0x80, 0x80, 0x80, 0x00, + 0x0b, 0x08, 0x00, 0x41, 0x88, 0xb4, 0x80, 0x80, 0x00, 0x0b, 0x83, 0x03, + 0x01, 0x03, 0x7f, 0x02, 0x40, 0x10, 0xae, 0x80, 0x80, 0x80, 0x00, 0x28, + 0x02, 0x00, 0x22, 0x00, 0x45, 0x0d, 0x00, 0x03, 0x40, 0x02, 0x40, 0x20, + 0x00, 0x28, 0x02, 0x14, 0x20, 0x00, 0x28, 0x02, 0x18, 0x46, 0x0d, 0x00, + 0x20, 0x00, 0x41, 0x00, 0x41, 0x00, 0x20, 0x00, 0x28, 0x02, 0x20, 0x11, + 0x80, 0x80, 0x80, 0x80, 0x00, 0x00, 0x1a, 0x0b, 0x02, 0x40, 0x20, 0x00, + 0x28, 0x02, 0x04, 0x22, 0x01, 0x20, 0x00, 0x28, 0x02, 0x08, 0x22, 0x02, + 0x46, 0x0d, 0x00, 0x20, 0x00, 0x20, 0x01, 0x20, 0x02, 0x6b, 0xac, 0x41, + 0x01, 0x20, 0x00, 0x28, 0x02, 0x24, 0x11, 0x81, 0x80, 0x80, 0x80, 0x00, + 0x00, 0x1a, 0x0b, 0x20, 0x00, 0x28, 0x02, 0x34, 0x22, 0x00, 0x0d, 0x00, + 0x0b, 0x0b, 0x02, 0x40, 0x41, 0x00, 0x28, 0x02, 0x8c, 0xb4, 0x80, 0x80, + 0x00, 0x22, 0x00, 0x45, 0x0d, 0x00, 0x02, 0x40, 0x20, 0x00, 0x28, 0x02, + 0x14, 0x20, 0x00, 0x28, 0x02, 0x18, 0x46, 0x0d, 0x00, 0x20, 0x00, 0x41, + 0x00, 0x41, 0x00, 0x20, 0x00, 0x28, 0x02, 0x20, 0x11, 0x80, 0x80, 0x80, + 0x80, 0x00, 0x00, 0x1a, 0x0b, 0x20, 0x00, 0x28, 0x02, 0x04, 0x22, 0x01, + 0x20, 0x00, 0x28, 0x02, 0x08, 0x22, 0x02, 0x46, 0x0d, 0x00, 0x20, 0x00, + 0x20, 0x01, 0x20, 0x02, 0x6b, 0xac, 0x41, 0x01, 0x20, 0x00, 0x28, 0x02, + 0x24, 0x11, 0x81, 0x80, 0x80, 0x80, 0x00, 0x00, 0x1a, 0x0b, 0x02, 0x40, + 0x41, 0x00, 0x28, 0x02, 0xf0, 0x9e, 0x80, 0x80, 0x00, 0x22, 0x00, 0x45, + 0x0d, 0x00, 0x02, 0x40, 0x20, 0x00, 0x28, 0x02, 0x14, 0x20, 0x00, 0x28, + 0x02, 0x18, 0x46, 0x0d, 0x00, 0x20, 0x00, 0x41, 0x00, 0x41, 0x00, 0x20, + 0x00, 0x28, 0x02, 0x20, 0x11, 0x80, 0x80, 0x80, 0x80, 0x00, 0x00, 0x1a, + 0x0b, 0x20, 0x00, 0x28, 0x02, 0x04, 0x22, 0x01, 0x20, 0x00, 0x28, 0x02, + 0x08, 0x22, 0x02, 0x46, 0x0d, 0x00, 0x20, 0x00, 0x20, 0x01, 0x20, 0x02, + 0x6b, 0xac, 0x41, 0x01, 0x20, 0x00, 0x28, 0x02, 0x24, 0x11, 0x81, 0x80, + 0x80, 0x80, 0x00, 0x00, 0x1a, 0x0b, 0x02, 0x40, 0x41, 0x00, 0x28, 0x02, + 0xe8, 0x9f, 0x80, 0x80, 0x00, 0x22, 0x00, 0x45, 0x0d, 0x00, 0x02, 0x40, + 0x20, 0x00, 0x28, 0x02, 0x14, 0x20, 0x00, 0x28, 0x02, 0x18, 0x46, 0x0d, + 0x00, 0x20, 0x00, 0x41, 0x00, 0x41, 0x00, 0x20, 0x00, 0x28, 0x02, 0x20, + 0x11, 0x80, 0x80, 0x80, 0x80, 0x00, 0x00, 0x1a, 0x0b, 0x20, 0x00, 0x28, + 0x02, 0x04, 0x22, 0x01, 0x20, 0x00, 0x28, 0x02, 0x08, 0x22, 0x02, 0x46, + 0x0d, 0x00, 0x20, 0x00, 0x20, 0x01, 0x20, 0x02, 0x6b, 0xac, 0x41, 0x01, + 0x20, 0x00, 0x28, 0x02, 0x24, 0x11, 0x81, 0x80, 0x80, 0x80, 0x00, 0x00, + 0x1a, 0x0b, 0x0b, 0x5c, 0x01, 0x01, 0x7f, 0x20, 0x00, 0x20, 0x00, 0x28, + 0x02, 0x3c, 0x22, 0x01, 0x41, 0x7f, 0x6a, 0x20, 0x01, 0x72, 0x36, 0x02, + 0x3c, 0x02, 0x40, 0x20, 0x00, 0x28, 0x02, 0x00, 0x22, 0x01, 0x41, 0x08, + 0x71, 0x45, 0x0d, 0x00, 0x20, 0x00, 0x20, 0x01, 0x41, 0x20, 0x72, 0x36, + 0x02, 0x00, 0x41, 0x7f, 0x0f, 0x0b, 0x20, 0x00, 0x42, 0x00, 0x37, 0x02, + 0x04, 0x20, 0x00, 0x20, 0x00, 0x28, 0x02, 0x28, 0x22, 0x01, 0x36, 0x02, + 0x18, 0x20, 0x00, 0x20, 0x01, 0x36, 0x02, 0x14, 0x20, 0x00, 0x20, 0x01, + 0x20, 0x00, 0x28, 0x02, 0x2c, 0x6a, 0x36, 0x02, 0x10, 0x41, 0x00, 0x0b, + 0xe8, 0x01, 0x01, 0x05, 0x7f, 0x02, 0x40, 0x02, 0x40, 0x20, 0x02, 0x28, + 0x02, 0x10, 0x22, 0x03, 0x0d, 0x00, 0x41, 0x00, 0x21, 0x04, 0x20, 0x02, + 0x10, 0xb0, 0x80, 0x80, 0x80, 0x00, 0x0d, 0x01, 0x20, 0x02, 0x28, 0x02, + 0x10, 0x21, 0x03, 0x0b, 0x02, 0x40, 0x20, 0x03, 0x20, 0x02, 0x28, 0x02, + 0x14, 0x22, 0x05, 0x6b, 0x20, 0x01, 0x4f, 0x0d, 0x00, 0x20, 0x02, 0x20, + 0x00, 0x20, 0x01, 0x20, 0x02, 0x28, 0x02, 0x20, 0x11, 0x80, 0x80, 0x80, + 0x80, 0x00, 0x00, 0x0f, 0x0b, 0x41, 0x00, 0x21, 0x06, 0x02, 0x40, 0x20, + 0x02, 0x28, 0x02, 0x40, 0x41, 0x00, 0x48, 0x0d, 0x00, 0x41, 0x00, 0x21, + 0x06, 0x20, 0x00, 0x21, 0x04, 0x41, 0x00, 0x21, 0x03, 0x03, 0x40, 0x20, + 0x01, 0x20, 0x03, 0x46, 0x0d, 0x01, 0x20, 0x03, 0x41, 0x01, 0x6a, 0x21, + 0x03, 0x20, 0x04, 0x41, 0x7f, 0x6a, 0x22, 0x04, 0x20, 0x01, 0x6a, 0x22, + 0x07, 0x2d, 0x00, 0x00, 0x41, 0x0a, 0x47, 0x0d, 0x00, 0x0b, 0x20, 0x02, + 0x20, 0x00, 0x20, 0x01, 0x20, 0x03, 0x6b, 0x41, 0x01, 0x6a, 0x22, 0x06, + 0x20, 0x02, 0x28, 0x02, 0x20, 0x11, 0x80, 0x80, 0x80, 0x80, 0x00, 0x00, + 0x22, 0x04, 0x20, 0x06, 0x49, 0x0d, 0x01, 0x20, 0x03, 0x41, 0x7f, 0x6a, + 0x21, 0x01, 0x20, 0x07, 0x41, 0x01, 0x6a, 0x21, 0x00, 0x20, 0x02, 0x28, + 0x02, 0x14, 0x21, 0x05, 0x0b, 0x20, 0x05, 0x20, 0x00, 0x20, 0x01, 0x10, + 0xbf, 0x80, 0x80, 0x80, 0x00, 0x1a, 0x20, 0x02, 0x20, 0x02, 0x28, 0x02, + 0x14, 0x20, 0x01, 0x6a, 0x36, 0x02, 0x14, 0x20, 0x06, 0x20, 0x01, 0x6a, + 0x21, 0x04, 0x0b, 0x20, 0x04, 0x0b, 0x95, 0x02, 0x01, 0x06, 0x7f, 0x20, + 0x02, 0x20, 0x01, 0x6c, 0x21, 0x04, 0x02, 0x40, 0x02, 0x40, 0x20, 0x03, + 0x28, 0x02, 0x10, 0x22, 0x05, 0x0d, 0x00, 0x41, 0x00, 0x21, 0x06, 0x20, + 0x03, 0x10, 0xb0, 0x80, 0x80, 0x80, 0x00, 0x0d, 0x01, 0x20, 0x03, 0x28, + 0x02, 0x10, 0x21, 0x05, 0x0b, 0x02, 0x40, 0x20, 0x05, 0x20, 0x03, 0x28, + 0x02, 0x14, 0x22, 0x07, 0x6b, 0x20, 0x04, 0x4f, 0x0d, 0x00, 0x20, 0x03, + 0x20, 0x00, 0x20, 0x04, 0x20, 0x03, 0x28, 0x02, 0x20, 0x11, 0x80, 0x80, + 0x80, 0x80, 0x00, 0x00, 0x21, 0x06, 0x0c, 0x01, 0x0b, 0x41, 0x00, 0x21, + 0x08, 0x02, 0x40, 0x02, 0x40, 0x20, 0x03, 0x28, 0x02, 0x40, 0x41, 0x00, + 0x4e, 0x0d, 0x00, 0x20, 0x04, 0x21, 0x05, 0x0c, 0x01, 0x0b, 0x20, 0x00, + 0x20, 0x04, 0x6a, 0x21, 0x06, 0x41, 0x00, 0x21, 0x08, 0x41, 0x00, 0x21, + 0x05, 0x03, 0x40, 0x02, 0x40, 0x20, 0x04, 0x20, 0x05, 0x6a, 0x0d, 0x00, + 0x20, 0x04, 0x21, 0x05, 0x0c, 0x02, 0x0b, 0x20, 0x05, 0x41, 0x7f, 0x6a, + 0x22, 0x05, 0x20, 0x06, 0x6a, 0x22, 0x09, 0x2d, 0x00, 0x00, 0x41, 0x0a, + 0x47, 0x0d, 0x00, 0x0b, 0x20, 0x03, 0x20, 0x00, 0x20, 0x04, 0x20, 0x05, + 0x6a, 0x41, 0x01, 0x6a, 0x22, 0x08, 0x20, 0x03, 0x28, 0x02, 0x20, 0x11, + 0x80, 0x80, 0x80, 0x80, 0x00, 0x00, 0x22, 0x06, 0x20, 0x08, 0x49, 0x0d, + 0x01, 0x20, 0x05, 0x41, 0x7f, 0x73, 0x21, 0x05, 0x20, 0x09, 0x41, 0x01, + 0x6a, 0x21, 0x00, 0x20, 0x03, 0x28, 0x02, 0x14, 0x21, 0x07, 0x0b, 0x20, + 0x07, 0x20, 0x00, 0x20, 0x05, 0x10, 0xbf, 0x80, 0x80, 0x80, 0x00, 0x1a, + 0x20, 0x03, 0x20, 0x03, 0x28, 0x02, 0x14, 0x20, 0x05, 0x6a, 0x36, 0x02, + 0x14, 0x20, 0x08, 0x20, 0x05, 0x6a, 0x21, 0x06, 0x0b, 0x02, 0x40, 0x20, + 0x06, 0x20, 0x04, 0x47, 0x0d, 0x00, 0x20, 0x02, 0x41, 0x00, 0x20, 0x01, + 0x1b, 0x0f, 0x0b, 0x20, 0x06, 0x20, 0x01, 0x6e, 0x0b, 0x04, 0x00, 0x20, + 0x00, 0x0b, 0x0c, 0x00, 0x20, 0x00, 0x20, 0x01, 0x10, 0xb3, 0x80, 0x80, + 0x80, 0x00, 0x0b, 0x55, 0x01, 0x01, 0x7f, 0x02, 0x40, 0x41, 0x00, 0x28, + 0x02, 0xa8, 0xb4, 0x80, 0x80, 0x00, 0x22, 0x01, 0x0d, 0x00, 0x41, 0x90, + 0xb4, 0x80, 0x80, 0x00, 0x21, 0x01, 0x41, 0x00, 0x41, 0x90, 0xb4, 0x80, + 0x80, 0x00, 0x36, 0x02, 0xa8, 0xb4, 0x80, 0x80, 0x00, 0x0b, 0x41, 0x00, + 0x20, 0x00, 0x20, 0x00, 0x41, 0xcc, 0x00, 0x4b, 0x1b, 0x41, 0x01, 0x74, + 0x41, 0x80, 0x99, 0x80, 0x80, 0x00, 0x6a, 0x2f, 0x01, 0x00, 0x41, 0xef, + 0x8c, 0x80, 0x80, 0x00, 0x6a, 0x20, 0x01, 0x28, 0x02, 0x14, 0x10, 0xb4, + 0x80, 0x80, 0x80, 0x00, 0x0b, 0xb6, 0x02, 0x01, 0x01, 0x7f, 0x41, 0x01, + 0x21, 0x03, 0x02, 0x40, 0x20, 0x00, 0x45, 0x0d, 0x00, 0x02, 0x40, 0x20, + 0x01, 0x41, 0xff, 0x00, 0x4b, 0x0d, 0x00, 0x20, 0x00, 0x20, 0x01, 0x3a, + 0x00, 0x00, 0x41, 0x01, 0x0f, 0x0b, 0x02, 0x40, 0x02, 0x40, 0x41, 0x00, + 0x28, 0x02, 0x90, 0xb4, 0x80, 0x80, 0x00, 0x0d, 0x00, 0x02, 0x40, 0x20, + 0x01, 0x41, 0x80, 0x7f, 0x71, 0x41, 0x80, 0xbf, 0x03, 0x46, 0x0d, 0x00, + 0x41, 0x00, 0x41, 0x19, 0x36, 0x02, 0x80, 0xa8, 0x80, 0x80, 0x00, 0x0c, + 0x02, 0x0b, 0x20, 0x00, 0x20, 0x01, 0x3a, 0x00, 0x00, 0x41, 0x01, 0x0f, + 0x0b, 0x02, 0x40, 0x20, 0x01, 0x41, 0xff, 0x0f, 0x4b, 0x0d, 0x00, 0x20, + 0x00, 0x20, 0x01, 0x41, 0x3f, 0x71, 0x41, 0x80, 0x01, 0x72, 0x3a, 0x00, + 0x01, 0x20, 0x00, 0x20, 0x01, 0x41, 0x06, 0x76, 0x41, 0xc0, 0x01, 0x72, + 0x3a, 0x00, 0x00, 0x41, 0x02, 0x0f, 0x0b, 0x02, 0x40, 0x02, 0x40, 0x20, + 0x01, 0x41, 0x80, 0xb0, 0x03, 0x49, 0x0d, 0x00, 0x20, 0x01, 0x41, 0x80, + 0x40, 0x71, 0x41, 0x80, 0xc0, 0x03, 0x47, 0x0d, 0x01, 0x0b, 0x20, 0x00, + 0x20, 0x01, 0x41, 0x3f, 0x71, 0x41, 0x80, 0x01, 0x72, 0x3a, 0x00, 0x02, + 0x20, 0x00, 0x20, 0x01, 0x41, 0x0c, 0x76, 0x41, 0xe0, 0x01, 0x72, 0x3a, + 0x00, 0x00, 0x20, 0x00, 0x20, 0x01, 0x41, 0x06, 0x76, 0x41, 0x3f, 0x71, + 0x41, 0x80, 0x01, 0x72, 0x3a, 0x00, 0x01, 0x41, 0x03, 0x0f, 0x0b, 0x02, + 0x40, 0x20, 0x01, 0x41, 0x80, 0x80, 0x7c, 0x6a, 0x41, 0xff, 0xff, 0x3f, + 0x4b, 0x0d, 0x00, 0x20, 0x00, 0x20, 0x01, 0x41, 0x3f, 0x71, 0x41, 0x80, + 0x01, 0x72, 0x3a, 0x00, 0x03, 0x20, 0x00, 0x20, 0x01, 0x41, 0x12, 0x76, + 0x41, 0xf0, 0x01, 0x72, 0x3a, 0x00, 0x00, 0x20, 0x00, 0x20, 0x01, 0x41, + 0x06, 0x76, 0x41, 0x3f, 0x71, 0x41, 0x80, 0x01, 0x72, 0x3a, 0x00, 0x02, + 0x20, 0x00, 0x20, 0x01, 0x41, 0x0c, 0x76, 0x41, 0x3f, 0x71, 0x41, 0x80, + 0x01, 0x72, 0x3a, 0x00, 0x01, 0x41, 0x04, 0x0f, 0x0b, 0x41, 0x00, 0x41, + 0x19, 0x36, 0x02, 0x80, 0xa8, 0x80, 0x80, 0x00, 0x0b, 0x41, 0x7f, 0x21, + 0x03, 0x0b, 0x20, 0x03, 0x0b, 0x18, 0x00, 0x02, 0x40, 0x20, 0x00, 0x0d, + 0x00, 0x41, 0x00, 0x0f, 0x0b, 0x20, 0x00, 0x20, 0x01, 0x41, 0x00, 0x10, + 0xb6, 0x80, 0x80, 0x80, 0x00, 0x0b, 0x8f, 0x01, 0x02, 0x01, 0x7e, 0x01, + 0x7f, 0x02, 0x40, 0x20, 0x00, 0xbd, 0x22, 0x02, 0x42, 0x34, 0x88, 0xa7, + 0x41, 0xff, 0x0f, 0x71, 0x22, 0x03, 0x41, 0xff, 0x0f, 0x46, 0x0d, 0x00, + 0x02, 0x40, 0x20, 0x03, 0x0d, 0x00, 0x02, 0x40, 0x20, 0x00, 0x44, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x62, 0x0d, 0x00, 0x20, 0x01, + 0x41, 0x00, 0x36, 0x02, 0x00, 0x20, 0x00, 0x0f, 0x0b, 0x20, 0x00, 0x44, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x43, 0xa2, 0x20, 0x01, 0x10, + 0xb8, 0x80, 0x80, 0x80, 0x00, 0x21, 0x00, 0x20, 0x01, 0x20, 0x01, 0x28, + 0x02, 0x00, 0x41, 0x40, 0x6a, 0x36, 0x02, 0x00, 0x20, 0x00, 0x0f, 0x0b, + 0x20, 0x01, 0x20, 0x03, 0x41, 0x82, 0x78, 0x6a, 0x36, 0x02, 0x00, 0x20, + 0x02, 0x42, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x87, 0x80, 0x7f, + 0x83, 0x42, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0xf0, 0x3f, 0x84, + 0xbf, 0x21, 0x00, 0x0b, 0x20, 0x00, 0x0b, 0x24, 0x01, 0x01, 0x7f, 0x20, + 0x00, 0x10, 0xc1, 0x80, 0x80, 0x80, 0x00, 0x21, 0x02, 0x41, 0x7f, 0x41, + 0x00, 0x20, 0x02, 0x20, 0x00, 0x41, 0x01, 0x20, 0x02, 0x20, 0x01, 0x10, + 0xb2, 0x80, 0x80, 0x80, 0x00, 0x47, 0x1b, 0x0b, 0x8c, 0x03, 0x01, 0x03, + 0x7f, 0x23, 0x80, 0x80, 0x80, 0x80, 0x00, 0x41, 0xd0, 0x01, 0x6b, 0x22, + 0x03, 0x24, 0x80, 0x80, 0x80, 0x80, 0x00, 0x20, 0x03, 0x20, 0x02, 0x36, + 0x02, 0xcc, 0x01, 0x20, 0x03, 0x41, 0xa0, 0x01, 0x6a, 0x41, 0x20, 0x6a, + 0x42, 0x00, 0x37, 0x03, 0x00, 0x20, 0x03, 0x41, 0xb8, 0x01, 0x6a, 0x42, + 0x00, 0x37, 0x03, 0x00, 0x20, 0x03, 0x41, 0xb0, 0x01, 0x6a, 0x42, 0x00, + 0x37, 0x03, 0x00, 0x20, 0x03, 0x42, 0x00, 0x37, 0x03, 0xa8, 0x01, 0x20, + 0x03, 0x42, 0x00, 0x37, 0x03, 0xa0, 0x01, 0x20, 0x03, 0x20, 0x02, 0x36, + 0x02, 0xc8, 0x01, 0x02, 0x40, 0x02, 0x40, 0x41, 0x00, 0x20, 0x01, 0x20, + 0x03, 0x41, 0xc8, 0x01, 0x6a, 0x20, 0x03, 0x41, 0xd0, 0x00, 0x6a, 0x20, + 0x03, 0x41, 0xa0, 0x01, 0x6a, 0x10, 0xbb, 0x80, 0x80, 0x80, 0x00, 0x41, + 0x00, 0x4e, 0x0d, 0x00, 0x41, 0x7f, 0x21, 0x00, 0x0c, 0x01, 0x0b, 0x20, + 0x00, 0x28, 0x02, 0x00, 0x21, 0x04, 0x02, 0x40, 0x20, 0x00, 0x28, 0x02, + 0x3c, 0x41, 0x00, 0x4a, 0x0d, 0x00, 0x20, 0x00, 0x20, 0x04, 0x41, 0x5f, + 0x71, 0x36, 0x02, 0x00, 0x0b, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, 0x02, + 0x40, 0x20, 0x00, 0x28, 0x02, 0x2c, 0x0d, 0x00, 0x20, 0x00, 0x41, 0xd0, + 0x00, 0x36, 0x02, 0x2c, 0x20, 0x00, 0x41, 0x00, 0x36, 0x02, 0x18, 0x20, + 0x00, 0x42, 0x00, 0x37, 0x03, 0x10, 0x20, 0x00, 0x28, 0x02, 0x28, 0x21, + 0x05, 0x20, 0x00, 0x20, 0x03, 0x36, 0x02, 0x28, 0x0c, 0x01, 0x0b, 0x41, + 0x00, 0x21, 0x05, 0x20, 0x00, 0x28, 0x02, 0x10, 0x0d, 0x01, 0x0b, 0x41, + 0x7f, 0x21, 0x02, 0x20, 0x00, 0x10, 0xb0, 0x80, 0x80, 0x80, 0x00, 0x0d, + 0x01, 0x0b, 0x20, 0x00, 0x20, 0x01, 0x20, 0x03, 0x41, 0xc8, 0x01, 0x6a, + 0x20, 0x03, 0x41, 0xd0, 0x00, 0x6a, 0x20, 0x03, 0x41, 0xa0, 0x01, 0x6a, + 0x10, 0xbb, 0x80, 0x80, 0x80, 0x00, 0x21, 0x02, 0x0b, 0x20, 0x04, 0x41, + 0x20, 0x71, 0x21, 0x01, 0x02, 0x40, 0x20, 0x05, 0x45, 0x0d, 0x00, 0x20, + 0x00, 0x41, 0x00, 0x41, 0x00, 0x20, 0x00, 0x28, 0x02, 0x20, 0x11, 0x80, + 0x80, 0x80, 0x80, 0x00, 0x00, 0x1a, 0x20, 0x00, 0x41, 0x00, 0x36, 0x02, + 0x2c, 0x20, 0x00, 0x20, 0x05, 0x36, 0x02, 0x28, 0x20, 0x00, 0x41, 0x00, + 0x36, 0x02, 0x18, 0x20, 0x00, 0x28, 0x02, 0x14, 0x21, 0x05, 0x20, 0x00, + 0x42, 0x00, 0x37, 0x03, 0x10, 0x20, 0x02, 0x41, 0x7f, 0x20, 0x05, 0x1b, + 0x21, 0x02, 0x0b, 0x20, 0x00, 0x20, 0x00, 0x28, 0x02, 0x00, 0x22, 0x05, + 0x20, 0x01, 0x72, 0x36, 0x02, 0x00, 0x41, 0x7f, 0x20, 0x02, 0x20, 0x05, + 0x41, 0x20, 0x71, 0x1b, 0x21, 0x00, 0x0b, 0x20, 0x03, 0x41, 0xd0, 0x01, + 0x6a, 0x24, 0x80, 0x80, 0x80, 0x80, 0x00, 0x20, 0x00, 0x0b, 0xf5, 0x46, + 0x05, 0x1a, 0x7f, 0x02, 0x7e, 0x01, 0x7c, 0x08, 0x7f, 0x01, 0x7c, 0x23, + 0x80, 0x80, 0x80, 0x80, 0x00, 0x41, 0xf0, 0x06, 0x6b, 0x22, 0x05, 0x24, + 0x80, 0x80, 0x80, 0x80, 0x00, 0x20, 0x05, 0x41, 0xc4, 0x00, 0x6a, 0x41, + 0x0c, 0x6a, 0x21, 0x06, 0x41, 0x00, 0x20, 0x05, 0x41, 0xf0, 0x00, 0x6a, + 0x6b, 0x21, 0x07, 0x20, 0x05, 0x41, 0xec, 0x60, 0x6a, 0x21, 0x08, 0x20, + 0x05, 0x41, 0x37, 0x6a, 0x21, 0x09, 0x20, 0x05, 0x41, 0xc4, 0x00, 0x6a, + 0x41, 0x0b, 0x6a, 0x21, 0x0a, 0x20, 0x05, 0x41, 0xd0, 0x00, 0x6a, 0x41, + 0x7f, 0x6a, 0x21, 0x0b, 0x20, 0x05, 0x41, 0xd0, 0x00, 0x6a, 0x41, 0x08, + 0x72, 0x21, 0x0c, 0x20, 0x05, 0x41, 0xd0, 0x00, 0x6a, 0x41, 0x09, 0x72, + 0x21, 0x0d, 0x20, 0x05, 0x41, 0xc4, 0x00, 0x6a, 0x41, 0x0a, 0x6a, 0x21, + 0x0e, 0x20, 0x05, 0x41, 0x38, 0x6a, 0x21, 0x0f, 0x41, 0x00, 0x21, 0x10, + 0x41, 0x00, 0x21, 0x11, 0x41, 0x00, 0x21, 0x12, 0x02, 0x40, 0x02, 0x40, + 0x02, 0x40, 0x03, 0x40, 0x20, 0x01, 0x21, 0x13, 0x20, 0x12, 0x20, 0x11, + 0x41, 0xff, 0xff, 0xff, 0xff, 0x07, 0x73, 0x4a, 0x0d, 0x01, 0x20, 0x12, + 0x20, 0x11, 0x6a, 0x21, 0x11, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, 0x02, + 0x40, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, 0x20, + 0x13, 0x2d, 0x00, 0x00, 0x22, 0x12, 0x45, 0x0d, 0x00, 0x20, 0x13, 0x21, + 0x01, 0x03, 0x40, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, 0x20, 0x12, 0x41, + 0xff, 0x01, 0x71, 0x22, 0x12, 0x45, 0x0d, 0x00, 0x20, 0x12, 0x41, 0x25, + 0x47, 0x0d, 0x02, 0x20, 0x01, 0x21, 0x14, 0x20, 0x01, 0x21, 0x12, 0x03, + 0x40, 0x02, 0x40, 0x20, 0x12, 0x2d, 0x00, 0x01, 0x41, 0x25, 0x46, 0x0d, + 0x00, 0x20, 0x12, 0x21, 0x01, 0x0c, 0x03, 0x0b, 0x20, 0x14, 0x41, 0x01, + 0x6a, 0x21, 0x14, 0x20, 0x12, 0x2d, 0x00, 0x02, 0x21, 0x15, 0x20, 0x12, + 0x41, 0x02, 0x6a, 0x22, 0x01, 0x21, 0x12, 0x20, 0x15, 0x41, 0x25, 0x46, + 0x0d, 0x00, 0x0c, 0x02, 0x0b, 0x0b, 0x20, 0x01, 0x21, 0x14, 0x0b, 0x20, + 0x14, 0x20, 0x13, 0x6b, 0x22, 0x12, 0x20, 0x11, 0x41, 0xff, 0xff, 0xff, + 0xff, 0x07, 0x73, 0x22, 0x14, 0x4a, 0x0d, 0x0c, 0x02, 0x40, 0x20, 0x00, + 0x45, 0x0d, 0x00, 0x20, 0x00, 0x2d, 0x00, 0x00, 0x41, 0x20, 0x71, 0x0d, + 0x00, 0x20, 0x13, 0x20, 0x12, 0x20, 0x00, 0x10, 0xb1, 0x80, 0x80, 0x80, + 0x00, 0x1a, 0x0b, 0x20, 0x12, 0x0d, 0x0b, 0x20, 0x01, 0x41, 0x01, 0x6a, + 0x21, 0x12, 0x41, 0x7f, 0x21, 0x16, 0x02, 0x40, 0x20, 0x01, 0x2c, 0x00, + 0x01, 0x22, 0x17, 0x41, 0x50, 0x6a, 0x22, 0x15, 0x41, 0x09, 0x4b, 0x0d, + 0x00, 0x20, 0x01, 0x2d, 0x00, 0x02, 0x41, 0x24, 0x47, 0x0d, 0x00, 0x20, + 0x01, 0x41, 0x03, 0x6a, 0x21, 0x12, 0x20, 0x01, 0x2c, 0x00, 0x03, 0x21, + 0x17, 0x41, 0x01, 0x21, 0x10, 0x20, 0x15, 0x21, 0x16, 0x0b, 0x41, 0x00, + 0x21, 0x18, 0x02, 0x40, 0x20, 0x17, 0x41, 0x60, 0x6a, 0x22, 0x01, 0x41, + 0x1f, 0x4b, 0x0d, 0x00, 0x41, 0x01, 0x20, 0x01, 0x74, 0x22, 0x01, 0x41, + 0x89, 0xd1, 0x04, 0x71, 0x45, 0x0d, 0x00, 0x20, 0x12, 0x41, 0x01, 0x6a, + 0x21, 0x15, 0x41, 0x00, 0x21, 0x18, 0x03, 0x40, 0x20, 0x01, 0x20, 0x18, + 0x72, 0x21, 0x18, 0x20, 0x15, 0x22, 0x12, 0x2c, 0x00, 0x00, 0x22, 0x17, + 0x41, 0x60, 0x6a, 0x22, 0x01, 0x41, 0x20, 0x4f, 0x0d, 0x01, 0x20, 0x12, + 0x41, 0x01, 0x6a, 0x21, 0x15, 0x41, 0x01, 0x20, 0x01, 0x74, 0x22, 0x01, + 0x41, 0x89, 0xd1, 0x04, 0x71, 0x0d, 0x00, 0x0b, 0x0b, 0x02, 0x40, 0x20, + 0x17, 0x41, 0x2a, 0x47, 0x0d, 0x00, 0x02, 0x40, 0x02, 0x40, 0x20, 0x12, + 0x2c, 0x00, 0x01, 0x41, 0x50, 0x6a, 0x22, 0x01, 0x41, 0x09, 0x4b, 0x0d, + 0x00, 0x20, 0x12, 0x2d, 0x00, 0x02, 0x41, 0x24, 0x47, 0x0d, 0x00, 0x20, + 0x04, 0x20, 0x01, 0x41, 0x02, 0x74, 0x6a, 0x41, 0x0a, 0x36, 0x02, 0x00, + 0x20, 0x12, 0x41, 0x03, 0x6a, 0x21, 0x15, 0x20, 0x12, 0x2c, 0x00, 0x01, + 0x41, 0x03, 0x74, 0x20, 0x03, 0x6a, 0x41, 0x80, 0x7d, 0x6a, 0x28, 0x02, + 0x00, 0x21, 0x19, 0x41, 0x01, 0x21, 0x10, 0x0c, 0x01, 0x0b, 0x20, 0x10, + 0x0d, 0x06, 0x20, 0x12, 0x41, 0x01, 0x6a, 0x21, 0x15, 0x02, 0x40, 0x20, + 0x00, 0x0d, 0x00, 0x41, 0x00, 0x21, 0x10, 0x41, 0x00, 0x21, 0x19, 0x0c, + 0x06, 0x0b, 0x20, 0x02, 0x20, 0x02, 0x28, 0x02, 0x00, 0x22, 0x01, 0x41, + 0x04, 0x6a, 0x36, 0x02, 0x00, 0x20, 0x01, 0x28, 0x02, 0x00, 0x21, 0x19, + 0x41, 0x00, 0x21, 0x10, 0x0b, 0x20, 0x19, 0x41, 0x7f, 0x4a, 0x0d, 0x04, + 0x41, 0x00, 0x20, 0x19, 0x6b, 0x21, 0x19, 0x20, 0x18, 0x41, 0x80, 0xc0, + 0x00, 0x72, 0x21, 0x18, 0x0c, 0x04, 0x0b, 0x41, 0x00, 0x21, 0x19, 0x02, + 0x40, 0x20, 0x17, 0x41, 0x50, 0x6a, 0x22, 0x01, 0x41, 0x09, 0x4d, 0x0d, + 0x00, 0x20, 0x12, 0x21, 0x15, 0x0c, 0x04, 0x0b, 0x41, 0x00, 0x21, 0x19, + 0x03, 0x40, 0x02, 0x40, 0x20, 0x19, 0x41, 0xcc, 0x99, 0xb3, 0xe6, 0x00, + 0x4b, 0x0d, 0x00, 0x41, 0x7f, 0x20, 0x19, 0x41, 0x0a, 0x6c, 0x22, 0x15, + 0x20, 0x01, 0x6a, 0x20, 0x01, 0x20, 0x15, 0x41, 0xff, 0xff, 0xff, 0xff, + 0x07, 0x73, 0x4b, 0x1b, 0x21, 0x19, 0x20, 0x12, 0x2c, 0x00, 0x01, 0x21, + 0x01, 0x20, 0x12, 0x41, 0x01, 0x6a, 0x22, 0x15, 0x21, 0x12, 0x20, 0x01, + 0x41, 0x50, 0x6a, 0x22, 0x01, 0x41, 0x0a, 0x49, 0x0d, 0x01, 0x20, 0x19, + 0x41, 0x00, 0x48, 0x0d, 0x0e, 0x0c, 0x05, 0x0b, 0x20, 0x12, 0x2c, 0x00, + 0x01, 0x21, 0x01, 0x41, 0x7f, 0x21, 0x19, 0x20, 0x12, 0x41, 0x01, 0x6a, + 0x21, 0x12, 0x20, 0x01, 0x41, 0x50, 0x6a, 0x22, 0x01, 0x41, 0x0a, 0x49, + 0x0d, 0x00, 0x0c, 0x0d, 0x0b, 0x0b, 0x20, 0x01, 0x2d, 0x00, 0x01, 0x21, + 0x12, 0x20, 0x01, 0x41, 0x01, 0x6a, 0x21, 0x01, 0x0c, 0x00, 0x0b, 0x0b, + 0x20, 0x00, 0x0d, 0x0b, 0x02, 0x40, 0x20, 0x10, 0x0d, 0x00, 0x41, 0x00, + 0x21, 0x11, 0x0c, 0x0c, 0x0b, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, 0x20, + 0x04, 0x28, 0x02, 0x04, 0x22, 0x01, 0x0d, 0x00, 0x41, 0x01, 0x21, 0x01, + 0x0c, 0x01, 0x0b, 0x20, 0x03, 0x41, 0x08, 0x6a, 0x20, 0x01, 0x20, 0x02, + 0x10, 0xbc, 0x80, 0x80, 0x80, 0x00, 0x02, 0x40, 0x20, 0x04, 0x28, 0x02, + 0x08, 0x22, 0x01, 0x0d, 0x00, 0x41, 0x02, 0x21, 0x01, 0x0c, 0x01, 0x0b, + 0x20, 0x03, 0x41, 0x10, 0x6a, 0x20, 0x01, 0x20, 0x02, 0x10, 0xbc, 0x80, + 0x80, 0x80, 0x00, 0x02, 0x40, 0x20, 0x04, 0x28, 0x02, 0x0c, 0x22, 0x01, + 0x0d, 0x00, 0x41, 0x03, 0x21, 0x01, 0x0c, 0x01, 0x0b, 0x20, 0x03, 0x41, + 0x18, 0x6a, 0x20, 0x01, 0x20, 0x02, 0x10, 0xbc, 0x80, 0x80, 0x80, 0x00, + 0x02, 0x40, 0x20, 0x04, 0x28, 0x02, 0x10, 0x22, 0x01, 0x0d, 0x00, 0x41, + 0x04, 0x21, 0x01, 0x0c, 0x01, 0x0b, 0x20, 0x03, 0x41, 0x20, 0x6a, 0x20, + 0x01, 0x20, 0x02, 0x10, 0xbc, 0x80, 0x80, 0x80, 0x00, 0x02, 0x40, 0x20, + 0x04, 0x28, 0x02, 0x14, 0x22, 0x01, 0x0d, 0x00, 0x41, 0x05, 0x21, 0x01, + 0x0c, 0x01, 0x0b, 0x20, 0x03, 0x41, 0x28, 0x6a, 0x20, 0x01, 0x20, 0x02, + 0x10, 0xbc, 0x80, 0x80, 0x80, 0x00, 0x02, 0x40, 0x20, 0x04, 0x28, 0x02, + 0x18, 0x22, 0x01, 0x0d, 0x00, 0x41, 0x06, 0x21, 0x01, 0x0c, 0x01, 0x0b, + 0x20, 0x03, 0x41, 0x30, 0x6a, 0x20, 0x01, 0x20, 0x02, 0x10, 0xbc, 0x80, + 0x80, 0x80, 0x00, 0x02, 0x40, 0x20, 0x04, 0x28, 0x02, 0x1c, 0x22, 0x01, + 0x0d, 0x00, 0x41, 0x07, 0x21, 0x01, 0x0c, 0x01, 0x0b, 0x20, 0x03, 0x41, + 0x38, 0x6a, 0x20, 0x01, 0x20, 0x02, 0x10, 0xbc, 0x80, 0x80, 0x80, 0x00, + 0x02, 0x40, 0x20, 0x04, 0x28, 0x02, 0x20, 0x22, 0x01, 0x0d, 0x00, 0x41, + 0x08, 0x21, 0x01, 0x0c, 0x01, 0x0b, 0x20, 0x03, 0x41, 0xc0, 0x00, 0x6a, + 0x20, 0x01, 0x20, 0x02, 0x10, 0xbc, 0x80, 0x80, 0x80, 0x00, 0x20, 0x04, + 0x28, 0x02, 0x24, 0x22, 0x01, 0x0d, 0x01, 0x41, 0x09, 0x21, 0x01, 0x0b, + 0x20, 0x01, 0x41, 0x02, 0x74, 0x21, 0x01, 0x03, 0x40, 0x20, 0x04, 0x20, + 0x01, 0x6a, 0x28, 0x02, 0x00, 0x0d, 0x03, 0x20, 0x01, 0x41, 0x04, 0x6a, + 0x22, 0x01, 0x41, 0x28, 0x47, 0x0d, 0x00, 0x0b, 0x41, 0x01, 0x21, 0x11, + 0x0c, 0x0c, 0x0b, 0x20, 0x03, 0x41, 0xc8, 0x00, 0x6a, 0x20, 0x01, 0x20, + 0x02, 0x10, 0xbc, 0x80, 0x80, 0x80, 0x00, 0x41, 0x01, 0x21, 0x11, 0x0c, + 0x0b, 0x0b, 0x41, 0x00, 0x21, 0x12, 0x41, 0x7f, 0x21, 0x17, 0x02, 0x40, + 0x02, 0x40, 0x20, 0x15, 0x2d, 0x00, 0x00, 0x41, 0x2e, 0x46, 0x0d, 0x00, + 0x20, 0x15, 0x21, 0x01, 0x41, 0x00, 0x21, 0x1a, 0x0c, 0x01, 0x0b, 0x02, + 0x40, 0x20, 0x15, 0x2c, 0x00, 0x01, 0x22, 0x17, 0x41, 0x2a, 0x47, 0x0d, + 0x00, 0x02, 0x40, 0x02, 0x40, 0x20, 0x15, 0x2c, 0x00, 0x02, 0x41, 0x50, + 0x6a, 0x22, 0x01, 0x41, 0x09, 0x4b, 0x0d, 0x00, 0x20, 0x15, 0x2d, 0x00, + 0x03, 0x41, 0x24, 0x47, 0x0d, 0x00, 0x20, 0x04, 0x20, 0x01, 0x41, 0x02, + 0x74, 0x6a, 0x41, 0x0a, 0x36, 0x02, 0x00, 0x20, 0x15, 0x41, 0x04, 0x6a, + 0x21, 0x01, 0x20, 0x15, 0x2c, 0x00, 0x02, 0x41, 0x03, 0x74, 0x20, 0x03, + 0x6a, 0x41, 0x80, 0x7d, 0x6a, 0x28, 0x02, 0x00, 0x21, 0x17, 0x0c, 0x01, + 0x0b, 0x20, 0x10, 0x0d, 0x03, 0x20, 0x15, 0x41, 0x02, 0x6a, 0x21, 0x01, + 0x02, 0x40, 0x20, 0x00, 0x0d, 0x00, 0x41, 0x00, 0x21, 0x17, 0x0c, 0x01, + 0x0b, 0x20, 0x02, 0x20, 0x02, 0x28, 0x02, 0x00, 0x22, 0x15, 0x41, 0x04, + 0x6a, 0x36, 0x02, 0x00, 0x20, 0x15, 0x28, 0x02, 0x00, 0x21, 0x17, 0x0b, + 0x20, 0x17, 0x41, 0x7f, 0x73, 0x41, 0x1f, 0x76, 0x21, 0x1a, 0x0c, 0x01, + 0x0b, 0x20, 0x15, 0x41, 0x01, 0x6a, 0x21, 0x01, 0x02, 0x40, 0x20, 0x17, + 0x41, 0x50, 0x6a, 0x22, 0x1b, 0x41, 0x09, 0x4d, 0x0d, 0x00, 0x41, 0x01, + 0x21, 0x1a, 0x41, 0x00, 0x21, 0x17, 0x0c, 0x01, 0x0b, 0x41, 0x00, 0x21, + 0x1c, 0x20, 0x01, 0x21, 0x15, 0x03, 0x40, 0x41, 0x7f, 0x21, 0x17, 0x02, + 0x40, 0x20, 0x1c, 0x41, 0xcc, 0x99, 0xb3, 0xe6, 0x00, 0x4b, 0x0d, 0x00, + 0x41, 0x7f, 0x20, 0x1c, 0x41, 0x0a, 0x6c, 0x22, 0x01, 0x20, 0x1b, 0x6a, + 0x20, 0x1b, 0x20, 0x01, 0x41, 0xff, 0xff, 0xff, 0xff, 0x07, 0x73, 0x4b, + 0x1b, 0x21, 0x17, 0x0b, 0x41, 0x01, 0x21, 0x1a, 0x20, 0x15, 0x2c, 0x00, + 0x01, 0x21, 0x1b, 0x20, 0x17, 0x21, 0x1c, 0x20, 0x15, 0x41, 0x01, 0x6a, + 0x22, 0x01, 0x21, 0x15, 0x20, 0x1b, 0x41, 0x50, 0x6a, 0x22, 0x1b, 0x41, + 0x0a, 0x49, 0x0d, 0x00, 0x0b, 0x0b, 0x03, 0x40, 0x20, 0x12, 0x21, 0x15, + 0x20, 0x01, 0x2c, 0x00, 0x00, 0x22, 0x12, 0x41, 0x85, 0x7f, 0x6a, 0x41, + 0x46, 0x49, 0x0d, 0x01, 0x20, 0x01, 0x41, 0x01, 0x6a, 0x21, 0x01, 0x20, + 0x12, 0x20, 0x15, 0x41, 0x3a, 0x6c, 0x6a, 0x41, 0xdf, 0x99, 0x80, 0x80, + 0x00, 0x6a, 0x2d, 0x00, 0x00, 0x22, 0x12, 0x41, 0x7f, 0x6a, 0x41, 0x08, + 0x49, 0x0d, 0x00, 0x0b, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, 0x20, 0x12, + 0x41, 0x1b, 0x46, 0x0d, 0x00, 0x20, 0x12, 0x45, 0x0d, 0x03, 0x02, 0x40, + 0x20, 0x16, 0x41, 0x00, 0x48, 0x0d, 0x00, 0x20, 0x04, 0x20, 0x16, 0x41, + 0x02, 0x74, 0x6a, 0x20, 0x12, 0x36, 0x02, 0x00, 0x20, 0x05, 0x20, 0x03, + 0x20, 0x16, 0x41, 0x03, 0x74, 0x6a, 0x29, 0x03, 0x00, 0x37, 0x03, 0x38, + 0x0c, 0x02, 0x0b, 0x02, 0x40, 0x20, 0x00, 0x0d, 0x00, 0x41, 0x00, 0x21, + 0x11, 0x0c, 0x0e, 0x0b, 0x20, 0x05, 0x41, 0x38, 0x6a, 0x20, 0x12, 0x20, + 0x02, 0x10, 0xbc, 0x80, 0x80, 0x80, 0x00, 0x0c, 0x02, 0x0b, 0x20, 0x16, + 0x41, 0x7f, 0x4a, 0x0d, 0x02, 0x0b, 0x41, 0x00, 0x21, 0x12, 0x20, 0x00, + 0x45, 0x0d, 0x08, 0x0b, 0x20, 0x18, 0x41, 0xff, 0xff, 0x7b, 0x71, 0x22, + 0x1c, 0x20, 0x18, 0x20, 0x18, 0x41, 0x80, 0xc0, 0x00, 0x71, 0x1b, 0x21, + 0x16, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, 0x02, + 0x40, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, 0x02, + 0x40, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, 0x20, + 0x01, 0x41, 0x7f, 0x6a, 0x2c, 0x00, 0x00, 0x22, 0x12, 0x41, 0x5f, 0x71, + 0x20, 0x12, 0x20, 0x12, 0x41, 0x0f, 0x71, 0x41, 0x03, 0x46, 0x1b, 0x20, + 0x12, 0x20, 0x15, 0x1b, 0x22, 0x1d, 0x41, 0xbf, 0x7f, 0x6a, 0x0e, 0x38, + 0x10, 0x12, 0x0d, 0x12, 0x10, 0x10, 0x10, 0x12, 0x12, 0x12, 0x12, 0x12, + 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x0c, 0x12, 0x12, 0x12, 0x12, 0x03, + 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x10, 0x12, 0x08, 0x05, + 0x10, 0x10, 0x10, 0x12, 0x05, 0x12, 0x12, 0x12, 0x09, 0x01, 0x04, 0x02, + 0x12, 0x12, 0x0a, 0x12, 0x00, 0x12, 0x12, 0x03, 0x12, 0x0b, 0x41, 0x00, + 0x21, 0x1b, 0x41, 0x80, 0x88, 0x80, 0x80, 0x00, 0x21, 0x1e, 0x20, 0x05, + 0x29, 0x03, 0x38, 0x21, 0x1f, 0x0c, 0x05, 0x0b, 0x41, 0x00, 0x21, 0x12, + 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, + 0x02, 0x40, 0x20, 0x15, 0x41, 0xff, 0x01, 0x71, 0x0e, 0x08, 0x00, 0x01, + 0x02, 0x03, 0x04, 0x1d, 0x05, 0x06, 0x1d, 0x0b, 0x20, 0x05, 0x28, 0x02, + 0x38, 0x20, 0x11, 0x36, 0x02, 0x00, 0x0c, 0x1c, 0x0b, 0x20, 0x05, 0x28, + 0x02, 0x38, 0x20, 0x11, 0x36, 0x02, 0x00, 0x0c, 0x1b, 0x0b, 0x20, 0x05, + 0x28, 0x02, 0x38, 0x20, 0x11, 0xac, 0x37, 0x03, 0x00, 0x0c, 0x1a, 0x0b, + 0x20, 0x05, 0x28, 0x02, 0x38, 0x20, 0x11, 0x3b, 0x01, 0x00, 0x0c, 0x19, + 0x0b, 0x20, 0x05, 0x28, 0x02, 0x38, 0x20, 0x11, 0x3a, 0x00, 0x00, 0x0c, + 0x18, 0x0b, 0x20, 0x05, 0x28, 0x02, 0x38, 0x20, 0x11, 0x36, 0x02, 0x00, + 0x0c, 0x17, 0x0b, 0x20, 0x05, 0x28, 0x02, 0x38, 0x20, 0x11, 0xac, 0x37, + 0x03, 0x00, 0x0c, 0x16, 0x0b, 0x20, 0x17, 0x41, 0x08, 0x20, 0x17, 0x41, + 0x08, 0x4b, 0x1b, 0x21, 0x17, 0x20, 0x16, 0x41, 0x08, 0x72, 0x21, 0x16, + 0x41, 0xf8, 0x00, 0x21, 0x1d, 0x0b, 0x41, 0x00, 0x21, 0x1b, 0x41, 0x80, + 0x88, 0x80, 0x80, 0x00, 0x21, 0x1e, 0x02, 0x40, 0x20, 0x05, 0x29, 0x03, + 0x38, 0x22, 0x1f, 0x50, 0x45, 0x0d, 0x00, 0x20, 0x0f, 0x21, 0x13, 0x0c, + 0x04, 0x0b, 0x20, 0x1d, 0x41, 0x20, 0x71, 0x21, 0x15, 0x20, 0x0f, 0x21, + 0x13, 0x03, 0x40, 0x20, 0x13, 0x41, 0x7f, 0x6a, 0x22, 0x13, 0x20, 0x1f, + 0xa7, 0x41, 0x0f, 0x71, 0x41, 0xf0, 0x9d, 0x80, 0x80, 0x00, 0x6a, 0x2d, + 0x00, 0x00, 0x20, 0x15, 0x72, 0x3a, 0x00, 0x00, 0x20, 0x1f, 0x42, 0x0f, + 0x56, 0x21, 0x12, 0x20, 0x1f, 0x42, 0x04, 0x88, 0x21, 0x1f, 0x20, 0x12, + 0x0d, 0x00, 0x0b, 0x20, 0x16, 0x41, 0x08, 0x71, 0x45, 0x0d, 0x03, 0x20, + 0x1d, 0x41, 0x04, 0x75, 0x41, 0x80, 0x88, 0x80, 0x80, 0x00, 0x6a, 0x21, + 0x1e, 0x41, 0x02, 0x21, 0x1b, 0x0c, 0x03, 0x0b, 0x20, 0x0f, 0x21, 0x13, + 0x02, 0x40, 0x20, 0x05, 0x29, 0x03, 0x38, 0x22, 0x1f, 0x50, 0x0d, 0x00, + 0x20, 0x0f, 0x21, 0x13, 0x03, 0x40, 0x20, 0x13, 0x41, 0x7f, 0x6a, 0x22, + 0x13, 0x20, 0x1f, 0xa7, 0x41, 0x07, 0x71, 0x41, 0x30, 0x72, 0x3a, 0x00, + 0x00, 0x20, 0x1f, 0x42, 0x07, 0x56, 0x21, 0x12, 0x20, 0x1f, 0x42, 0x03, + 0x88, 0x21, 0x1f, 0x20, 0x12, 0x0d, 0x00, 0x0b, 0x0b, 0x41, 0x00, 0x21, + 0x1b, 0x41, 0x80, 0x88, 0x80, 0x80, 0x00, 0x21, 0x1e, 0x20, 0x16, 0x41, + 0x08, 0x71, 0x45, 0x0d, 0x02, 0x20, 0x17, 0x20, 0x0f, 0x20, 0x13, 0x6b, + 0x22, 0x12, 0x41, 0x01, 0x6a, 0x20, 0x17, 0x20, 0x12, 0x4a, 0x1b, 0x21, + 0x17, 0x0c, 0x02, 0x0b, 0x02, 0x40, 0x20, 0x05, 0x29, 0x03, 0x38, 0x22, + 0x1f, 0x42, 0x7f, 0x55, 0x0d, 0x00, 0x20, 0x05, 0x42, 0x00, 0x20, 0x1f, + 0x7d, 0x22, 0x1f, 0x37, 0x03, 0x38, 0x41, 0x01, 0x21, 0x1b, 0x41, 0x80, + 0x88, 0x80, 0x80, 0x00, 0x21, 0x1e, 0x0c, 0x01, 0x0b, 0x02, 0x40, 0x20, + 0x16, 0x41, 0x80, 0x10, 0x71, 0x45, 0x0d, 0x00, 0x41, 0x01, 0x21, 0x1b, + 0x41, 0x81, 0x88, 0x80, 0x80, 0x00, 0x21, 0x1e, 0x0c, 0x01, 0x0b, 0x41, + 0x82, 0x88, 0x80, 0x80, 0x00, 0x41, 0x80, 0x88, 0x80, 0x80, 0x00, 0x20, + 0x16, 0x41, 0x01, 0x71, 0x22, 0x1b, 0x1b, 0x21, 0x1e, 0x0b, 0x02, 0x40, + 0x02, 0x40, 0x20, 0x1f, 0x42, 0x80, 0x80, 0x80, 0x80, 0x10, 0x5a, 0x0d, + 0x00, 0x20, 0x1f, 0x21, 0x20, 0x20, 0x0f, 0x21, 0x13, 0x0c, 0x01, 0x0b, + 0x20, 0x0f, 0x21, 0x13, 0x03, 0x40, 0x20, 0x13, 0x41, 0x7f, 0x6a, 0x22, + 0x13, 0x20, 0x1f, 0x20, 0x1f, 0x42, 0x0a, 0x80, 0x22, 0x20, 0x42, 0x0a, + 0x7e, 0x7d, 0xa7, 0x41, 0x30, 0x72, 0x3a, 0x00, 0x00, 0x20, 0x1f, 0x42, + 0xff, 0xff, 0xff, 0xff, 0x9f, 0x01, 0x56, 0x21, 0x12, 0x20, 0x20, 0x21, + 0x1f, 0x20, 0x12, 0x0d, 0x00, 0x0b, 0x0b, 0x20, 0x20, 0xa7, 0x22, 0x12, + 0x45, 0x0d, 0x00, 0x03, 0x40, 0x20, 0x13, 0x41, 0x7f, 0x6a, 0x22, 0x13, + 0x20, 0x12, 0x20, 0x12, 0x41, 0x0a, 0x6e, 0x22, 0x15, 0x41, 0x0a, 0x6c, + 0x6b, 0x41, 0x30, 0x72, 0x3a, 0x00, 0x00, 0x20, 0x12, 0x41, 0x09, 0x4b, + 0x21, 0x18, 0x20, 0x15, 0x21, 0x12, 0x20, 0x18, 0x0d, 0x00, 0x0b, 0x0b, + 0x02, 0x40, 0x20, 0x1a, 0x45, 0x0d, 0x00, 0x20, 0x17, 0x41, 0x00, 0x48, + 0x0d, 0x12, 0x0b, 0x20, 0x16, 0x41, 0xff, 0xff, 0x7b, 0x71, 0x20, 0x16, + 0x20, 0x1a, 0x1b, 0x21, 0x1c, 0x02, 0x40, 0x20, 0x05, 0x29, 0x03, 0x38, + 0x22, 0x1f, 0x42, 0x00, 0x52, 0x0d, 0x00, 0x41, 0x00, 0x21, 0x18, 0x20, + 0x17, 0x0d, 0x00, 0x20, 0x0f, 0x21, 0x13, 0x20, 0x0f, 0x21, 0x12, 0x0c, + 0x0c, 0x0b, 0x20, 0x17, 0x20, 0x0f, 0x20, 0x13, 0x6b, 0x20, 0x1f, 0x50, + 0x6a, 0x22, 0x12, 0x20, 0x17, 0x20, 0x12, 0x4a, 0x1b, 0x21, 0x18, 0x20, + 0x0f, 0x21, 0x12, 0x0c, 0x0b, 0x0b, 0x20, 0x05, 0x20, 0x05, 0x29, 0x03, + 0x38, 0x3c, 0x00, 0x37, 0x41, 0x00, 0x21, 0x1b, 0x41, 0x80, 0x88, 0x80, + 0x80, 0x00, 0x21, 0x1e, 0x41, 0x01, 0x21, 0x18, 0x20, 0x09, 0x21, 0x13, + 0x20, 0x0f, 0x21, 0x12, 0x0c, 0x0a, 0x0b, 0x41, 0x80, 0xa8, 0x80, 0x80, + 0x00, 0x28, 0x02, 0x00, 0x10, 0xb5, 0x80, 0x80, 0x80, 0x00, 0x21, 0x13, + 0x0c, 0x01, 0x0b, 0x20, 0x05, 0x28, 0x02, 0x38, 0x22, 0x12, 0x41, 0xab, + 0x89, 0x80, 0x80, 0x00, 0x20, 0x12, 0x1b, 0x21, 0x13, 0x0b, 0x20, 0x13, + 0x20, 0x13, 0x20, 0x17, 0x41, 0xff, 0xff, 0xff, 0xff, 0x07, 0x20, 0x17, + 0x41, 0xff, 0xff, 0xff, 0xff, 0x07, 0x49, 0x1b, 0x10, 0xc3, 0x80, 0x80, + 0x80, 0x00, 0x22, 0x18, 0x6a, 0x21, 0x12, 0x41, 0x00, 0x21, 0x1b, 0x41, + 0x80, 0x88, 0x80, 0x80, 0x00, 0x21, 0x1e, 0x20, 0x17, 0x41, 0x7f, 0x4a, + 0x0d, 0x07, 0x20, 0x12, 0x2d, 0x00, 0x00, 0x45, 0x0d, 0x07, 0x0c, 0x0d, + 0x0b, 0x20, 0x05, 0x28, 0x02, 0x38, 0x21, 0x13, 0x20, 0x17, 0x0d, 0x01, + 0x41, 0x00, 0x21, 0x12, 0x0c, 0x02, 0x0b, 0x20, 0x05, 0x41, 0x00, 0x36, + 0x02, 0x0c, 0x20, 0x05, 0x20, 0x05, 0x29, 0x03, 0x38, 0x3e, 0x02, 0x08, + 0x20, 0x05, 0x20, 0x05, 0x41, 0x08, 0x6a, 0x36, 0x02, 0x38, 0x20, 0x05, + 0x41, 0x08, 0x6a, 0x21, 0x13, 0x41, 0x7f, 0x21, 0x17, 0x0b, 0x41, 0x00, + 0x21, 0x12, 0x20, 0x13, 0x21, 0x14, 0x02, 0x40, 0x03, 0x40, 0x20, 0x14, + 0x28, 0x02, 0x00, 0x22, 0x15, 0x45, 0x0d, 0x01, 0x02, 0x40, 0x20, 0x05, + 0x41, 0x04, 0x6a, 0x20, 0x15, 0x10, 0xb7, 0x80, 0x80, 0x80, 0x00, 0x22, + 0x15, 0x41, 0x00, 0x48, 0x22, 0x18, 0x0d, 0x00, 0x20, 0x15, 0x20, 0x17, + 0x20, 0x12, 0x6b, 0x4b, 0x0d, 0x00, 0x20, 0x14, 0x41, 0x04, 0x6a, 0x21, + 0x14, 0x20, 0x15, 0x20, 0x12, 0x6a, 0x22, 0x12, 0x20, 0x17, 0x49, 0x0d, + 0x01, 0x0c, 0x02, 0x0b, 0x0b, 0x20, 0x18, 0x0d, 0x0c, 0x0b, 0x20, 0x12, + 0x41, 0x00, 0x48, 0x0d, 0x0a, 0x0b, 0x02, 0x40, 0x20, 0x16, 0x41, 0x80, + 0xc0, 0x04, 0x71, 0x22, 0x18, 0x0d, 0x00, 0x20, 0x19, 0x20, 0x12, 0x4c, + 0x0d, 0x00, 0x20, 0x05, 0x41, 0xf0, 0x00, 0x6a, 0x41, 0x20, 0x20, 0x19, + 0x20, 0x12, 0x6b, 0x22, 0x14, 0x41, 0x80, 0x02, 0x20, 0x14, 0x41, 0x80, + 0x02, 0x49, 0x22, 0x15, 0x1b, 0x10, 0xc0, 0x80, 0x80, 0x80, 0x00, 0x1a, + 0x02, 0x40, 0x20, 0x15, 0x0d, 0x00, 0x03, 0x40, 0x02, 0x40, 0x20, 0x00, + 0x2d, 0x00, 0x00, 0x41, 0x20, 0x71, 0x0d, 0x00, 0x20, 0x05, 0x41, 0xf0, + 0x00, 0x6a, 0x41, 0x80, 0x02, 0x20, 0x00, 0x10, 0xb1, 0x80, 0x80, 0x80, + 0x00, 0x1a, 0x0b, 0x20, 0x14, 0x41, 0x80, 0x7e, 0x6a, 0x22, 0x14, 0x41, + 0xff, 0x01, 0x4b, 0x0d, 0x00, 0x0b, 0x0b, 0x20, 0x00, 0x2d, 0x00, 0x00, + 0x41, 0x20, 0x71, 0x0d, 0x00, 0x20, 0x05, 0x41, 0xf0, 0x00, 0x6a, 0x20, + 0x14, 0x20, 0x00, 0x10, 0xb1, 0x80, 0x80, 0x80, 0x00, 0x1a, 0x0b, 0x02, + 0x40, 0x20, 0x12, 0x45, 0x0d, 0x00, 0x41, 0x00, 0x21, 0x14, 0x03, 0x40, + 0x20, 0x13, 0x28, 0x02, 0x00, 0x22, 0x15, 0x45, 0x0d, 0x01, 0x20, 0x05, + 0x41, 0x04, 0x6a, 0x20, 0x15, 0x10, 0xb7, 0x80, 0x80, 0x80, 0x00, 0x22, + 0x15, 0x20, 0x14, 0x6a, 0x22, 0x14, 0x20, 0x12, 0x4b, 0x0d, 0x01, 0x02, + 0x40, 0x20, 0x00, 0x2d, 0x00, 0x00, 0x41, 0x20, 0x71, 0x0d, 0x00, 0x20, + 0x05, 0x41, 0x04, 0x6a, 0x20, 0x15, 0x20, 0x00, 0x10, 0xb1, 0x80, 0x80, + 0x80, 0x00, 0x1a, 0x0b, 0x20, 0x13, 0x41, 0x04, 0x6a, 0x21, 0x13, 0x20, + 0x14, 0x20, 0x12, 0x49, 0x0d, 0x00, 0x0b, 0x0b, 0x02, 0x40, 0x20, 0x18, + 0x41, 0x80, 0xc0, 0x00, 0x47, 0x0d, 0x00, 0x20, 0x19, 0x20, 0x12, 0x4c, + 0x0d, 0x00, 0x20, 0x05, 0x41, 0xf0, 0x00, 0x6a, 0x41, 0x20, 0x20, 0x19, + 0x20, 0x12, 0x6b, 0x22, 0x14, 0x41, 0x80, 0x02, 0x20, 0x14, 0x41, 0x80, + 0x02, 0x49, 0x22, 0x15, 0x1b, 0x10, 0xc0, 0x80, 0x80, 0x80, 0x00, 0x1a, + 0x02, 0x40, 0x20, 0x15, 0x0d, 0x00, 0x03, 0x40, 0x02, 0x40, 0x20, 0x00, + 0x2d, 0x00, 0x00, 0x41, 0x20, 0x71, 0x0d, 0x00, 0x20, 0x05, 0x41, 0xf0, + 0x00, 0x6a, 0x41, 0x80, 0x02, 0x20, 0x00, 0x10, 0xb1, 0x80, 0x80, 0x80, + 0x00, 0x1a, 0x0b, 0x20, 0x14, 0x41, 0x80, 0x7e, 0x6a, 0x22, 0x14, 0x41, + 0xff, 0x01, 0x4b, 0x0d, 0x00, 0x0b, 0x0b, 0x20, 0x00, 0x2d, 0x00, 0x00, + 0x41, 0x20, 0x71, 0x0d, 0x00, 0x20, 0x05, 0x41, 0xf0, 0x00, 0x6a, 0x20, + 0x14, 0x20, 0x00, 0x10, 0xb1, 0x80, 0x80, 0x80, 0x00, 0x1a, 0x0b, 0x20, + 0x19, 0x20, 0x12, 0x20, 0x19, 0x20, 0x12, 0x4a, 0x1b, 0x21, 0x12, 0x0c, + 0x08, 0x0b, 0x02, 0x40, 0x20, 0x1a, 0x45, 0x0d, 0x00, 0x20, 0x17, 0x41, + 0x00, 0x48, 0x0d, 0x09, 0x0b, 0x20, 0x05, 0x2b, 0x03, 0x38, 0x21, 0x21, + 0x20, 0x05, 0x41, 0x00, 0x36, 0x02, 0x6c, 0x02, 0x40, 0x02, 0x40, 0x20, + 0x21, 0xbd, 0x42, 0x7f, 0x55, 0x0d, 0x00, 0x20, 0x21, 0x9a, 0x21, 0x21, + 0x41, 0x01, 0x21, 0x22, 0x41, 0x00, 0x21, 0x23, 0x41, 0x8a, 0x88, 0x80, + 0x80, 0x00, 0x21, 0x24, 0x0c, 0x01, 0x0b, 0x02, 0x40, 0x20, 0x16, 0x41, + 0x80, 0x10, 0x71, 0x45, 0x0d, 0x00, 0x41, 0x01, 0x21, 0x22, 0x41, 0x00, + 0x21, 0x23, 0x41, 0x8d, 0x88, 0x80, 0x80, 0x00, 0x21, 0x24, 0x0c, 0x01, + 0x0b, 0x41, 0x90, 0x88, 0x80, 0x80, 0x00, 0x41, 0x8b, 0x88, 0x80, 0x80, + 0x00, 0x20, 0x16, 0x41, 0x01, 0x71, 0x22, 0x22, 0x1b, 0x21, 0x24, 0x20, + 0x22, 0x45, 0x21, 0x23, 0x0b, 0x02, 0x40, 0x20, 0x21, 0xbd, 0x42, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x83, 0x42, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0xf8, 0xff, 0x00, 0x53, 0x0d, 0x00, + 0x20, 0x22, 0x41, 0x03, 0x6a, 0x21, 0x14, 0x02, 0x40, 0x20, 0x16, 0x41, + 0x80, 0xc0, 0x00, 0x71, 0x0d, 0x00, 0x20, 0x19, 0x20, 0x14, 0x4c, 0x0d, + 0x00, 0x20, 0x05, 0x41, 0xf0, 0x04, 0x6a, 0x41, 0x20, 0x20, 0x19, 0x20, + 0x14, 0x6b, 0x22, 0x12, 0x41, 0x80, 0x02, 0x20, 0x12, 0x41, 0x80, 0x02, + 0x49, 0x22, 0x15, 0x1b, 0x10, 0xc0, 0x80, 0x80, 0x80, 0x00, 0x1a, 0x02, + 0x40, 0x20, 0x15, 0x0d, 0x00, 0x03, 0x40, 0x02, 0x40, 0x20, 0x00, 0x2d, + 0x00, 0x00, 0x41, 0x20, 0x71, 0x0d, 0x00, 0x20, 0x05, 0x41, 0xf0, 0x04, + 0x6a, 0x41, 0x80, 0x02, 0x20, 0x00, 0x10, 0xb1, 0x80, 0x80, 0x80, 0x00, + 0x1a, 0x0b, 0x20, 0x12, 0x41, 0x80, 0x7e, 0x6a, 0x22, 0x12, 0x41, 0xff, + 0x01, 0x4b, 0x0d, 0x00, 0x0b, 0x0b, 0x20, 0x00, 0x2d, 0x00, 0x00, 0x41, + 0x20, 0x71, 0x0d, 0x00, 0x20, 0x05, 0x41, 0xf0, 0x04, 0x6a, 0x20, 0x12, + 0x20, 0x00, 0x10, 0xb1, 0x80, 0x80, 0x80, 0x00, 0x1a, 0x0b, 0x02, 0x40, + 0x20, 0x00, 0x28, 0x02, 0x00, 0x22, 0x12, 0x41, 0x20, 0x71, 0x0d, 0x00, + 0x20, 0x24, 0x20, 0x22, 0x20, 0x00, 0x10, 0xb1, 0x80, 0x80, 0x80, 0x00, + 0x1a, 0x20, 0x00, 0x28, 0x02, 0x00, 0x21, 0x12, 0x0b, 0x02, 0x40, 0x20, + 0x12, 0x41, 0x20, 0x71, 0x0d, 0x00, 0x41, 0x83, 0x89, 0x80, 0x80, 0x00, + 0x41, 0xa1, 0x89, 0x80, 0x80, 0x00, 0x20, 0x1d, 0x41, 0x20, 0x71, 0x22, + 0x12, 0x1b, 0x41, 0x87, 0x89, 0x80, 0x80, 0x00, 0x41, 0xa5, 0x89, 0x80, + 0x80, 0x00, 0x20, 0x12, 0x1b, 0x20, 0x21, 0x20, 0x21, 0x62, 0x1b, 0x41, + 0x03, 0x20, 0x00, 0x10, 0xb1, 0x80, 0x80, 0x80, 0x00, 0x1a, 0x0b, 0x02, + 0x40, 0x20, 0x16, 0x41, 0x80, 0xc0, 0x04, 0x71, 0x41, 0x80, 0xc0, 0x00, + 0x47, 0x0d, 0x00, 0x20, 0x19, 0x20, 0x14, 0x4c, 0x0d, 0x00, 0x20, 0x05, + 0x41, 0xf0, 0x04, 0x6a, 0x41, 0x20, 0x20, 0x19, 0x20, 0x14, 0x6b, 0x22, + 0x12, 0x41, 0x80, 0x02, 0x20, 0x12, 0x41, 0x80, 0x02, 0x49, 0x22, 0x15, + 0x1b, 0x10, 0xc0, 0x80, 0x80, 0x80, 0x00, 0x1a, 0x02, 0x40, 0x20, 0x15, + 0x0d, 0x00, 0x03, 0x40, 0x02, 0x40, 0x20, 0x00, 0x2d, 0x00, 0x00, 0x41, + 0x20, 0x71, 0x0d, 0x00, 0x20, 0x05, 0x41, 0xf0, 0x04, 0x6a, 0x41, 0x80, + 0x02, 0x20, 0x00, 0x10, 0xb1, 0x80, 0x80, 0x80, 0x00, 0x1a, 0x0b, 0x20, + 0x12, 0x41, 0x80, 0x7e, 0x6a, 0x22, 0x12, 0x41, 0xff, 0x01, 0x4b, 0x0d, + 0x00, 0x0b, 0x0b, 0x20, 0x00, 0x2d, 0x00, 0x00, 0x41, 0x20, 0x71, 0x0d, + 0x00, 0x20, 0x05, 0x41, 0xf0, 0x04, 0x6a, 0x20, 0x12, 0x20, 0x00, 0x10, + 0xb1, 0x80, 0x80, 0x80, 0x00, 0x1a, 0x0b, 0x20, 0x14, 0x20, 0x19, 0x20, + 0x14, 0x20, 0x19, 0x4a, 0x1b, 0x21, 0x12, 0x0c, 0x08, 0x0b, 0x02, 0x40, + 0x02, 0x40, 0x02, 0x40, 0x20, 0x21, 0x20, 0x05, 0x41, 0xec, 0x00, 0x6a, + 0x10, 0xb8, 0x80, 0x80, 0x80, 0x00, 0x22, 0x21, 0x20, 0x21, 0xa0, 0x22, + 0x21, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x61, 0x0d, + 0x00, 0x20, 0x05, 0x20, 0x05, 0x28, 0x02, 0x6c, 0x22, 0x12, 0x41, 0x7f, + 0x6a, 0x36, 0x02, 0x6c, 0x20, 0x1d, 0x41, 0x20, 0x72, 0x22, 0x25, 0x41, + 0xe1, 0x00, 0x47, 0x0d, 0x01, 0x0c, 0x08, 0x0b, 0x20, 0x1d, 0x41, 0x20, + 0x72, 0x22, 0x25, 0x41, 0xe1, 0x00, 0x46, 0x0d, 0x07, 0x41, 0x06, 0x20, + 0x17, 0x20, 0x17, 0x41, 0x00, 0x48, 0x1b, 0x21, 0x1a, 0x20, 0x05, 0x28, + 0x02, 0x6c, 0x21, 0x13, 0x0c, 0x01, 0x0b, 0x20, 0x05, 0x20, 0x12, 0x41, + 0x63, 0x6a, 0x22, 0x13, 0x36, 0x02, 0x6c, 0x41, 0x06, 0x20, 0x17, 0x20, + 0x17, 0x41, 0x00, 0x48, 0x1b, 0x21, 0x1a, 0x20, 0x21, 0x44, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xb0, 0x41, 0xa2, 0x21, 0x21, 0x0b, 0x20, 0x05, + 0x41, 0xf0, 0x00, 0x6a, 0x41, 0x00, 0x41, 0xc8, 0x00, 0x20, 0x13, 0x41, + 0x00, 0x48, 0x22, 0x26, 0x1b, 0x41, 0x02, 0x74, 0x22, 0x27, 0x6a, 0x22, + 0x1e, 0x21, 0x14, 0x03, 0x40, 0x02, 0x40, 0x02, 0x40, 0x20, 0x21, 0x44, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x41, 0x63, 0x20, 0x21, 0x44, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x71, 0x45, 0x0d, + 0x00, 0x20, 0x21, 0xab, 0x21, 0x12, 0x0c, 0x01, 0x0b, 0x41, 0x00, 0x21, + 0x12, 0x0b, 0x20, 0x14, 0x20, 0x12, 0x36, 0x02, 0x00, 0x20, 0x14, 0x41, + 0x04, 0x6a, 0x21, 0x14, 0x20, 0x21, 0x20, 0x12, 0xb8, 0xa1, 0x44, 0x00, + 0x00, 0x00, 0x00, 0x65, 0xcd, 0xcd, 0x41, 0xa2, 0x22, 0x21, 0x44, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x62, 0x0d, 0x00, 0x0b, 0x02, + 0x40, 0x02, 0x40, 0x20, 0x13, 0x41, 0x01, 0x4e, 0x0d, 0x00, 0x20, 0x14, + 0x21, 0x12, 0x20, 0x1e, 0x21, 0x15, 0x0c, 0x01, 0x0b, 0x20, 0x1e, 0x21, + 0x15, 0x03, 0x40, 0x20, 0x13, 0x41, 0x1d, 0x20, 0x13, 0x41, 0x1d, 0x48, + 0x1b, 0x21, 0x13, 0x02, 0x40, 0x20, 0x14, 0x41, 0x7c, 0x6a, 0x22, 0x12, + 0x20, 0x15, 0x49, 0x0d, 0x00, 0x20, 0x13, 0xad, 0x21, 0x20, 0x42, 0x00, + 0x21, 0x1f, 0x03, 0x40, 0x20, 0x12, 0x20, 0x12, 0x35, 0x02, 0x00, 0x20, + 0x20, 0x86, 0x20, 0x1f, 0x42, 0xff, 0xff, 0xff, 0xff, 0x0f, 0x83, 0x7c, + 0x22, 0x1f, 0x20, 0x1f, 0x42, 0x80, 0x94, 0xeb, 0xdc, 0x03, 0x80, 0x22, + 0x1f, 0x42, 0x80, 0x94, 0xeb, 0xdc, 0x03, 0x7e, 0x7d, 0x3e, 0x02, 0x00, + 0x20, 0x12, 0x41, 0x7c, 0x6a, 0x22, 0x12, 0x20, 0x15, 0x4f, 0x0d, 0x00, + 0x0b, 0x20, 0x1f, 0xa7, 0x22, 0x12, 0x45, 0x0d, 0x00, 0x20, 0x15, 0x41, + 0x7c, 0x6a, 0x22, 0x15, 0x20, 0x12, 0x36, 0x02, 0x00, 0x0b, 0x02, 0x40, + 0x03, 0x40, 0x20, 0x14, 0x22, 0x12, 0x20, 0x15, 0x4d, 0x0d, 0x01, 0x20, + 0x12, 0x41, 0x7c, 0x6a, 0x22, 0x14, 0x28, 0x02, 0x00, 0x45, 0x0d, 0x00, + 0x0b, 0x0b, 0x20, 0x05, 0x20, 0x05, 0x28, 0x02, 0x6c, 0x20, 0x13, 0x6b, + 0x22, 0x13, 0x36, 0x02, 0x6c, 0x20, 0x12, 0x21, 0x14, 0x20, 0x13, 0x41, + 0x00, 0x4a, 0x0d, 0x00, 0x0b, 0x0b, 0x02, 0x40, 0x20, 0x13, 0x41, 0x7f, + 0x4a, 0x0d, 0x00, 0x20, 0x1a, 0x41, 0x19, 0x6a, 0x41, 0x09, 0x6e, 0x41, + 0x01, 0x6a, 0x21, 0x28, 0x03, 0x40, 0x41, 0x00, 0x20, 0x13, 0x6b, 0x22, + 0x14, 0x41, 0x09, 0x20, 0x14, 0x41, 0x09, 0x48, 0x1b, 0x21, 0x17, 0x02, + 0x40, 0x02, 0x40, 0x20, 0x15, 0x20, 0x12, 0x49, 0x0d, 0x00, 0x20, 0x15, + 0x28, 0x02, 0x00, 0x21, 0x14, 0x0c, 0x01, 0x0b, 0x41, 0x80, 0x94, 0xeb, + 0xdc, 0x03, 0x20, 0x17, 0x76, 0x21, 0x1c, 0x41, 0x7f, 0x20, 0x17, 0x74, + 0x41, 0x7f, 0x73, 0x21, 0x1b, 0x41, 0x00, 0x21, 0x13, 0x20, 0x15, 0x21, + 0x14, 0x03, 0x40, 0x20, 0x14, 0x20, 0x14, 0x28, 0x02, 0x00, 0x22, 0x18, + 0x20, 0x17, 0x76, 0x20, 0x13, 0x6a, 0x36, 0x02, 0x00, 0x20, 0x18, 0x20, + 0x1b, 0x71, 0x20, 0x1c, 0x6c, 0x21, 0x13, 0x20, 0x14, 0x41, 0x04, 0x6a, + 0x22, 0x14, 0x20, 0x12, 0x49, 0x0d, 0x00, 0x0b, 0x20, 0x15, 0x28, 0x02, + 0x00, 0x21, 0x14, 0x20, 0x13, 0x45, 0x0d, 0x00, 0x20, 0x12, 0x20, 0x13, + 0x36, 0x02, 0x00, 0x20, 0x12, 0x41, 0x04, 0x6a, 0x21, 0x12, 0x0b, 0x20, + 0x05, 0x20, 0x05, 0x28, 0x02, 0x6c, 0x20, 0x17, 0x6a, 0x22, 0x13, 0x36, + 0x02, 0x6c, 0x20, 0x1e, 0x20, 0x15, 0x20, 0x14, 0x45, 0x41, 0x02, 0x74, + 0x6a, 0x22, 0x15, 0x20, 0x25, 0x41, 0xe6, 0x00, 0x46, 0x1b, 0x22, 0x14, + 0x20, 0x28, 0x41, 0x02, 0x74, 0x6a, 0x20, 0x12, 0x20, 0x12, 0x20, 0x14, + 0x6b, 0x41, 0x02, 0x75, 0x20, 0x28, 0x4a, 0x1b, 0x21, 0x12, 0x20, 0x13, + 0x41, 0x00, 0x48, 0x0d, 0x00, 0x0b, 0x0b, 0x41, 0x00, 0x21, 0x18, 0x02, + 0x40, 0x20, 0x15, 0x20, 0x12, 0x4f, 0x0d, 0x00, 0x20, 0x1e, 0x20, 0x15, + 0x6b, 0x41, 0x02, 0x75, 0x41, 0x09, 0x6c, 0x21, 0x18, 0x20, 0x15, 0x28, + 0x02, 0x00, 0x22, 0x13, 0x41, 0x0a, 0x49, 0x0d, 0x00, 0x41, 0x0a, 0x21, + 0x14, 0x03, 0x40, 0x20, 0x18, 0x41, 0x01, 0x6a, 0x21, 0x18, 0x20, 0x13, + 0x20, 0x14, 0x41, 0x0a, 0x6c, 0x22, 0x14, 0x4f, 0x0d, 0x00, 0x0b, 0x0b, + 0x02, 0x40, 0x20, 0x1a, 0x41, 0x00, 0x20, 0x18, 0x20, 0x25, 0x41, 0xe6, + 0x00, 0x46, 0x1b, 0x6b, 0x20, 0x1a, 0x41, 0x00, 0x47, 0x20, 0x25, 0x41, + 0xe7, 0x00, 0x46, 0x22, 0x1b, 0x71, 0x6b, 0x22, 0x14, 0x20, 0x12, 0x20, + 0x1e, 0x6b, 0x41, 0x02, 0x75, 0x41, 0x09, 0x6c, 0x41, 0x77, 0x6a, 0x4e, + 0x0d, 0x00, 0x20, 0x14, 0x41, 0x80, 0xc8, 0x00, 0x6a, 0x22, 0x13, 0x41, + 0x09, 0x6d, 0x22, 0x17, 0x41, 0x02, 0x74, 0x22, 0x29, 0x20, 0x05, 0x41, + 0xf0, 0x00, 0x6a, 0x41, 0x01, 0x41, 0xc9, 0x00, 0x20, 0x26, 0x1b, 0x41, + 0x02, 0x74, 0x22, 0x26, 0x6a, 0x6a, 0x41, 0x80, 0x60, 0x6a, 0x21, 0x1c, + 0x41, 0x0a, 0x21, 0x14, 0x02, 0x40, 0x20, 0x13, 0x20, 0x17, 0x41, 0x09, + 0x6c, 0x6b, 0x22, 0x17, 0x41, 0x07, 0x4a, 0x0d, 0x00, 0x41, 0x08, 0x20, + 0x17, 0x6b, 0x22, 0x28, 0x41, 0x07, 0x71, 0x21, 0x13, 0x41, 0x0a, 0x21, + 0x14, 0x02, 0x40, 0x20, 0x17, 0x41, 0x7f, 0x6a, 0x41, 0x07, 0x49, 0x0d, + 0x00, 0x20, 0x28, 0x41, 0x78, 0x71, 0x21, 0x17, 0x41, 0x0a, 0x21, 0x14, + 0x03, 0x40, 0x20, 0x14, 0x41, 0x80, 0xc2, 0xd7, 0x2f, 0x6c, 0x21, 0x14, + 0x20, 0x17, 0x41, 0x78, 0x6a, 0x22, 0x17, 0x0d, 0x00, 0x0b, 0x0b, 0x20, + 0x13, 0x45, 0x0d, 0x00, 0x03, 0x40, 0x20, 0x14, 0x41, 0x0a, 0x6c, 0x21, + 0x14, 0x20, 0x13, 0x41, 0x7f, 0x6a, 0x22, 0x13, 0x0d, 0x00, 0x0b, 0x0b, + 0x20, 0x1c, 0x41, 0x04, 0x6a, 0x21, 0x28, 0x02, 0x40, 0x02, 0x40, 0x20, + 0x1c, 0x28, 0x02, 0x00, 0x22, 0x13, 0x20, 0x13, 0x20, 0x14, 0x6e, 0x22, + 0x25, 0x20, 0x14, 0x6c, 0x6b, 0x22, 0x17, 0x0d, 0x00, 0x20, 0x28, 0x20, + 0x12, 0x46, 0x0d, 0x01, 0x0b, 0x02, 0x40, 0x02, 0x40, 0x20, 0x25, 0x41, + 0x01, 0x71, 0x0d, 0x00, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, + 0x43, 0x21, 0x21, 0x20, 0x14, 0x41, 0x80, 0x94, 0xeb, 0xdc, 0x03, 0x47, + 0x0d, 0x01, 0x20, 0x1c, 0x20, 0x15, 0x4d, 0x0d, 0x01, 0x20, 0x1c, 0x41, + 0x7c, 0x6a, 0x2d, 0x00, 0x00, 0x41, 0x01, 0x71, 0x45, 0x0d, 0x01, 0x0b, + 0x44, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x43, 0x21, 0x21, 0x0b, + 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x3f, 0x44, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xf0, 0x3f, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xf8, 0x3f, 0x20, 0x28, 0x20, 0x12, 0x46, 0x1b, 0x44, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xf8, 0x3f, 0x20, 0x17, 0x20, 0x14, 0x41, 0x01, + 0x76, 0x22, 0x28, 0x46, 0x1b, 0x20, 0x17, 0x20, 0x28, 0x49, 0x1b, 0x21, + 0x2a, 0x02, 0x40, 0x20, 0x23, 0x0d, 0x00, 0x20, 0x24, 0x2d, 0x00, 0x00, + 0x41, 0x2d, 0x47, 0x0d, 0x00, 0x20, 0x2a, 0x9a, 0x21, 0x2a, 0x20, 0x21, + 0x9a, 0x21, 0x21, 0x0b, 0x20, 0x1c, 0x20, 0x13, 0x20, 0x17, 0x6b, 0x22, + 0x13, 0x36, 0x02, 0x00, 0x20, 0x21, 0x20, 0x2a, 0xa0, 0x20, 0x21, 0x61, + 0x0d, 0x00, 0x20, 0x1c, 0x20, 0x13, 0x20, 0x14, 0x6a, 0x22, 0x14, 0x36, + 0x02, 0x00, 0x02, 0x40, 0x20, 0x14, 0x41, 0x80, 0x94, 0xeb, 0xdc, 0x03, + 0x49, 0x0d, 0x00, 0x20, 0x08, 0x20, 0x26, 0x20, 0x29, 0x6a, 0x6a, 0x21, + 0x14, 0x03, 0x40, 0x20, 0x14, 0x41, 0x04, 0x6a, 0x41, 0x00, 0x36, 0x02, + 0x00, 0x02, 0x40, 0x20, 0x14, 0x20, 0x15, 0x4f, 0x0d, 0x00, 0x20, 0x15, + 0x41, 0x7c, 0x6a, 0x22, 0x15, 0x41, 0x00, 0x36, 0x02, 0x00, 0x0b, 0x20, + 0x14, 0x20, 0x14, 0x28, 0x02, 0x00, 0x41, 0x01, 0x6a, 0x22, 0x13, 0x36, + 0x02, 0x00, 0x20, 0x14, 0x41, 0x7c, 0x6a, 0x21, 0x14, 0x20, 0x13, 0x41, + 0xff, 0x93, 0xeb, 0xdc, 0x03, 0x4b, 0x0d, 0x00, 0x0b, 0x20, 0x14, 0x41, + 0x04, 0x6a, 0x21, 0x1c, 0x0b, 0x20, 0x1e, 0x20, 0x15, 0x6b, 0x41, 0x02, + 0x75, 0x41, 0x09, 0x6c, 0x21, 0x18, 0x20, 0x15, 0x28, 0x02, 0x00, 0x22, + 0x13, 0x41, 0x0a, 0x49, 0x0d, 0x00, 0x41, 0x0a, 0x21, 0x14, 0x03, 0x40, + 0x20, 0x18, 0x41, 0x01, 0x6a, 0x21, 0x18, 0x20, 0x13, 0x20, 0x14, 0x41, + 0x0a, 0x6c, 0x22, 0x14, 0x4f, 0x0d, 0x00, 0x0b, 0x0b, 0x20, 0x1c, 0x41, + 0x04, 0x6a, 0x22, 0x14, 0x20, 0x12, 0x20, 0x12, 0x20, 0x14, 0x4b, 0x1b, + 0x21, 0x12, 0x0b, 0x20, 0x07, 0x20, 0x12, 0x6a, 0x20, 0x27, 0x6b, 0x21, + 0x14, 0x02, 0x40, 0x03, 0x40, 0x20, 0x14, 0x21, 0x13, 0x20, 0x12, 0x22, + 0x1c, 0x20, 0x15, 0x4d, 0x22, 0x17, 0x0d, 0x01, 0x20, 0x13, 0x41, 0x7c, + 0x6a, 0x21, 0x14, 0x20, 0x1c, 0x41, 0x7c, 0x6a, 0x22, 0x12, 0x28, 0x02, + 0x00, 0x45, 0x0d, 0x00, 0x0b, 0x0b, 0x02, 0x40, 0x02, 0x40, 0x20, 0x1b, + 0x0d, 0x00, 0x20, 0x16, 0x41, 0x08, 0x71, 0x21, 0x28, 0x0c, 0x01, 0x0b, + 0x20, 0x18, 0x41, 0x7f, 0x73, 0x41, 0x7f, 0x20, 0x1a, 0x41, 0x01, 0x20, + 0x1a, 0x1b, 0x22, 0x12, 0x20, 0x18, 0x4a, 0x20, 0x18, 0x41, 0x7b, 0x4a, + 0x71, 0x22, 0x14, 0x1b, 0x20, 0x12, 0x6a, 0x21, 0x1a, 0x41, 0x7f, 0x41, + 0x7e, 0x20, 0x14, 0x1b, 0x20, 0x1d, 0x6a, 0x21, 0x1d, 0x20, 0x16, 0x41, + 0x08, 0x71, 0x22, 0x28, 0x0d, 0x00, 0x41, 0x77, 0x21, 0x12, 0x02, 0x40, + 0x20, 0x17, 0x0d, 0x00, 0x20, 0x1c, 0x41, 0x7c, 0x6a, 0x28, 0x02, 0x00, + 0x22, 0x17, 0x45, 0x0d, 0x00, 0x41, 0x00, 0x21, 0x12, 0x20, 0x17, 0x41, + 0x0a, 0x70, 0x0d, 0x00, 0x41, 0x0a, 0x21, 0x14, 0x41, 0x00, 0x21, 0x12, + 0x03, 0x40, 0x20, 0x12, 0x41, 0x7f, 0x6a, 0x21, 0x12, 0x20, 0x17, 0x20, + 0x14, 0x41, 0x0a, 0x6c, 0x22, 0x14, 0x70, 0x45, 0x0d, 0x00, 0x0b, 0x0b, + 0x20, 0x13, 0x41, 0x02, 0x75, 0x41, 0x09, 0x6c, 0x21, 0x14, 0x02, 0x40, + 0x20, 0x1d, 0x41, 0x5f, 0x71, 0x41, 0xc6, 0x00, 0x47, 0x0d, 0x00, 0x41, + 0x00, 0x21, 0x28, 0x20, 0x1a, 0x20, 0x14, 0x20, 0x12, 0x6a, 0x41, 0x77, + 0x6a, 0x22, 0x12, 0x41, 0x00, 0x20, 0x12, 0x41, 0x00, 0x4a, 0x1b, 0x22, + 0x12, 0x20, 0x1a, 0x20, 0x12, 0x48, 0x1b, 0x21, 0x1a, 0x0c, 0x01, 0x0b, + 0x41, 0x00, 0x21, 0x28, 0x20, 0x1a, 0x20, 0x18, 0x20, 0x14, 0x6a, 0x20, + 0x12, 0x6a, 0x41, 0x77, 0x6a, 0x22, 0x12, 0x41, 0x00, 0x20, 0x12, 0x41, + 0x00, 0x4a, 0x1b, 0x22, 0x12, 0x20, 0x1a, 0x20, 0x12, 0x48, 0x1b, 0x21, + 0x1a, 0x0b, 0x20, 0x1a, 0x41, 0xfd, 0xff, 0xff, 0xff, 0x07, 0x41, 0xfe, + 0xff, 0xff, 0xff, 0x07, 0x20, 0x1a, 0x20, 0x28, 0x72, 0x22, 0x23, 0x1b, + 0x4a, 0x0d, 0x08, 0x20, 0x1a, 0x20, 0x23, 0x41, 0x00, 0x47, 0x6a, 0x41, + 0x01, 0x6a, 0x21, 0x25, 0x02, 0x40, 0x02, 0x40, 0x20, 0x1d, 0x41, 0x5f, + 0x71, 0x41, 0xc6, 0x00, 0x47, 0x22, 0x26, 0x0d, 0x00, 0x20, 0x18, 0x20, + 0x25, 0x41, 0xff, 0xff, 0xff, 0xff, 0x07, 0x73, 0x4a, 0x0d, 0x0a, 0x20, + 0x18, 0x41, 0x00, 0x20, 0x18, 0x41, 0x00, 0x4a, 0x1b, 0x21, 0x12, 0x0c, + 0x01, 0x0b, 0x02, 0x40, 0x02, 0x40, 0x20, 0x18, 0x0d, 0x00, 0x20, 0x06, + 0x21, 0x13, 0x20, 0x06, 0x21, 0x14, 0x0c, 0x01, 0x0b, 0x20, 0x18, 0x20, + 0x18, 0x41, 0x1f, 0x75, 0x22, 0x12, 0x73, 0x20, 0x12, 0x6b, 0x21, 0x12, + 0x20, 0x06, 0x21, 0x13, 0x20, 0x06, 0x21, 0x14, 0x03, 0x40, 0x20, 0x14, + 0x41, 0x7f, 0x6a, 0x22, 0x14, 0x20, 0x12, 0x20, 0x12, 0x41, 0x0a, 0x6e, + 0x22, 0x17, 0x41, 0x0a, 0x6c, 0x6b, 0x41, 0x30, 0x72, 0x3a, 0x00, 0x00, + 0x20, 0x13, 0x41, 0x7f, 0x6a, 0x21, 0x13, 0x20, 0x12, 0x41, 0x09, 0x4b, + 0x21, 0x1b, 0x20, 0x17, 0x21, 0x12, 0x20, 0x1b, 0x0d, 0x00, 0x0b, 0x0b, + 0x02, 0x40, 0x20, 0x06, 0x20, 0x13, 0x6b, 0x41, 0x01, 0x4a, 0x0d, 0x00, + 0x20, 0x14, 0x20, 0x0e, 0x20, 0x13, 0x6b, 0x6a, 0x22, 0x14, 0x41, 0x30, + 0x20, 0x13, 0x20, 0x05, 0x41, 0xc4, 0x00, 0x6a, 0x6b, 0x41, 0x76, 0x6a, + 0x10, 0xc0, 0x80, 0x80, 0x80, 0x00, 0x1a, 0x0b, 0x20, 0x14, 0x41, 0x7e, + 0x6a, 0x22, 0x27, 0x20, 0x1d, 0x3a, 0x00, 0x00, 0x20, 0x14, 0x41, 0x7f, + 0x6a, 0x41, 0x2d, 0x41, 0x2b, 0x20, 0x18, 0x41, 0x00, 0x48, 0x1b, 0x3a, + 0x00, 0x00, 0x20, 0x06, 0x20, 0x27, 0x6b, 0x22, 0x12, 0x20, 0x25, 0x41, + 0xff, 0xff, 0xff, 0xff, 0x07, 0x73, 0x4a, 0x0d, 0x09, 0x0b, 0x20, 0x12, + 0x20, 0x25, 0x6a, 0x22, 0x12, 0x20, 0x22, 0x41, 0xff, 0xff, 0xff, 0xff, + 0x07, 0x73, 0x4a, 0x0d, 0x08, 0x20, 0x12, 0x20, 0x22, 0x6a, 0x21, 0x1b, + 0x02, 0x40, 0x20, 0x16, 0x41, 0x80, 0xc0, 0x04, 0x71, 0x22, 0x16, 0x0d, + 0x00, 0x20, 0x19, 0x20, 0x1b, 0x4c, 0x0d, 0x00, 0x20, 0x05, 0x41, 0xf0, + 0x04, 0x6a, 0x41, 0x20, 0x20, 0x19, 0x20, 0x1b, 0x6b, 0x22, 0x12, 0x41, + 0x80, 0x02, 0x20, 0x12, 0x41, 0x80, 0x02, 0x49, 0x22, 0x14, 0x1b, 0x10, + 0xc0, 0x80, 0x80, 0x80, 0x00, 0x1a, 0x02, 0x40, 0x20, 0x14, 0x0d, 0x00, + 0x03, 0x40, 0x02, 0x40, 0x20, 0x00, 0x2d, 0x00, 0x00, 0x41, 0x20, 0x71, + 0x0d, 0x00, 0x20, 0x05, 0x41, 0xf0, 0x04, 0x6a, 0x41, 0x80, 0x02, 0x20, + 0x00, 0x10, 0xb1, 0x80, 0x80, 0x80, 0x00, 0x1a, 0x0b, 0x20, 0x12, 0x41, + 0x80, 0x7e, 0x6a, 0x22, 0x12, 0x41, 0xff, 0x01, 0x4b, 0x0d, 0x00, 0x0b, + 0x0b, 0x20, 0x00, 0x2d, 0x00, 0x00, 0x41, 0x20, 0x71, 0x0d, 0x00, 0x20, + 0x05, 0x41, 0xf0, 0x04, 0x6a, 0x20, 0x12, 0x20, 0x00, 0x10, 0xb1, 0x80, + 0x80, 0x80, 0x00, 0x1a, 0x0b, 0x02, 0x40, 0x20, 0x00, 0x2d, 0x00, 0x00, + 0x41, 0x20, 0x71, 0x0d, 0x00, 0x20, 0x24, 0x20, 0x22, 0x20, 0x00, 0x10, + 0xb1, 0x80, 0x80, 0x80, 0x00, 0x1a, 0x0b, 0x02, 0x40, 0x20, 0x16, 0x41, + 0x80, 0x80, 0x04, 0x47, 0x0d, 0x00, 0x20, 0x19, 0x20, 0x1b, 0x4c, 0x0d, + 0x00, 0x20, 0x05, 0x41, 0xf0, 0x04, 0x6a, 0x41, 0x30, 0x20, 0x19, 0x20, + 0x1b, 0x6b, 0x22, 0x12, 0x41, 0x80, 0x02, 0x20, 0x12, 0x41, 0x80, 0x02, + 0x49, 0x22, 0x14, 0x1b, 0x10, 0xc0, 0x80, 0x80, 0x80, 0x00, 0x1a, 0x02, + 0x40, 0x20, 0x14, 0x0d, 0x00, 0x03, 0x40, 0x02, 0x40, 0x20, 0x00, 0x2d, + 0x00, 0x00, 0x41, 0x20, 0x71, 0x0d, 0x00, 0x20, 0x05, 0x41, 0xf0, 0x04, + 0x6a, 0x41, 0x80, 0x02, 0x20, 0x00, 0x10, 0xb1, 0x80, 0x80, 0x80, 0x00, + 0x1a, 0x0b, 0x20, 0x12, 0x41, 0x80, 0x7e, 0x6a, 0x22, 0x12, 0x41, 0xff, + 0x01, 0x4b, 0x0d, 0x00, 0x0b, 0x0b, 0x20, 0x00, 0x2d, 0x00, 0x00, 0x41, + 0x20, 0x71, 0x0d, 0x00, 0x20, 0x05, 0x41, 0xf0, 0x04, 0x6a, 0x20, 0x12, + 0x20, 0x00, 0x10, 0xb1, 0x80, 0x80, 0x80, 0x00, 0x1a, 0x0b, 0x20, 0x26, + 0x0d, 0x03, 0x20, 0x1e, 0x20, 0x15, 0x20, 0x15, 0x20, 0x1e, 0x4b, 0x1b, + 0x22, 0x18, 0x21, 0x17, 0x03, 0x40, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, + 0x02, 0x40, 0x20, 0x17, 0x28, 0x02, 0x00, 0x22, 0x12, 0x45, 0x0d, 0x00, + 0x41, 0x08, 0x21, 0x14, 0x03, 0x40, 0x20, 0x05, 0x41, 0xd0, 0x00, 0x6a, + 0x20, 0x14, 0x6a, 0x20, 0x12, 0x20, 0x12, 0x41, 0x0a, 0x6e, 0x22, 0x15, + 0x41, 0x0a, 0x6c, 0x6b, 0x41, 0x30, 0x72, 0x3a, 0x00, 0x00, 0x20, 0x14, + 0x41, 0x7f, 0x6a, 0x21, 0x14, 0x20, 0x12, 0x41, 0x09, 0x4b, 0x21, 0x13, + 0x20, 0x15, 0x21, 0x12, 0x20, 0x13, 0x0d, 0x00, 0x0b, 0x20, 0x14, 0x41, + 0x01, 0x6a, 0x22, 0x15, 0x20, 0x05, 0x41, 0xd0, 0x00, 0x6a, 0x6a, 0x21, + 0x12, 0x02, 0x40, 0x20, 0x17, 0x20, 0x18, 0x46, 0x0d, 0x00, 0x20, 0x14, + 0x41, 0x02, 0x6a, 0x41, 0x02, 0x48, 0x0d, 0x04, 0x0c, 0x03, 0x0b, 0x20, + 0x14, 0x41, 0x08, 0x47, 0x0d, 0x03, 0x0c, 0x01, 0x0b, 0x41, 0x09, 0x21, + 0x15, 0x20, 0x17, 0x20, 0x18, 0x47, 0x0d, 0x01, 0x0b, 0x20, 0x05, 0x41, + 0x30, 0x3a, 0x00, 0x58, 0x20, 0x0c, 0x21, 0x12, 0x0c, 0x01, 0x0b, 0x20, + 0x05, 0x41, 0xd0, 0x00, 0x6a, 0x20, 0x0b, 0x20, 0x15, 0x6a, 0x22, 0x12, + 0x20, 0x05, 0x41, 0xd0, 0x00, 0x6a, 0x20, 0x12, 0x49, 0x1b, 0x22, 0x12, + 0x41, 0x30, 0x20, 0x15, 0x20, 0x05, 0x41, 0xd0, 0x00, 0x6a, 0x6a, 0x20, + 0x12, 0x6b, 0x10, 0xc0, 0x80, 0x80, 0x80, 0x00, 0x1a, 0x0b, 0x02, 0x40, + 0x20, 0x00, 0x2d, 0x00, 0x00, 0x41, 0x20, 0x71, 0x0d, 0x00, 0x20, 0x12, + 0x20, 0x0d, 0x20, 0x12, 0x6b, 0x20, 0x00, 0x10, 0xb1, 0x80, 0x80, 0x80, + 0x00, 0x1a, 0x0b, 0x20, 0x17, 0x41, 0x04, 0x6a, 0x22, 0x17, 0x20, 0x1e, + 0x4d, 0x0d, 0x00, 0x0b, 0x02, 0x40, 0x20, 0x23, 0x45, 0x0d, 0x00, 0x20, + 0x00, 0x2d, 0x00, 0x00, 0x41, 0x20, 0x71, 0x0d, 0x00, 0x41, 0xa9, 0x89, + 0x80, 0x80, 0x00, 0x41, 0x01, 0x20, 0x00, 0x10, 0xb1, 0x80, 0x80, 0x80, + 0x00, 0x1a, 0x0b, 0x02, 0x40, 0x02, 0x40, 0x20, 0x1a, 0x41, 0x01, 0x4e, + 0x0d, 0x00, 0x20, 0x1a, 0x21, 0x12, 0x0c, 0x01, 0x0b, 0x02, 0x40, 0x20, + 0x17, 0x20, 0x1c, 0x49, 0x0d, 0x00, 0x20, 0x1a, 0x21, 0x12, 0x0c, 0x01, + 0x0b, 0x03, 0x40, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, 0x20, 0x17, 0x28, + 0x02, 0x00, 0x22, 0x12, 0x0d, 0x00, 0x20, 0x0d, 0x21, 0x14, 0x20, 0x0d, + 0x21, 0x15, 0x0c, 0x01, 0x0b, 0x20, 0x0d, 0x21, 0x15, 0x20, 0x0d, 0x21, + 0x14, 0x03, 0x40, 0x20, 0x14, 0x41, 0x7f, 0x6a, 0x22, 0x14, 0x20, 0x12, + 0x20, 0x12, 0x41, 0x0a, 0x6e, 0x22, 0x13, 0x41, 0x0a, 0x6c, 0x6b, 0x41, + 0x30, 0x72, 0x3a, 0x00, 0x00, 0x20, 0x15, 0x41, 0x7f, 0x6a, 0x21, 0x15, + 0x20, 0x12, 0x41, 0x09, 0x4b, 0x21, 0x18, 0x20, 0x13, 0x21, 0x12, 0x20, + 0x18, 0x0d, 0x00, 0x0b, 0x20, 0x14, 0x20, 0x05, 0x41, 0xd0, 0x00, 0x6a, + 0x4d, 0x0d, 0x01, 0x0b, 0x20, 0x14, 0x20, 0x05, 0x41, 0xd0, 0x00, 0x6a, + 0x6a, 0x20, 0x15, 0x6b, 0x22, 0x14, 0x41, 0x30, 0x20, 0x15, 0x20, 0x05, + 0x41, 0xd0, 0x00, 0x6a, 0x6b, 0x10, 0xc0, 0x80, 0x80, 0x80, 0x00, 0x1a, + 0x0b, 0x02, 0x40, 0x20, 0x00, 0x2d, 0x00, 0x00, 0x41, 0x20, 0x71, 0x0d, + 0x00, 0x20, 0x14, 0x20, 0x1a, 0x41, 0x09, 0x20, 0x1a, 0x41, 0x09, 0x48, + 0x1b, 0x20, 0x00, 0x10, 0xb1, 0x80, 0x80, 0x80, 0x00, 0x1a, 0x0b, 0x20, + 0x1a, 0x41, 0x77, 0x6a, 0x21, 0x12, 0x20, 0x17, 0x41, 0x04, 0x6a, 0x22, + 0x17, 0x20, 0x1c, 0x4f, 0x0d, 0x01, 0x20, 0x1a, 0x41, 0x09, 0x4a, 0x21, + 0x14, 0x20, 0x12, 0x21, 0x1a, 0x20, 0x14, 0x0d, 0x00, 0x0b, 0x0b, 0x20, + 0x00, 0x41, 0x30, 0x20, 0x12, 0x41, 0x09, 0x6a, 0x41, 0x09, 0x41, 0x00, + 0x10, 0xbd, 0x80, 0x80, 0x80, 0x00, 0x0c, 0x04, 0x0b, 0x41, 0x80, 0xa8, + 0x80, 0x80, 0x00, 0x41, 0x1c, 0x36, 0x02, 0x00, 0x0c, 0x08, 0x0b, 0x41, + 0x00, 0x21, 0x1b, 0x41, 0x80, 0x88, 0x80, 0x80, 0x00, 0x21, 0x1e, 0x20, + 0x0f, 0x21, 0x12, 0x20, 0x16, 0x21, 0x1c, 0x20, 0x17, 0x21, 0x18, 0x0b, + 0x20, 0x18, 0x20, 0x12, 0x20, 0x13, 0x6b, 0x22, 0x17, 0x20, 0x18, 0x20, + 0x17, 0x4a, 0x1b, 0x22, 0x1a, 0x20, 0x1b, 0x41, 0xff, 0xff, 0xff, 0xff, + 0x07, 0x73, 0x4a, 0x0d, 0x05, 0x20, 0x19, 0x20, 0x1b, 0x20, 0x1a, 0x6a, + 0x22, 0x15, 0x20, 0x19, 0x20, 0x15, 0x4a, 0x1b, 0x22, 0x12, 0x20, 0x14, + 0x4a, 0x0d, 0x05, 0x02, 0x40, 0x20, 0x1c, 0x41, 0x80, 0xc0, 0x04, 0x71, + 0x22, 0x1c, 0x0d, 0x00, 0x20, 0x15, 0x20, 0x19, 0x4e, 0x0d, 0x00, 0x20, + 0x05, 0x41, 0xf0, 0x00, 0x6a, 0x41, 0x20, 0x20, 0x12, 0x20, 0x15, 0x6b, + 0x22, 0x14, 0x41, 0x80, 0x02, 0x20, 0x14, 0x41, 0x80, 0x02, 0x49, 0x22, + 0x16, 0x1b, 0x10, 0xc0, 0x80, 0x80, 0x80, 0x00, 0x1a, 0x02, 0x40, 0x20, + 0x16, 0x0d, 0x00, 0x03, 0x40, 0x02, 0x40, 0x20, 0x00, 0x2d, 0x00, 0x00, + 0x41, 0x20, 0x71, 0x0d, 0x00, 0x20, 0x05, 0x41, 0xf0, 0x00, 0x6a, 0x41, + 0x80, 0x02, 0x20, 0x00, 0x10, 0xb1, 0x80, 0x80, 0x80, 0x00, 0x1a, 0x0b, + 0x20, 0x14, 0x41, 0x80, 0x7e, 0x6a, 0x22, 0x14, 0x41, 0xff, 0x01, 0x4b, + 0x0d, 0x00, 0x0b, 0x0b, 0x20, 0x00, 0x2d, 0x00, 0x00, 0x41, 0x20, 0x71, + 0x0d, 0x00, 0x20, 0x05, 0x41, 0xf0, 0x00, 0x6a, 0x20, 0x14, 0x20, 0x00, + 0x10, 0xb1, 0x80, 0x80, 0x80, 0x00, 0x1a, 0x0b, 0x02, 0x40, 0x20, 0x00, + 0x2d, 0x00, 0x00, 0x41, 0x20, 0x71, 0x0d, 0x00, 0x20, 0x1e, 0x20, 0x1b, + 0x20, 0x00, 0x10, 0xb1, 0x80, 0x80, 0x80, 0x00, 0x1a, 0x0b, 0x02, 0x40, + 0x20, 0x1c, 0x41, 0x80, 0x80, 0x04, 0x47, 0x0d, 0x00, 0x20, 0x15, 0x20, + 0x19, 0x4e, 0x0d, 0x00, 0x20, 0x05, 0x41, 0xf0, 0x00, 0x6a, 0x41, 0x30, + 0x20, 0x12, 0x20, 0x15, 0x6b, 0x22, 0x14, 0x41, 0x80, 0x02, 0x20, 0x14, + 0x41, 0x80, 0x02, 0x49, 0x22, 0x1b, 0x1b, 0x10, 0xc0, 0x80, 0x80, 0x80, + 0x00, 0x1a, 0x02, 0x40, 0x20, 0x1b, 0x0d, 0x00, 0x03, 0x40, 0x02, 0x40, + 0x20, 0x00, 0x2d, 0x00, 0x00, 0x41, 0x20, 0x71, 0x0d, 0x00, 0x20, 0x05, + 0x41, 0xf0, 0x00, 0x6a, 0x41, 0x80, 0x02, 0x20, 0x00, 0x10, 0xb1, 0x80, + 0x80, 0x80, 0x00, 0x1a, 0x0b, 0x20, 0x14, 0x41, 0x80, 0x7e, 0x6a, 0x22, + 0x14, 0x41, 0xff, 0x01, 0x4b, 0x0d, 0x00, 0x0b, 0x0b, 0x20, 0x00, 0x2d, + 0x00, 0x00, 0x41, 0x20, 0x71, 0x0d, 0x00, 0x20, 0x05, 0x41, 0xf0, 0x00, + 0x6a, 0x20, 0x14, 0x20, 0x00, 0x10, 0xb1, 0x80, 0x80, 0x80, 0x00, 0x1a, + 0x0b, 0x02, 0x40, 0x20, 0x17, 0x20, 0x18, 0x4e, 0x0d, 0x00, 0x20, 0x05, + 0x41, 0xf0, 0x00, 0x6a, 0x41, 0x30, 0x20, 0x1a, 0x20, 0x17, 0x6b, 0x22, + 0x14, 0x41, 0x80, 0x02, 0x20, 0x14, 0x41, 0x80, 0x02, 0x49, 0x22, 0x18, + 0x1b, 0x10, 0xc0, 0x80, 0x80, 0x80, 0x00, 0x1a, 0x02, 0x40, 0x20, 0x18, + 0x0d, 0x00, 0x03, 0x40, 0x02, 0x40, 0x20, 0x00, 0x2d, 0x00, 0x00, 0x41, + 0x20, 0x71, 0x0d, 0x00, 0x20, 0x05, 0x41, 0xf0, 0x00, 0x6a, 0x41, 0x80, + 0x02, 0x20, 0x00, 0x10, 0xb1, 0x80, 0x80, 0x80, 0x00, 0x1a, 0x0b, 0x20, + 0x14, 0x41, 0x80, 0x7e, 0x6a, 0x22, 0x14, 0x41, 0xff, 0x01, 0x4b, 0x0d, + 0x00, 0x0b, 0x0b, 0x20, 0x00, 0x2d, 0x00, 0x00, 0x41, 0x20, 0x71, 0x0d, + 0x00, 0x20, 0x05, 0x41, 0xf0, 0x00, 0x6a, 0x20, 0x14, 0x20, 0x00, 0x10, + 0xb1, 0x80, 0x80, 0x80, 0x00, 0x1a, 0x0b, 0x02, 0x40, 0x20, 0x00, 0x2d, + 0x00, 0x00, 0x41, 0x20, 0x71, 0x0d, 0x00, 0x20, 0x13, 0x20, 0x17, 0x20, + 0x00, 0x10, 0xb1, 0x80, 0x80, 0x80, 0x00, 0x1a, 0x0b, 0x20, 0x1c, 0x41, + 0x80, 0xc0, 0x00, 0x47, 0x0d, 0x04, 0x20, 0x15, 0x20, 0x19, 0x4e, 0x0d, + 0x04, 0x20, 0x05, 0x41, 0xf0, 0x00, 0x6a, 0x41, 0x20, 0x20, 0x12, 0x20, + 0x15, 0x6b, 0x22, 0x14, 0x41, 0x80, 0x02, 0x20, 0x14, 0x41, 0x80, 0x02, + 0x49, 0x22, 0x15, 0x1b, 0x10, 0xc0, 0x80, 0x80, 0x80, 0x00, 0x1a, 0x02, + 0x40, 0x20, 0x15, 0x0d, 0x00, 0x03, 0x40, 0x02, 0x40, 0x20, 0x00, 0x2d, + 0x00, 0x00, 0x41, 0x20, 0x71, 0x0d, 0x00, 0x20, 0x05, 0x41, 0xf0, 0x00, + 0x6a, 0x41, 0x80, 0x02, 0x20, 0x00, 0x10, 0xb1, 0x80, 0x80, 0x80, 0x00, + 0x1a, 0x0b, 0x20, 0x14, 0x41, 0x80, 0x7e, 0x6a, 0x22, 0x14, 0x41, 0xff, + 0x01, 0x4b, 0x0d, 0x00, 0x0b, 0x0b, 0x20, 0x00, 0x2d, 0x00, 0x00, 0x41, + 0x20, 0x71, 0x0d, 0x04, 0x20, 0x05, 0x41, 0xf0, 0x00, 0x6a, 0x20, 0x14, + 0x20, 0x00, 0x10, 0xb1, 0x80, 0x80, 0x80, 0x00, 0x1a, 0x0c, 0x04, 0x0b, + 0x02, 0x40, 0x20, 0x1a, 0x41, 0x00, 0x48, 0x0d, 0x00, 0x20, 0x1c, 0x20, + 0x15, 0x41, 0x04, 0x6a, 0x20, 0x1c, 0x20, 0x15, 0x4b, 0x1b, 0x21, 0x1c, + 0x20, 0x15, 0x21, 0x17, 0x03, 0x40, 0x02, 0x40, 0x02, 0x40, 0x20, 0x17, + 0x28, 0x02, 0x00, 0x22, 0x12, 0x45, 0x0d, 0x00, 0x41, 0x00, 0x21, 0x14, + 0x03, 0x40, 0x20, 0x05, 0x41, 0xd0, 0x00, 0x6a, 0x20, 0x14, 0x6a, 0x41, + 0x08, 0x6a, 0x20, 0x12, 0x20, 0x12, 0x41, 0x0a, 0x6e, 0x22, 0x13, 0x41, + 0x0a, 0x6c, 0x6b, 0x41, 0x30, 0x72, 0x3a, 0x00, 0x00, 0x20, 0x14, 0x41, + 0x7f, 0x6a, 0x21, 0x14, 0x20, 0x12, 0x41, 0x09, 0x4b, 0x21, 0x18, 0x20, + 0x13, 0x21, 0x12, 0x20, 0x18, 0x0d, 0x00, 0x0b, 0x20, 0x14, 0x45, 0x0d, + 0x00, 0x20, 0x05, 0x41, 0xd0, 0x00, 0x6a, 0x20, 0x14, 0x6a, 0x41, 0x09, + 0x6a, 0x21, 0x12, 0x0c, 0x01, 0x0b, 0x20, 0x05, 0x41, 0x30, 0x3a, 0x00, + 0x58, 0x20, 0x0c, 0x21, 0x12, 0x0b, 0x02, 0x40, 0x02, 0x40, 0x20, 0x17, + 0x20, 0x15, 0x46, 0x0d, 0x00, 0x20, 0x12, 0x20, 0x05, 0x41, 0xd0, 0x00, + 0x6a, 0x4d, 0x0d, 0x01, 0x20, 0x05, 0x41, 0xd0, 0x00, 0x6a, 0x41, 0x30, + 0x20, 0x12, 0x20, 0x05, 0x41, 0xd0, 0x00, 0x6a, 0x6b, 0x10, 0xc0, 0x80, + 0x80, 0x80, 0x00, 0x1a, 0x20, 0x05, 0x41, 0xd0, 0x00, 0x6a, 0x21, 0x12, + 0x0c, 0x01, 0x0b, 0x02, 0x40, 0x20, 0x00, 0x2d, 0x00, 0x00, 0x41, 0x20, + 0x71, 0x0d, 0x00, 0x20, 0x12, 0x41, 0x01, 0x20, 0x00, 0x10, 0xb1, 0x80, + 0x80, 0x80, 0x00, 0x1a, 0x0b, 0x20, 0x12, 0x41, 0x01, 0x6a, 0x21, 0x12, + 0x02, 0x40, 0x20, 0x28, 0x0d, 0x00, 0x20, 0x1a, 0x41, 0x01, 0x48, 0x0d, + 0x01, 0x0b, 0x20, 0x00, 0x2d, 0x00, 0x00, 0x41, 0x20, 0x71, 0x0d, 0x00, + 0x41, 0xa9, 0x89, 0x80, 0x80, 0x00, 0x41, 0x01, 0x20, 0x00, 0x10, 0xb1, + 0x80, 0x80, 0x80, 0x00, 0x1a, 0x0b, 0x20, 0x0d, 0x20, 0x12, 0x6b, 0x21, + 0x14, 0x02, 0x40, 0x20, 0x00, 0x2d, 0x00, 0x00, 0x41, 0x20, 0x71, 0x0d, + 0x00, 0x20, 0x12, 0x20, 0x14, 0x20, 0x1a, 0x20, 0x14, 0x20, 0x1a, 0x48, + 0x1b, 0x20, 0x00, 0x10, 0xb1, 0x80, 0x80, 0x80, 0x00, 0x1a, 0x0b, 0x20, + 0x1a, 0x20, 0x14, 0x6b, 0x21, 0x1a, 0x20, 0x17, 0x41, 0x04, 0x6a, 0x22, + 0x17, 0x20, 0x1c, 0x4f, 0x0d, 0x01, 0x20, 0x1a, 0x41, 0x7f, 0x4a, 0x0d, + 0x00, 0x0b, 0x0b, 0x20, 0x00, 0x41, 0x30, 0x20, 0x1a, 0x41, 0x12, 0x6a, + 0x41, 0x12, 0x41, 0x00, 0x10, 0xbd, 0x80, 0x80, 0x80, 0x00, 0x20, 0x00, + 0x2d, 0x00, 0x00, 0x41, 0x20, 0x71, 0x0d, 0x00, 0x20, 0x27, 0x20, 0x06, + 0x20, 0x27, 0x6b, 0x20, 0x00, 0x10, 0xb1, 0x80, 0x80, 0x80, 0x00, 0x1a, + 0x0b, 0x20, 0x16, 0x41, 0x80, 0xc0, 0x00, 0x47, 0x0d, 0x01, 0x20, 0x19, + 0x20, 0x1b, 0x4c, 0x0d, 0x01, 0x20, 0x05, 0x41, 0xf0, 0x04, 0x6a, 0x41, + 0x20, 0x20, 0x19, 0x20, 0x1b, 0x6b, 0x22, 0x12, 0x41, 0x80, 0x02, 0x20, + 0x12, 0x41, 0x80, 0x02, 0x49, 0x22, 0x14, 0x1b, 0x10, 0xc0, 0x80, 0x80, + 0x80, 0x00, 0x1a, 0x02, 0x40, 0x20, 0x14, 0x0d, 0x00, 0x03, 0x40, 0x02, + 0x40, 0x20, 0x00, 0x2d, 0x00, 0x00, 0x41, 0x20, 0x71, 0x0d, 0x00, 0x20, + 0x05, 0x41, 0xf0, 0x04, 0x6a, 0x41, 0x80, 0x02, 0x20, 0x00, 0x10, 0xb1, + 0x80, 0x80, 0x80, 0x00, 0x1a, 0x0b, 0x20, 0x12, 0x41, 0x80, 0x7e, 0x6a, + 0x22, 0x12, 0x41, 0xff, 0x01, 0x4b, 0x0d, 0x00, 0x0b, 0x0b, 0x20, 0x00, + 0x2d, 0x00, 0x00, 0x41, 0x20, 0x71, 0x0d, 0x01, 0x20, 0x05, 0x41, 0xf0, + 0x04, 0x6a, 0x20, 0x12, 0x20, 0x00, 0x10, 0xb1, 0x80, 0x80, 0x80, 0x00, + 0x1a, 0x0c, 0x01, 0x0b, 0x20, 0x24, 0x20, 0x1d, 0x41, 0x1a, 0x74, 0x41, + 0x1f, 0x75, 0x41, 0x09, 0x71, 0x6a, 0x21, 0x1e, 0x02, 0x40, 0x20, 0x17, + 0x41, 0x0b, 0x4b, 0x0d, 0x00, 0x02, 0x40, 0x02, 0x40, 0x41, 0x0c, 0x20, + 0x17, 0x6b, 0x22, 0x12, 0x41, 0x07, 0x71, 0x22, 0x14, 0x0d, 0x00, 0x44, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x40, 0x21, 0x2a, 0x0c, 0x01, + 0x0b, 0x20, 0x17, 0x41, 0x74, 0x6a, 0x21, 0x12, 0x44, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x30, 0x40, 0x21, 0x2a, 0x03, 0x40, 0x20, 0x12, 0x41, + 0x01, 0x6a, 0x21, 0x12, 0x20, 0x2a, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x30, 0x40, 0xa2, 0x21, 0x2a, 0x20, 0x14, 0x41, 0x7f, 0x6a, 0x22, + 0x14, 0x0d, 0x00, 0x0b, 0x41, 0x00, 0x20, 0x12, 0x6b, 0x21, 0x12, 0x0b, + 0x02, 0x40, 0x20, 0x17, 0x41, 0x7b, 0x6a, 0x41, 0x07, 0x49, 0x0d, 0x00, + 0x03, 0x40, 0x20, 0x2a, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, + 0x40, 0xa2, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x40, 0xa2, + 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x40, 0xa2, 0x44, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x40, 0xa2, 0x44, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x30, 0x40, 0xa2, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x30, 0x40, 0xa2, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, + 0x40, 0xa2, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x40, 0xa2, + 0x21, 0x2a, 0x20, 0x12, 0x41, 0x78, 0x6a, 0x22, 0x12, 0x0d, 0x00, 0x0b, + 0x0b, 0x02, 0x40, 0x20, 0x1e, 0x2d, 0x00, 0x00, 0x41, 0x2d, 0x47, 0x0d, + 0x00, 0x20, 0x2a, 0x20, 0x21, 0x9a, 0x20, 0x2a, 0xa1, 0xa0, 0x9a, 0x21, + 0x21, 0x0c, 0x01, 0x0b, 0x20, 0x21, 0x20, 0x2a, 0xa0, 0x20, 0x2a, 0xa1, + 0x21, 0x21, 0x0b, 0x02, 0x40, 0x02, 0x40, 0x20, 0x05, 0x28, 0x02, 0x6c, + 0x22, 0x18, 0x45, 0x0d, 0x00, 0x20, 0x18, 0x20, 0x18, 0x41, 0x1f, 0x75, + 0x22, 0x12, 0x73, 0x20, 0x12, 0x6b, 0x21, 0x12, 0x41, 0x00, 0x21, 0x14, + 0x03, 0x40, 0x20, 0x05, 0x41, 0xc4, 0x00, 0x6a, 0x20, 0x14, 0x6a, 0x41, + 0x0b, 0x6a, 0x20, 0x12, 0x20, 0x12, 0x41, 0x0a, 0x6e, 0x22, 0x15, 0x41, + 0x0a, 0x6c, 0x6b, 0x41, 0x30, 0x72, 0x3a, 0x00, 0x00, 0x20, 0x14, 0x41, + 0x7f, 0x6a, 0x21, 0x14, 0x20, 0x12, 0x41, 0x09, 0x4b, 0x21, 0x13, 0x20, + 0x15, 0x21, 0x12, 0x20, 0x13, 0x0d, 0x00, 0x0b, 0x20, 0x14, 0x45, 0x0d, + 0x00, 0x20, 0x05, 0x41, 0xc4, 0x00, 0x6a, 0x20, 0x14, 0x6a, 0x41, 0x0c, + 0x6a, 0x21, 0x12, 0x0c, 0x01, 0x0b, 0x20, 0x05, 0x41, 0x30, 0x3a, 0x00, + 0x4f, 0x20, 0x0a, 0x21, 0x12, 0x0b, 0x20, 0x22, 0x41, 0x02, 0x72, 0x21, + 0x1c, 0x20, 0x1d, 0x41, 0x20, 0x71, 0x21, 0x15, 0x20, 0x12, 0x41, 0x7e, + 0x6a, 0x22, 0x1a, 0x20, 0x1d, 0x41, 0x0f, 0x6a, 0x3a, 0x00, 0x00, 0x20, + 0x12, 0x41, 0x7f, 0x6a, 0x41, 0x2d, 0x41, 0x2b, 0x20, 0x18, 0x41, 0x00, + 0x48, 0x1b, 0x3a, 0x00, 0x00, 0x20, 0x16, 0x41, 0x08, 0x71, 0x21, 0x13, + 0x20, 0x05, 0x41, 0xd0, 0x00, 0x6a, 0x21, 0x14, 0x03, 0x40, 0x20, 0x14, + 0x21, 0x12, 0x02, 0x40, 0x02, 0x40, 0x20, 0x21, 0x99, 0x44, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xe0, 0x41, 0x63, 0x45, 0x0d, 0x00, 0x20, 0x21, + 0xaa, 0x21, 0x14, 0x0c, 0x01, 0x0b, 0x41, 0x80, 0x80, 0x80, 0x80, 0x78, + 0x21, 0x14, 0x0b, 0x20, 0x12, 0x20, 0x14, 0x41, 0xf0, 0x9d, 0x80, 0x80, + 0x00, 0x6a, 0x2d, 0x00, 0x00, 0x20, 0x15, 0x72, 0x3a, 0x00, 0x00, 0x20, + 0x21, 0x20, 0x14, 0xb7, 0xa1, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x30, 0x40, 0xa2, 0x21, 0x21, 0x02, 0x40, 0x20, 0x12, 0x41, 0x01, 0x6a, + 0x22, 0x14, 0x20, 0x05, 0x41, 0xd0, 0x00, 0x6a, 0x6b, 0x41, 0x01, 0x47, + 0x0d, 0x00, 0x02, 0x40, 0x20, 0x13, 0x0d, 0x00, 0x20, 0x17, 0x41, 0x00, + 0x4a, 0x0d, 0x00, 0x20, 0x21, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x61, 0x0d, 0x01, 0x0b, 0x20, 0x12, 0x41, 0x2e, 0x3a, 0x00, + 0x01, 0x20, 0x12, 0x41, 0x02, 0x6a, 0x21, 0x14, 0x0b, 0x20, 0x21, 0x44, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x62, 0x0d, 0x00, 0x0b, + 0x41, 0xfd, 0xff, 0xff, 0xff, 0x07, 0x20, 0x06, 0x20, 0x1a, 0x6b, 0x22, + 0x18, 0x20, 0x1c, 0x6a, 0x22, 0x12, 0x6b, 0x20, 0x17, 0x48, 0x0d, 0x02, + 0x20, 0x17, 0x41, 0x02, 0x6a, 0x20, 0x14, 0x20, 0x05, 0x41, 0xd0, 0x00, + 0x6a, 0x6b, 0x22, 0x14, 0x20, 0x14, 0x41, 0x7e, 0x6a, 0x20, 0x17, 0x48, + 0x1b, 0x20, 0x14, 0x20, 0x17, 0x1b, 0x22, 0x13, 0x20, 0x12, 0x6a, 0x21, + 0x1b, 0x02, 0x40, 0x20, 0x16, 0x41, 0x80, 0xc0, 0x04, 0x71, 0x22, 0x15, + 0x0d, 0x00, 0x20, 0x19, 0x20, 0x1b, 0x4c, 0x0d, 0x00, 0x20, 0x05, 0x41, + 0xf0, 0x04, 0x6a, 0x41, 0x20, 0x20, 0x19, 0x20, 0x1b, 0x6b, 0x22, 0x12, + 0x41, 0x80, 0x02, 0x20, 0x12, 0x41, 0x80, 0x02, 0x49, 0x22, 0x17, 0x1b, + 0x10, 0xc0, 0x80, 0x80, 0x80, 0x00, 0x1a, 0x02, 0x40, 0x20, 0x17, 0x0d, + 0x00, 0x03, 0x40, 0x02, 0x40, 0x20, 0x00, 0x2d, 0x00, 0x00, 0x41, 0x20, + 0x71, 0x0d, 0x00, 0x20, 0x05, 0x41, 0xf0, 0x04, 0x6a, 0x41, 0x80, 0x02, + 0x20, 0x00, 0x10, 0xb1, 0x80, 0x80, 0x80, 0x00, 0x1a, 0x0b, 0x20, 0x12, + 0x41, 0x80, 0x7e, 0x6a, 0x22, 0x12, 0x41, 0xff, 0x01, 0x4b, 0x0d, 0x00, + 0x0b, 0x0b, 0x20, 0x00, 0x2d, 0x00, 0x00, 0x41, 0x20, 0x71, 0x0d, 0x00, + 0x20, 0x05, 0x41, 0xf0, 0x04, 0x6a, 0x20, 0x12, 0x20, 0x00, 0x10, 0xb1, + 0x80, 0x80, 0x80, 0x00, 0x1a, 0x0b, 0x02, 0x40, 0x20, 0x00, 0x2d, 0x00, + 0x00, 0x41, 0x20, 0x71, 0x0d, 0x00, 0x20, 0x1e, 0x20, 0x1c, 0x20, 0x00, + 0x10, 0xb1, 0x80, 0x80, 0x80, 0x00, 0x1a, 0x0b, 0x02, 0x40, 0x20, 0x15, + 0x41, 0x80, 0x80, 0x04, 0x47, 0x0d, 0x00, 0x20, 0x19, 0x20, 0x1b, 0x4c, + 0x0d, 0x00, 0x20, 0x05, 0x41, 0xf0, 0x04, 0x6a, 0x41, 0x30, 0x20, 0x19, + 0x20, 0x1b, 0x6b, 0x22, 0x12, 0x41, 0x80, 0x02, 0x20, 0x12, 0x41, 0x80, + 0x02, 0x49, 0x22, 0x17, 0x1b, 0x10, 0xc0, 0x80, 0x80, 0x80, 0x00, 0x1a, + 0x02, 0x40, 0x20, 0x17, 0x0d, 0x00, 0x03, 0x40, 0x02, 0x40, 0x20, 0x00, + 0x2d, 0x00, 0x00, 0x41, 0x20, 0x71, 0x0d, 0x00, 0x20, 0x05, 0x41, 0xf0, + 0x04, 0x6a, 0x41, 0x80, 0x02, 0x20, 0x00, 0x10, 0xb1, 0x80, 0x80, 0x80, + 0x00, 0x1a, 0x0b, 0x20, 0x12, 0x41, 0x80, 0x7e, 0x6a, 0x22, 0x12, 0x41, + 0xff, 0x01, 0x4b, 0x0d, 0x00, 0x0b, 0x0b, 0x20, 0x00, 0x2d, 0x00, 0x00, + 0x41, 0x20, 0x71, 0x0d, 0x00, 0x20, 0x05, 0x41, 0xf0, 0x04, 0x6a, 0x20, + 0x12, 0x20, 0x00, 0x10, 0xb1, 0x80, 0x80, 0x80, 0x00, 0x1a, 0x0b, 0x02, + 0x40, 0x20, 0x00, 0x2d, 0x00, 0x00, 0x41, 0x20, 0x71, 0x0d, 0x00, 0x20, + 0x05, 0x41, 0xd0, 0x00, 0x6a, 0x20, 0x14, 0x20, 0x00, 0x10, 0xb1, 0x80, + 0x80, 0x80, 0x00, 0x1a, 0x0b, 0x02, 0x40, 0x20, 0x13, 0x20, 0x14, 0x6b, + 0x22, 0x12, 0x41, 0x01, 0x48, 0x0d, 0x00, 0x20, 0x05, 0x41, 0xf0, 0x04, + 0x6a, 0x41, 0x30, 0x20, 0x12, 0x41, 0x80, 0x02, 0x20, 0x12, 0x41, 0x80, + 0x02, 0x49, 0x22, 0x14, 0x1b, 0x10, 0xc0, 0x80, 0x80, 0x80, 0x00, 0x1a, + 0x02, 0x40, 0x20, 0x14, 0x0d, 0x00, 0x03, 0x40, 0x02, 0x40, 0x20, 0x00, + 0x2d, 0x00, 0x00, 0x41, 0x20, 0x71, 0x0d, 0x00, 0x20, 0x05, 0x41, 0xf0, + 0x04, 0x6a, 0x41, 0x80, 0x02, 0x20, 0x00, 0x10, 0xb1, 0x80, 0x80, 0x80, + 0x00, 0x1a, 0x0b, 0x20, 0x12, 0x41, 0x80, 0x7e, 0x6a, 0x22, 0x12, 0x41, + 0xff, 0x01, 0x4b, 0x0d, 0x00, 0x0b, 0x0b, 0x20, 0x00, 0x2d, 0x00, 0x00, + 0x41, 0x20, 0x71, 0x0d, 0x00, 0x20, 0x05, 0x41, 0xf0, 0x04, 0x6a, 0x20, + 0x12, 0x20, 0x00, 0x10, 0xb1, 0x80, 0x80, 0x80, 0x00, 0x1a, 0x0b, 0x02, + 0x40, 0x20, 0x00, 0x2d, 0x00, 0x00, 0x41, 0x20, 0x71, 0x0d, 0x00, 0x20, + 0x1a, 0x20, 0x18, 0x20, 0x00, 0x10, 0xb1, 0x80, 0x80, 0x80, 0x00, 0x1a, + 0x0b, 0x20, 0x15, 0x41, 0x80, 0xc0, 0x00, 0x47, 0x0d, 0x00, 0x20, 0x19, + 0x20, 0x1b, 0x4c, 0x0d, 0x00, 0x20, 0x05, 0x41, 0xf0, 0x04, 0x6a, 0x41, + 0x20, 0x20, 0x19, 0x20, 0x1b, 0x6b, 0x22, 0x12, 0x41, 0x80, 0x02, 0x20, + 0x12, 0x41, 0x80, 0x02, 0x49, 0x22, 0x14, 0x1b, 0x10, 0xc0, 0x80, 0x80, + 0x80, 0x00, 0x1a, 0x02, 0x40, 0x20, 0x14, 0x0d, 0x00, 0x03, 0x40, 0x02, + 0x40, 0x20, 0x00, 0x2d, 0x00, 0x00, 0x41, 0x20, 0x71, 0x0d, 0x00, 0x20, + 0x05, 0x41, 0xf0, 0x04, 0x6a, 0x41, 0x80, 0x02, 0x20, 0x00, 0x10, 0xb1, + 0x80, 0x80, 0x80, 0x00, 0x1a, 0x0b, 0x20, 0x12, 0x41, 0x80, 0x7e, 0x6a, + 0x22, 0x12, 0x41, 0xff, 0x01, 0x4b, 0x0d, 0x00, 0x0b, 0x0b, 0x20, 0x00, + 0x2d, 0x00, 0x00, 0x41, 0x20, 0x71, 0x0d, 0x00, 0x20, 0x05, 0x41, 0xf0, + 0x04, 0x6a, 0x20, 0x12, 0x20, 0x00, 0x10, 0xb1, 0x80, 0x80, 0x80, 0x00, + 0x1a, 0x0b, 0x20, 0x1b, 0x20, 0x19, 0x20, 0x1b, 0x20, 0x19, 0x4a, 0x1b, + 0x22, 0x12, 0x41, 0x00, 0x4e, 0x0d, 0x00, 0x0b, 0x0b, 0x41, 0x80, 0xa8, + 0x80, 0x80, 0x00, 0x41, 0x3d, 0x36, 0x02, 0x00, 0x0b, 0x41, 0x7f, 0x21, + 0x11, 0x0b, 0x20, 0x05, 0x41, 0xf0, 0x06, 0x6a, 0x24, 0x80, 0x80, 0x80, + 0x80, 0x00, 0x20, 0x11, 0x0b, 0xb3, 0x04, 0x00, 0x02, 0x40, 0x02, 0x40, + 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, + 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, + 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, 0x20, 0x01, + 0x41, 0x77, 0x6a, 0x0e, 0x12, 0x11, 0x00, 0x01, 0x04, 0x02, 0x03, 0x05, + 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x12, + 0x0b, 0x20, 0x02, 0x20, 0x02, 0x28, 0x02, 0x00, 0x22, 0x01, 0x41, 0x04, + 0x6a, 0x36, 0x02, 0x00, 0x20, 0x00, 0x20, 0x01, 0x34, 0x02, 0x00, 0x37, + 0x03, 0x00, 0x0f, 0x0b, 0x20, 0x02, 0x20, 0x02, 0x28, 0x02, 0x00, 0x22, + 0x01, 0x41, 0x04, 0x6a, 0x36, 0x02, 0x00, 0x20, 0x00, 0x20, 0x01, 0x35, + 0x02, 0x00, 0x37, 0x03, 0x00, 0x0f, 0x0b, 0x20, 0x02, 0x20, 0x02, 0x28, + 0x02, 0x00, 0x22, 0x01, 0x41, 0x04, 0x6a, 0x36, 0x02, 0x00, 0x20, 0x00, + 0x20, 0x01, 0x34, 0x02, 0x00, 0x37, 0x03, 0x00, 0x0f, 0x0b, 0x20, 0x02, + 0x20, 0x02, 0x28, 0x02, 0x00, 0x22, 0x01, 0x41, 0x04, 0x6a, 0x36, 0x02, + 0x00, 0x20, 0x00, 0x20, 0x01, 0x35, 0x02, 0x00, 0x37, 0x03, 0x00, 0x0f, + 0x0b, 0x20, 0x02, 0x20, 0x02, 0x28, 0x02, 0x00, 0x41, 0x07, 0x6a, 0x41, + 0x78, 0x71, 0x22, 0x01, 0x41, 0x08, 0x6a, 0x36, 0x02, 0x00, 0x20, 0x00, + 0x20, 0x01, 0x29, 0x03, 0x00, 0x37, 0x03, 0x00, 0x0f, 0x0b, 0x20, 0x02, + 0x20, 0x02, 0x28, 0x02, 0x00, 0x22, 0x01, 0x41, 0x04, 0x6a, 0x36, 0x02, + 0x00, 0x20, 0x00, 0x20, 0x01, 0x32, 0x01, 0x00, 0x37, 0x03, 0x00, 0x0f, + 0x0b, 0x20, 0x02, 0x20, 0x02, 0x28, 0x02, 0x00, 0x22, 0x01, 0x41, 0x04, + 0x6a, 0x36, 0x02, 0x00, 0x20, 0x00, 0x20, 0x01, 0x33, 0x01, 0x00, 0x37, + 0x03, 0x00, 0x0f, 0x0b, 0x20, 0x02, 0x20, 0x02, 0x28, 0x02, 0x00, 0x22, + 0x01, 0x41, 0x04, 0x6a, 0x36, 0x02, 0x00, 0x20, 0x00, 0x20, 0x01, 0x30, + 0x00, 0x00, 0x37, 0x03, 0x00, 0x0f, 0x0b, 0x20, 0x02, 0x20, 0x02, 0x28, + 0x02, 0x00, 0x22, 0x01, 0x41, 0x04, 0x6a, 0x36, 0x02, 0x00, 0x20, 0x00, + 0x20, 0x01, 0x31, 0x00, 0x00, 0x37, 0x03, 0x00, 0x0f, 0x0b, 0x20, 0x02, + 0x20, 0x02, 0x28, 0x02, 0x00, 0x41, 0x07, 0x6a, 0x41, 0x78, 0x71, 0x22, + 0x01, 0x41, 0x08, 0x6a, 0x36, 0x02, 0x00, 0x20, 0x00, 0x20, 0x01, 0x29, + 0x03, 0x00, 0x37, 0x03, 0x00, 0x0f, 0x0b, 0x20, 0x02, 0x20, 0x02, 0x28, + 0x02, 0x00, 0x22, 0x01, 0x41, 0x04, 0x6a, 0x36, 0x02, 0x00, 0x20, 0x00, + 0x20, 0x01, 0x35, 0x02, 0x00, 0x37, 0x03, 0x00, 0x0f, 0x0b, 0x20, 0x02, + 0x20, 0x02, 0x28, 0x02, 0x00, 0x41, 0x07, 0x6a, 0x41, 0x78, 0x71, 0x22, + 0x01, 0x41, 0x08, 0x6a, 0x36, 0x02, 0x00, 0x20, 0x00, 0x20, 0x01, 0x29, + 0x03, 0x00, 0x37, 0x03, 0x00, 0x0f, 0x0b, 0x20, 0x02, 0x20, 0x02, 0x28, + 0x02, 0x00, 0x41, 0x07, 0x6a, 0x41, 0x78, 0x71, 0x22, 0x01, 0x41, 0x08, + 0x6a, 0x36, 0x02, 0x00, 0x20, 0x00, 0x20, 0x01, 0x29, 0x03, 0x00, 0x37, + 0x03, 0x00, 0x0f, 0x0b, 0x20, 0x02, 0x20, 0x02, 0x28, 0x02, 0x00, 0x22, + 0x01, 0x41, 0x04, 0x6a, 0x36, 0x02, 0x00, 0x20, 0x00, 0x20, 0x01, 0x34, + 0x02, 0x00, 0x37, 0x03, 0x00, 0x0f, 0x0b, 0x20, 0x02, 0x20, 0x02, 0x28, + 0x02, 0x00, 0x22, 0x01, 0x41, 0x04, 0x6a, 0x36, 0x02, 0x00, 0x20, 0x00, + 0x20, 0x01, 0x35, 0x02, 0x00, 0x37, 0x03, 0x00, 0x0f, 0x0b, 0x20, 0x02, + 0x20, 0x02, 0x28, 0x02, 0x00, 0x41, 0x07, 0x6a, 0x41, 0x78, 0x71, 0x22, + 0x01, 0x41, 0x08, 0x6a, 0x36, 0x02, 0x00, 0x20, 0x00, 0x20, 0x01, 0x2b, + 0x03, 0x00, 0x39, 0x03, 0x00, 0x0f, 0x0b, 0x10, 0xbe, 0x80, 0x80, 0x80, + 0x00, 0x00, 0x0b, 0x20, 0x02, 0x20, 0x02, 0x28, 0x02, 0x00, 0x22, 0x01, + 0x41, 0x04, 0x6a, 0x36, 0x02, 0x00, 0x20, 0x00, 0x20, 0x01, 0x28, 0x02, + 0x00, 0x36, 0x02, 0x00, 0x0b, 0x0b, 0x9e, 0x01, 0x01, 0x01, 0x7f, 0x23, + 0x80, 0x80, 0x80, 0x80, 0x00, 0x41, 0x80, 0x02, 0x6b, 0x22, 0x05, 0x24, + 0x80, 0x80, 0x80, 0x80, 0x00, 0x02, 0x40, 0x20, 0x02, 0x20, 0x03, 0x4c, + 0x0d, 0x00, 0x20, 0x04, 0x41, 0x80, 0xc0, 0x04, 0x71, 0x0d, 0x00, 0x20, + 0x05, 0x20, 0x01, 0x20, 0x02, 0x20, 0x03, 0x6b, 0x22, 0x03, 0x41, 0x80, + 0x02, 0x20, 0x03, 0x41, 0x80, 0x02, 0x49, 0x22, 0x04, 0x1b, 0x10, 0xc0, + 0x80, 0x80, 0x80, 0x00, 0x21, 0x02, 0x02, 0x40, 0x20, 0x04, 0x0d, 0x00, + 0x03, 0x40, 0x02, 0x40, 0x20, 0x00, 0x2d, 0x00, 0x00, 0x41, 0x20, 0x71, + 0x0d, 0x00, 0x20, 0x02, 0x41, 0x80, 0x02, 0x20, 0x00, 0x10, 0xb1, 0x80, + 0x80, 0x80, 0x00, 0x1a, 0x0b, 0x20, 0x03, 0x41, 0x80, 0x7e, 0x6a, 0x22, + 0x03, 0x41, 0xff, 0x01, 0x4b, 0x0d, 0x00, 0x0b, 0x0b, 0x20, 0x00, 0x2d, + 0x00, 0x00, 0x41, 0x20, 0x71, 0x0d, 0x00, 0x20, 0x02, 0x20, 0x03, 0x20, + 0x00, 0x10, 0xb1, 0x80, 0x80, 0x80, 0x00, 0x1a, 0x0b, 0x20, 0x05, 0x41, + 0x80, 0x02, 0x6a, 0x24, 0x80, 0x80, 0x80, 0x80, 0x00, 0x0b, 0x1c, 0x00, + 0x41, 0x8d, 0x8b, 0x80, 0x80, 0x00, 0x41, 0xf8, 0x9e, 0x80, 0x80, 0x00, + 0x10, 0xb9, 0x80, 0x80, 0x80, 0x00, 0x1a, 0x10, 0xa0, 0x80, 0x80, 0x80, + 0x00, 0x00, 0x0b, 0xe6, 0x07, 0x01, 0x04, 0x7f, 0x02, 0x40, 0x02, 0x40, + 0x02, 0x40, 0x20, 0x02, 0x41, 0x20, 0x4b, 0x0d, 0x00, 0x20, 0x01, 0x41, + 0x03, 0x71, 0x45, 0x0d, 0x01, 0x20, 0x02, 0x45, 0x0d, 0x01, 0x20, 0x00, + 0x20, 0x01, 0x2d, 0x00, 0x00, 0x3a, 0x00, 0x00, 0x20, 0x02, 0x41, 0x7f, + 0x6a, 0x21, 0x03, 0x20, 0x00, 0x41, 0x01, 0x6a, 0x21, 0x04, 0x20, 0x01, + 0x41, 0x01, 0x6a, 0x22, 0x05, 0x41, 0x03, 0x71, 0x45, 0x0d, 0x02, 0x20, + 0x03, 0x45, 0x0d, 0x02, 0x20, 0x00, 0x20, 0x01, 0x2d, 0x00, 0x01, 0x3a, + 0x00, 0x01, 0x20, 0x02, 0x41, 0x7e, 0x6a, 0x21, 0x03, 0x20, 0x00, 0x41, + 0x02, 0x6a, 0x21, 0x04, 0x20, 0x01, 0x41, 0x02, 0x6a, 0x22, 0x05, 0x41, + 0x03, 0x71, 0x45, 0x0d, 0x02, 0x20, 0x03, 0x45, 0x0d, 0x02, 0x20, 0x00, + 0x20, 0x01, 0x2d, 0x00, 0x02, 0x3a, 0x00, 0x02, 0x20, 0x02, 0x41, 0x7d, + 0x6a, 0x21, 0x03, 0x20, 0x00, 0x41, 0x03, 0x6a, 0x21, 0x04, 0x20, 0x01, + 0x41, 0x03, 0x6a, 0x22, 0x05, 0x41, 0x03, 0x71, 0x45, 0x0d, 0x02, 0x20, + 0x03, 0x45, 0x0d, 0x02, 0x20, 0x00, 0x20, 0x01, 0x2d, 0x00, 0x03, 0x3a, + 0x00, 0x03, 0x20, 0x02, 0x41, 0x7c, 0x6a, 0x21, 0x03, 0x20, 0x00, 0x41, + 0x04, 0x6a, 0x21, 0x04, 0x20, 0x01, 0x41, 0x04, 0x6a, 0x21, 0x05, 0x0c, + 0x02, 0x0b, 0x20, 0x00, 0x20, 0x01, 0x20, 0x02, 0xfc, 0x0a, 0x00, 0x00, + 0x20, 0x00, 0x0f, 0x0b, 0x20, 0x02, 0x21, 0x03, 0x20, 0x00, 0x21, 0x04, + 0x20, 0x01, 0x21, 0x05, 0x0b, 0x02, 0x40, 0x02, 0x40, 0x20, 0x04, 0x41, + 0x03, 0x71, 0x22, 0x02, 0x0d, 0x00, 0x02, 0x40, 0x02, 0x40, 0x20, 0x03, + 0x41, 0x10, 0x4f, 0x0d, 0x00, 0x20, 0x03, 0x21, 0x02, 0x0c, 0x01, 0x0b, + 0x02, 0x40, 0x20, 0x03, 0x41, 0x70, 0x6a, 0x22, 0x02, 0x41, 0x10, 0x71, + 0x0d, 0x00, 0x20, 0x04, 0x20, 0x05, 0x29, 0x02, 0x00, 0x37, 0x02, 0x00, + 0x20, 0x04, 0x20, 0x05, 0x29, 0x02, 0x08, 0x37, 0x02, 0x08, 0x20, 0x04, + 0x41, 0x10, 0x6a, 0x21, 0x04, 0x20, 0x05, 0x41, 0x10, 0x6a, 0x21, 0x05, + 0x20, 0x02, 0x21, 0x03, 0x0b, 0x20, 0x02, 0x41, 0x10, 0x49, 0x0d, 0x00, + 0x20, 0x03, 0x21, 0x02, 0x03, 0x40, 0x20, 0x04, 0x20, 0x05, 0x29, 0x02, + 0x00, 0x37, 0x02, 0x00, 0x20, 0x04, 0x20, 0x05, 0x29, 0x02, 0x08, 0x37, + 0x02, 0x08, 0x20, 0x04, 0x20, 0x05, 0x29, 0x02, 0x10, 0x37, 0x02, 0x10, + 0x20, 0x04, 0x20, 0x05, 0x29, 0x02, 0x18, 0x37, 0x02, 0x18, 0x20, 0x04, + 0x41, 0x20, 0x6a, 0x21, 0x04, 0x20, 0x05, 0x41, 0x20, 0x6a, 0x21, 0x05, + 0x20, 0x02, 0x41, 0x60, 0x6a, 0x22, 0x02, 0x41, 0x0f, 0x4b, 0x0d, 0x00, + 0x0b, 0x0b, 0x02, 0x40, 0x20, 0x02, 0x41, 0x08, 0x49, 0x0d, 0x00, 0x20, + 0x04, 0x20, 0x05, 0x29, 0x02, 0x00, 0x37, 0x02, 0x00, 0x20, 0x05, 0x41, + 0x08, 0x6a, 0x21, 0x05, 0x20, 0x04, 0x41, 0x08, 0x6a, 0x21, 0x04, 0x0b, + 0x02, 0x40, 0x20, 0x02, 0x41, 0x04, 0x71, 0x45, 0x0d, 0x00, 0x20, 0x04, + 0x20, 0x05, 0x28, 0x02, 0x00, 0x36, 0x02, 0x00, 0x20, 0x05, 0x41, 0x04, + 0x6a, 0x21, 0x05, 0x20, 0x04, 0x41, 0x04, 0x6a, 0x21, 0x04, 0x0b, 0x02, + 0x40, 0x20, 0x02, 0x41, 0x02, 0x71, 0x45, 0x0d, 0x00, 0x20, 0x04, 0x20, + 0x05, 0x2f, 0x00, 0x00, 0x3b, 0x00, 0x00, 0x20, 0x04, 0x41, 0x02, 0x6a, + 0x21, 0x04, 0x20, 0x05, 0x41, 0x02, 0x6a, 0x21, 0x05, 0x0b, 0x20, 0x02, + 0x41, 0x01, 0x71, 0x45, 0x0d, 0x01, 0x20, 0x04, 0x20, 0x05, 0x2d, 0x00, + 0x00, 0x3a, 0x00, 0x00, 0x20, 0x00, 0x0f, 0x0b, 0x02, 0x40, 0x02, 0x40, + 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, 0x20, 0x03, 0x41, 0x20, 0x49, 0x0d, + 0x00, 0x02, 0x40, 0x02, 0x40, 0x20, 0x02, 0x41, 0x7f, 0x6a, 0x0e, 0x03, + 0x03, 0x00, 0x01, 0x07, 0x0b, 0x20, 0x04, 0x20, 0x05, 0x28, 0x02, 0x00, + 0x3b, 0x00, 0x00, 0x20, 0x04, 0x20, 0x05, 0x41, 0x02, 0x6a, 0x28, 0x01, + 0x00, 0x36, 0x02, 0x02, 0x20, 0x04, 0x20, 0x05, 0x41, 0x06, 0x6a, 0x29, + 0x01, 0x00, 0x37, 0x02, 0x06, 0x20, 0x04, 0x41, 0x12, 0x6a, 0x21, 0x02, + 0x20, 0x05, 0x41, 0x12, 0x6a, 0x21, 0x01, 0x41, 0x0e, 0x21, 0x06, 0x20, + 0x05, 0x41, 0x0e, 0x6a, 0x28, 0x01, 0x00, 0x21, 0x05, 0x41, 0x0e, 0x21, + 0x03, 0x0c, 0x03, 0x0b, 0x20, 0x04, 0x20, 0x05, 0x28, 0x02, 0x00, 0x3a, + 0x00, 0x00, 0x20, 0x04, 0x20, 0x05, 0x41, 0x01, 0x6a, 0x28, 0x00, 0x00, + 0x36, 0x02, 0x01, 0x20, 0x04, 0x20, 0x05, 0x41, 0x05, 0x6a, 0x29, 0x00, + 0x00, 0x37, 0x02, 0x05, 0x20, 0x04, 0x41, 0x11, 0x6a, 0x21, 0x02, 0x20, + 0x05, 0x41, 0x11, 0x6a, 0x21, 0x01, 0x41, 0x0d, 0x21, 0x06, 0x20, 0x05, + 0x41, 0x0d, 0x6a, 0x28, 0x00, 0x00, 0x21, 0x05, 0x41, 0x0f, 0x21, 0x03, + 0x0c, 0x02, 0x0b, 0x02, 0x40, 0x02, 0x40, 0x20, 0x03, 0x41, 0x10, 0x4f, + 0x0d, 0x00, 0x20, 0x04, 0x21, 0x02, 0x20, 0x05, 0x21, 0x01, 0x0c, 0x01, + 0x0b, 0x20, 0x04, 0x20, 0x05, 0x2d, 0x00, 0x00, 0x3a, 0x00, 0x00, 0x20, + 0x04, 0x20, 0x05, 0x28, 0x00, 0x01, 0x36, 0x00, 0x01, 0x20, 0x04, 0x20, + 0x05, 0x29, 0x00, 0x05, 0x37, 0x00, 0x05, 0x20, 0x04, 0x20, 0x05, 0x2f, + 0x00, 0x0d, 0x3b, 0x00, 0x0d, 0x20, 0x04, 0x20, 0x05, 0x2d, 0x00, 0x0f, + 0x3a, 0x00, 0x0f, 0x20, 0x04, 0x41, 0x10, 0x6a, 0x21, 0x02, 0x20, 0x05, + 0x41, 0x10, 0x6a, 0x21, 0x01, 0x0b, 0x20, 0x03, 0x41, 0x08, 0x71, 0x0d, + 0x02, 0x0c, 0x03, 0x0b, 0x20, 0x04, 0x20, 0x05, 0x28, 0x02, 0x00, 0x22, + 0x02, 0x3a, 0x00, 0x00, 0x20, 0x04, 0x20, 0x02, 0x41, 0x10, 0x76, 0x3a, + 0x00, 0x02, 0x20, 0x04, 0x20, 0x02, 0x41, 0x08, 0x76, 0x3a, 0x00, 0x01, + 0x20, 0x04, 0x20, 0x05, 0x41, 0x03, 0x6a, 0x28, 0x00, 0x00, 0x36, 0x02, + 0x03, 0x20, 0x04, 0x20, 0x05, 0x41, 0x07, 0x6a, 0x29, 0x00, 0x00, 0x37, + 0x02, 0x07, 0x20, 0x04, 0x41, 0x13, 0x6a, 0x21, 0x02, 0x20, 0x05, 0x41, + 0x13, 0x6a, 0x21, 0x01, 0x41, 0x0f, 0x21, 0x06, 0x20, 0x05, 0x41, 0x0f, + 0x6a, 0x28, 0x00, 0x00, 0x21, 0x05, 0x41, 0x0d, 0x21, 0x03, 0x0b, 0x20, + 0x04, 0x20, 0x06, 0x6a, 0x20, 0x05, 0x36, 0x02, 0x00, 0x0b, 0x20, 0x02, + 0x20, 0x01, 0x29, 0x00, 0x00, 0x37, 0x00, 0x00, 0x20, 0x02, 0x41, 0x08, + 0x6a, 0x21, 0x02, 0x20, 0x01, 0x41, 0x08, 0x6a, 0x21, 0x01, 0x0b, 0x02, + 0x40, 0x20, 0x03, 0x41, 0x04, 0x71, 0x45, 0x0d, 0x00, 0x20, 0x02, 0x20, + 0x01, 0x28, 0x00, 0x00, 0x36, 0x00, 0x00, 0x20, 0x02, 0x41, 0x04, 0x6a, + 0x21, 0x02, 0x20, 0x01, 0x41, 0x04, 0x6a, 0x21, 0x01, 0x0b, 0x02, 0x40, + 0x20, 0x03, 0x41, 0x02, 0x71, 0x45, 0x0d, 0x00, 0x20, 0x02, 0x20, 0x01, + 0x2f, 0x00, 0x00, 0x3b, 0x00, 0x00, 0x20, 0x02, 0x41, 0x02, 0x6a, 0x21, + 0x02, 0x20, 0x01, 0x41, 0x02, 0x6a, 0x21, 0x01, 0x0b, 0x20, 0x03, 0x41, + 0x01, 0x71, 0x45, 0x0d, 0x00, 0x20, 0x02, 0x20, 0x01, 0x2d, 0x00, 0x00, + 0x3a, 0x00, 0x00, 0x0b, 0x20, 0x00, 0x0b, 0x88, 0x03, 0x02, 0x03, 0x7f, + 0x01, 0x7e, 0x02, 0x40, 0x20, 0x02, 0x41, 0x21, 0x49, 0x0d, 0x00, 0x20, + 0x00, 0x20, 0x01, 0x20, 0x02, 0xfc, 0x0b, 0x00, 0x20, 0x00, 0x0f, 0x0b, + 0x02, 0x40, 0x20, 0x02, 0x45, 0x0d, 0x00, 0x20, 0x00, 0x20, 0x01, 0x3a, + 0x00, 0x00, 0x20, 0x02, 0x20, 0x00, 0x6a, 0x22, 0x03, 0x41, 0x7f, 0x6a, + 0x20, 0x01, 0x3a, 0x00, 0x00, 0x20, 0x02, 0x41, 0x03, 0x49, 0x0d, 0x00, + 0x20, 0x00, 0x20, 0x01, 0x3a, 0x00, 0x02, 0x20, 0x00, 0x20, 0x01, 0x3a, + 0x00, 0x01, 0x20, 0x03, 0x41, 0x7d, 0x6a, 0x20, 0x01, 0x3a, 0x00, 0x00, + 0x20, 0x03, 0x41, 0x7e, 0x6a, 0x20, 0x01, 0x3a, 0x00, 0x00, 0x20, 0x02, + 0x41, 0x07, 0x49, 0x0d, 0x00, 0x20, 0x00, 0x20, 0x01, 0x3a, 0x00, 0x03, + 0x20, 0x03, 0x41, 0x7c, 0x6a, 0x20, 0x01, 0x3a, 0x00, 0x00, 0x20, 0x02, + 0x41, 0x09, 0x49, 0x0d, 0x00, 0x20, 0x00, 0x41, 0x00, 0x20, 0x00, 0x6b, + 0x41, 0x03, 0x71, 0x22, 0x04, 0x6a, 0x22, 0x05, 0x20, 0x01, 0x41, 0xff, + 0x01, 0x71, 0x41, 0x81, 0x82, 0x84, 0x08, 0x6c, 0x22, 0x03, 0x36, 0x02, + 0x00, 0x20, 0x05, 0x20, 0x02, 0x20, 0x04, 0x6b, 0x41, 0x7c, 0x71, 0x22, + 0x01, 0x6a, 0x22, 0x02, 0x41, 0x7c, 0x6a, 0x20, 0x03, 0x36, 0x02, 0x00, + 0x20, 0x01, 0x41, 0x09, 0x49, 0x0d, 0x00, 0x20, 0x05, 0x20, 0x03, 0x36, + 0x02, 0x08, 0x20, 0x05, 0x20, 0x03, 0x36, 0x02, 0x04, 0x20, 0x02, 0x41, + 0x78, 0x6a, 0x20, 0x03, 0x36, 0x02, 0x00, 0x20, 0x02, 0x41, 0x74, 0x6a, + 0x20, 0x03, 0x36, 0x02, 0x00, 0x20, 0x01, 0x41, 0x19, 0x49, 0x0d, 0x00, + 0x20, 0x05, 0x20, 0x03, 0x36, 0x02, 0x18, 0x20, 0x05, 0x20, 0x03, 0x36, + 0x02, 0x14, 0x20, 0x05, 0x20, 0x03, 0x36, 0x02, 0x10, 0x20, 0x05, 0x20, + 0x03, 0x36, 0x02, 0x0c, 0x20, 0x02, 0x41, 0x70, 0x6a, 0x20, 0x03, 0x36, + 0x02, 0x00, 0x20, 0x02, 0x41, 0x6c, 0x6a, 0x20, 0x03, 0x36, 0x02, 0x00, + 0x20, 0x02, 0x41, 0x68, 0x6a, 0x20, 0x03, 0x36, 0x02, 0x00, 0x20, 0x02, + 0x41, 0x64, 0x6a, 0x20, 0x03, 0x36, 0x02, 0x00, 0x20, 0x01, 0x20, 0x05, + 0x41, 0x04, 0x71, 0x41, 0x18, 0x72, 0x22, 0x02, 0x6b, 0x22, 0x01, 0x41, + 0x20, 0x49, 0x0d, 0x00, 0x20, 0x03, 0xad, 0x42, 0x81, 0x80, 0x80, 0x80, + 0x10, 0x7e, 0x21, 0x06, 0x20, 0x05, 0x20, 0x02, 0x6a, 0x21, 0x02, 0x03, + 0x40, 0x20, 0x02, 0x20, 0x06, 0x37, 0x03, 0x18, 0x20, 0x02, 0x20, 0x06, + 0x37, 0x03, 0x10, 0x20, 0x02, 0x20, 0x06, 0x37, 0x03, 0x08, 0x20, 0x02, + 0x20, 0x06, 0x37, 0x03, 0x00, 0x20, 0x02, 0x41, 0x20, 0x6a, 0x21, 0x02, + 0x20, 0x01, 0x41, 0x60, 0x6a, 0x22, 0x01, 0x41, 0x1f, 0x4b, 0x0d, 0x00, + 0x0b, 0x0b, 0x20, 0x00, 0x0b, 0xcc, 0x01, 0x01, 0x03, 0x7f, 0x20, 0x00, + 0x21, 0x01, 0x02, 0x40, 0x02, 0x40, 0x20, 0x00, 0x41, 0x03, 0x71, 0x45, + 0x0d, 0x00, 0x02, 0x40, 0x20, 0x00, 0x2d, 0x00, 0x00, 0x0d, 0x00, 0x20, + 0x00, 0x20, 0x00, 0x6b, 0x0f, 0x0b, 0x20, 0x00, 0x41, 0x01, 0x6a, 0x22, + 0x01, 0x41, 0x03, 0x71, 0x45, 0x0d, 0x00, 0x20, 0x01, 0x2d, 0x00, 0x00, + 0x45, 0x0d, 0x01, 0x20, 0x00, 0x41, 0x02, 0x6a, 0x22, 0x01, 0x41, 0x03, + 0x71, 0x45, 0x0d, 0x00, 0x20, 0x01, 0x2d, 0x00, 0x00, 0x45, 0x0d, 0x01, + 0x20, 0x00, 0x41, 0x03, 0x6a, 0x22, 0x01, 0x41, 0x03, 0x71, 0x45, 0x0d, + 0x00, 0x20, 0x01, 0x2d, 0x00, 0x00, 0x45, 0x0d, 0x01, 0x20, 0x00, 0x41, + 0x04, 0x6a, 0x22, 0x01, 0x41, 0x03, 0x71, 0x0d, 0x01, 0x0b, 0x20, 0x01, + 0x41, 0x7c, 0x6a, 0x21, 0x02, 0x20, 0x01, 0x41, 0x7b, 0x6a, 0x21, 0x01, + 0x03, 0x40, 0x20, 0x01, 0x41, 0x04, 0x6a, 0x21, 0x01, 0x20, 0x02, 0x41, + 0x04, 0x6a, 0x22, 0x02, 0x28, 0x02, 0x00, 0x22, 0x03, 0x41, 0x7f, 0x73, + 0x20, 0x03, 0x41, 0xff, 0xfd, 0xfb, 0x77, 0x6a, 0x71, 0x41, 0x80, 0x81, + 0x82, 0x84, 0x78, 0x71, 0x45, 0x0d, 0x00, 0x0b, 0x03, 0x40, 0x20, 0x01, + 0x41, 0x01, 0x6a, 0x21, 0x01, 0x20, 0x02, 0x2d, 0x00, 0x00, 0x21, 0x03, + 0x20, 0x02, 0x41, 0x01, 0x6a, 0x21, 0x02, 0x20, 0x03, 0x0d, 0x00, 0x0b, + 0x0b, 0x20, 0x01, 0x20, 0x00, 0x6b, 0x0b, 0xf2, 0x02, 0x01, 0x03, 0x7f, + 0x20, 0x02, 0x41, 0x00, 0x47, 0x21, 0x03, 0x02, 0x40, 0x02, 0x40, 0x02, + 0x40, 0x02, 0x40, 0x20, 0x00, 0x41, 0x03, 0x71, 0x45, 0x0d, 0x00, 0x20, + 0x02, 0x45, 0x0d, 0x00, 0x02, 0x40, 0x20, 0x00, 0x2d, 0x00, 0x00, 0x20, + 0x01, 0x41, 0xff, 0x01, 0x71, 0x47, 0x0d, 0x00, 0x20, 0x00, 0x21, 0x04, + 0x20, 0x02, 0x21, 0x05, 0x0c, 0x03, 0x0b, 0x20, 0x02, 0x41, 0x7f, 0x6a, + 0x22, 0x05, 0x41, 0x00, 0x47, 0x21, 0x03, 0x20, 0x00, 0x41, 0x01, 0x6a, + 0x22, 0x04, 0x41, 0x03, 0x71, 0x45, 0x0d, 0x01, 0x20, 0x05, 0x45, 0x0d, + 0x01, 0x20, 0x04, 0x2d, 0x00, 0x00, 0x20, 0x01, 0x41, 0xff, 0x01, 0x71, + 0x46, 0x0d, 0x02, 0x20, 0x02, 0x41, 0x7e, 0x6a, 0x22, 0x05, 0x41, 0x00, + 0x47, 0x21, 0x03, 0x20, 0x00, 0x41, 0x02, 0x6a, 0x22, 0x04, 0x41, 0x03, + 0x71, 0x45, 0x0d, 0x01, 0x20, 0x05, 0x45, 0x0d, 0x01, 0x20, 0x04, 0x2d, + 0x00, 0x00, 0x20, 0x01, 0x41, 0xff, 0x01, 0x71, 0x46, 0x0d, 0x02, 0x20, + 0x02, 0x41, 0x7d, 0x6a, 0x22, 0x05, 0x41, 0x00, 0x47, 0x21, 0x03, 0x20, + 0x00, 0x41, 0x03, 0x6a, 0x22, 0x04, 0x41, 0x03, 0x71, 0x45, 0x0d, 0x01, + 0x20, 0x05, 0x45, 0x0d, 0x01, 0x20, 0x04, 0x2d, 0x00, 0x00, 0x20, 0x01, + 0x41, 0xff, 0x01, 0x71, 0x46, 0x0d, 0x02, 0x20, 0x00, 0x41, 0x04, 0x6a, + 0x21, 0x04, 0x20, 0x02, 0x41, 0x7c, 0x6a, 0x22, 0x05, 0x41, 0x00, 0x47, + 0x21, 0x03, 0x0c, 0x01, 0x0b, 0x20, 0x02, 0x21, 0x05, 0x20, 0x00, 0x21, + 0x04, 0x0b, 0x20, 0x03, 0x45, 0x0d, 0x01, 0x02, 0x40, 0x20, 0x04, 0x2d, + 0x00, 0x00, 0x20, 0x01, 0x41, 0xff, 0x01, 0x71, 0x46, 0x0d, 0x00, 0x20, + 0x05, 0x41, 0x04, 0x49, 0x0d, 0x00, 0x20, 0x01, 0x41, 0xff, 0x01, 0x71, + 0x41, 0x81, 0x82, 0x84, 0x08, 0x6c, 0x21, 0x00, 0x03, 0x40, 0x20, 0x04, + 0x28, 0x02, 0x00, 0x20, 0x00, 0x73, 0x22, 0x02, 0x41, 0x7f, 0x73, 0x20, + 0x02, 0x41, 0xff, 0xfd, 0xfb, 0x77, 0x6a, 0x71, 0x41, 0x80, 0x81, 0x82, + 0x84, 0x78, 0x71, 0x0d, 0x02, 0x20, 0x04, 0x41, 0x04, 0x6a, 0x21, 0x04, + 0x20, 0x05, 0x41, 0x7c, 0x6a, 0x22, 0x05, 0x41, 0x03, 0x4b, 0x0d, 0x00, + 0x0b, 0x0b, 0x20, 0x05, 0x45, 0x0d, 0x01, 0x0b, 0x20, 0x01, 0x41, 0xff, + 0x01, 0x71, 0x21, 0x02, 0x03, 0x40, 0x02, 0x40, 0x20, 0x04, 0x2d, 0x00, + 0x00, 0x20, 0x02, 0x47, 0x0d, 0x00, 0x20, 0x04, 0x0f, 0x0b, 0x20, 0x04, + 0x41, 0x01, 0x6a, 0x21, 0x04, 0x20, 0x05, 0x41, 0x7f, 0x6a, 0x22, 0x05, + 0x0d, 0x00, 0x0b, 0x0b, 0x41, 0x00, 0x0b, 0x1a, 0x01, 0x01, 0x7f, 0x20, + 0x00, 0x41, 0x00, 0x20, 0x01, 0x10, 0xc2, 0x80, 0x80, 0x80, 0x00, 0x22, + 0x02, 0x20, 0x00, 0x6b, 0x20, 0x01, 0x20, 0x02, 0x1b, 0x0b, 0x37, 0x01, + 0x01, 0x7f, 0x23, 0x80, 0x80, 0x80, 0x80, 0x00, 0x41, 0x10, 0x6b, 0x22, + 0x03, 0x24, 0x80, 0x80, 0x80, 0x80, 0x00, 0x20, 0x03, 0x20, 0x02, 0x36, + 0x02, 0x0c, 0x20, 0x00, 0x20, 0x01, 0x20, 0x02, 0x10, 0xba, 0x80, 0x80, + 0x80, 0x00, 0x21, 0x02, 0x20, 0x03, 0x41, 0x10, 0x6a, 0x24, 0x80, 0x80, + 0x80, 0x80, 0x00, 0x20, 0x02, 0x0b, 0x4d, 0x01, 0x01, 0x7f, 0x23, 0x80, + 0x80, 0x80, 0x80, 0x00, 0x41, 0x10, 0x6b, 0x22, 0x04, 0x24, 0x80, 0x80, + 0x80, 0x80, 0x00, 0x20, 0x04, 0x20, 0x02, 0x36, 0x02, 0x0c, 0x20, 0x04, + 0x20, 0x03, 0x36, 0x02, 0x08, 0x20, 0x04, 0x20, 0x01, 0x36, 0x02, 0x04, + 0x20, 0x04, 0x20, 0x00, 0x36, 0x02, 0x00, 0x41, 0xf8, 0x9e, 0x80, 0x80, + 0x00, 0x41, 0x90, 0x8c, 0x80, 0x80, 0x00, 0x20, 0x04, 0x10, 0xc4, 0x80, + 0x80, 0x80, 0x00, 0x1a, 0x10, 0xa0, 0x80, 0x80, 0x80, 0x00, 0x00, 0x0b, + 0x8e, 0x01, 0x01, 0x01, 0x7f, 0x23, 0x80, 0x80, 0x80, 0x80, 0x00, 0x41, + 0x10, 0x6b, 0x22, 0x04, 0x24, 0x80, 0x80, 0x80, 0x80, 0x00, 0x02, 0x40, + 0x02, 0x40, 0x20, 0x03, 0x41, 0x04, 0x49, 0x0d, 0x00, 0x41, 0x00, 0x41, + 0x3a, 0x36, 0x02, 0x80, 0xa8, 0x80, 0x80, 0x00, 0x41, 0x7f, 0x21, 0x03, + 0x0c, 0x01, 0x0b, 0x20, 0x04, 0x20, 0x02, 0x36, 0x02, 0x0c, 0x20, 0x04, + 0x20, 0x01, 0x36, 0x02, 0x08, 0x02, 0x40, 0x20, 0x00, 0x20, 0x04, 0x41, + 0x08, 0x6a, 0x41, 0x01, 0x20, 0x03, 0x41, 0xff, 0xff, 0x03, 0x71, 0x20, + 0x04, 0x41, 0x04, 0x6a, 0x20, 0x04, 0x41, 0x02, 0x6a, 0x10, 0x9f, 0x80, + 0x80, 0x80, 0x00, 0x22, 0x03, 0x45, 0x0d, 0x00, 0x41, 0x00, 0x20, 0x03, + 0x36, 0x02, 0x80, 0xa8, 0x80, 0x80, 0x00, 0x41, 0x7f, 0x21, 0x03, 0x0c, + 0x01, 0x0b, 0x20, 0x04, 0x28, 0x02, 0x04, 0x21, 0x03, 0x0b, 0x20, 0x04, + 0x41, 0x10, 0x6a, 0x24, 0x80, 0x80, 0x80, 0x80, 0x00, 0x20, 0x03, 0x0b, + 0x12, 0x00, 0x20, 0x00, 0x41, 0x08, 0x74, 0x20, 0x00, 0x41, 0x08, 0x76, + 0x72, 0x41, 0xff, 0xff, 0x03, 0x71, 0x0b, 0x23, 0x00, 0x20, 0x00, 0x41, + 0x18, 0x74, 0x20, 0x00, 0x41, 0x80, 0xfe, 0x03, 0x71, 0x41, 0x08, 0x74, + 0x72, 0x20, 0x00, 0x41, 0x08, 0x76, 0x41, 0x80, 0xfe, 0x03, 0x71, 0x20, + 0x00, 0x41, 0x18, 0x76, 0x72, 0x72, 0x0b, 0xe4, 0x09, 0x11, 0x06, 0x7f, + 0x01, 0x7e, 0x22, 0x7f, 0x01, 0x7e, 0x02, 0x7f, 0x01, 0x7e, 0x04, 0x7f, + 0x01, 0x7e, 0x3e, 0x7f, 0x01, 0x7e, 0x02, 0x7f, 0x01, 0x7e, 0x05, 0x7f, + 0x01, 0x7e, 0x05, 0x7f, 0x01, 0x7e, 0x09, 0x7f, 0x23, 0x80, 0x80, 0x80, + 0x80, 0x00, 0x21, 0x03, 0x41, 0xe0, 0x00, 0x21, 0x04, 0x20, 0x03, 0x20, + 0x04, 0x6b, 0x21, 0x05, 0x20, 0x05, 0x24, 0x80, 0x80, 0x80, 0x80, 0x00, + 0x20, 0x05, 0x20, 0x00, 0x36, 0x02, 0x58, 0x20, 0x05, 0x20, 0x01, 0x36, + 0x02, 0x54, 0x20, 0x05, 0x20, 0x02, 0x36, 0x02, 0x50, 0x20, 0x05, 0x28, + 0x02, 0x58, 0x21, 0x06, 0x20, 0x06, 0x28, 0x02, 0x00, 0x21, 0x07, 0x41, + 0x01, 0x21, 0x08, 0x20, 0x07, 0x20, 0x08, 0x4b, 0x1a, 0x02, 0x40, 0x02, + 0x40, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, 0x20, 0x07, 0x0e, 0x02, 0x00, + 0x01, 0x02, 0x0b, 0x42, 0x00, 0x21, 0x09, 0x20, 0x05, 0x20, 0x09, 0x37, + 0x03, 0x48, 0x20, 0x05, 0x20, 0x09, 0x37, 0x03, 0x40, 0x20, 0x05, 0x28, + 0x02, 0x58, 0x21, 0x0a, 0x20, 0x0a, 0x2d, 0x00, 0x04, 0x21, 0x0b, 0x41, + 0xff, 0x01, 0x21, 0x0c, 0x20, 0x0b, 0x20, 0x0c, 0x71, 0x21, 0x0d, 0x41, + 0x18, 0x21, 0x0e, 0x20, 0x0d, 0x20, 0x0e, 0x74, 0x21, 0x0f, 0x20, 0x05, + 0x28, 0x02, 0x58, 0x21, 0x10, 0x20, 0x10, 0x2d, 0x00, 0x05, 0x21, 0x11, + 0x41, 0xff, 0x01, 0x21, 0x12, 0x20, 0x11, 0x20, 0x12, 0x71, 0x21, 0x13, + 0x41, 0x10, 0x21, 0x14, 0x20, 0x13, 0x20, 0x14, 0x74, 0x21, 0x15, 0x20, + 0x0f, 0x20, 0x15, 0x72, 0x21, 0x16, 0x20, 0x05, 0x28, 0x02, 0x58, 0x21, + 0x17, 0x20, 0x17, 0x2d, 0x00, 0x06, 0x21, 0x18, 0x41, 0xff, 0x01, 0x21, + 0x19, 0x20, 0x18, 0x20, 0x19, 0x71, 0x21, 0x1a, 0x41, 0x08, 0x21, 0x1b, + 0x20, 0x1a, 0x20, 0x1b, 0x74, 0x21, 0x1c, 0x20, 0x16, 0x20, 0x1c, 0x72, + 0x21, 0x1d, 0x20, 0x05, 0x28, 0x02, 0x58, 0x21, 0x1e, 0x20, 0x1e, 0x2d, + 0x00, 0x07, 0x21, 0x1f, 0x41, 0xff, 0x01, 0x21, 0x20, 0x20, 0x1f, 0x20, + 0x20, 0x71, 0x21, 0x21, 0x20, 0x1d, 0x20, 0x21, 0x72, 0x21, 0x22, 0x20, + 0x05, 0x20, 0x22, 0x36, 0x02, 0x3c, 0x41, 0x01, 0x21, 0x23, 0x20, 0x05, + 0x20, 0x23, 0x3b, 0x01, 0x40, 0x20, 0x05, 0x28, 0x02, 0x3c, 0x21, 0x24, + 0x20, 0x24, 0x10, 0xa4, 0x80, 0x80, 0x80, 0x00, 0x21, 0x25, 0x20, 0x05, + 0x20, 0x25, 0x36, 0x02, 0x44, 0x20, 0x05, 0x28, 0x02, 0x58, 0x21, 0x26, + 0x20, 0x26, 0x2f, 0x01, 0x08, 0x21, 0x27, 0x41, 0xff, 0xff, 0x03, 0x21, + 0x28, 0x20, 0x27, 0x20, 0x28, 0x71, 0x21, 0x29, 0x20, 0x29, 0x10, 0xa5, + 0x80, 0x80, 0x80, 0x00, 0x21, 0x2a, 0x20, 0x05, 0x20, 0x2a, 0x3b, 0x01, + 0x42, 0x20, 0x05, 0x28, 0x02, 0x54, 0x21, 0x2b, 0x20, 0x05, 0x29, 0x03, + 0x40, 0x21, 0x2c, 0x20, 0x2b, 0x20, 0x2c, 0x37, 0x03, 0x00, 0x41, 0x08, + 0x21, 0x2d, 0x20, 0x2b, 0x20, 0x2d, 0x6a, 0x21, 0x2e, 0x20, 0x05, 0x29, + 0x03, 0x48, 0x21, 0x2f, 0x20, 0x2e, 0x20, 0x2f, 0x37, 0x03, 0x00, 0x20, + 0x05, 0x28, 0x02, 0x50, 0x21, 0x30, 0x41, 0x10, 0x21, 0x31, 0x20, 0x30, + 0x20, 0x31, 0x36, 0x02, 0x00, 0x0c, 0x02, 0x0b, 0x41, 0x28, 0x21, 0x32, + 0x20, 0x05, 0x20, 0x32, 0x6a, 0x21, 0x33, 0x42, 0x00, 0x21, 0x34, 0x20, + 0x33, 0x20, 0x34, 0x37, 0x03, 0x00, 0x41, 0x20, 0x21, 0x35, 0x20, 0x05, + 0x20, 0x35, 0x6a, 0x21, 0x36, 0x20, 0x36, 0x20, 0x34, 0x37, 0x03, 0x00, + 0x20, 0x05, 0x20, 0x34, 0x37, 0x03, 0x18, 0x20, 0x05, 0x20, 0x34, 0x37, + 0x03, 0x10, 0x41, 0x10, 0x21, 0x37, 0x20, 0x05, 0x20, 0x37, 0x6a, 0x21, + 0x38, 0x20, 0x38, 0x21, 0x39, 0x41, 0x08, 0x21, 0x3a, 0x20, 0x39, 0x20, + 0x3a, 0x6a, 0x21, 0x3b, 0x20, 0x05, 0x20, 0x3b, 0x36, 0x02, 0x0c, 0x20, + 0x05, 0x28, 0x02, 0x58, 0x21, 0x3c, 0x20, 0x3c, 0x2f, 0x01, 0x04, 0x21, + 0x3d, 0x41, 0xff, 0xff, 0x03, 0x21, 0x3e, 0x20, 0x3d, 0x20, 0x3e, 0x71, + 0x21, 0x3f, 0x20, 0x3f, 0x10, 0xa5, 0x80, 0x80, 0x80, 0x00, 0x21, 0x40, + 0x20, 0x05, 0x28, 0x02, 0x0c, 0x21, 0x41, 0x20, 0x41, 0x20, 0x40, 0x3b, + 0x01, 0x00, 0x20, 0x05, 0x28, 0x02, 0x58, 0x21, 0x42, 0x20, 0x42, 0x2f, + 0x01, 0x06, 0x21, 0x43, 0x41, 0xff, 0xff, 0x03, 0x21, 0x44, 0x20, 0x43, + 0x20, 0x44, 0x71, 0x21, 0x45, 0x20, 0x45, 0x10, 0xa5, 0x80, 0x80, 0x80, + 0x00, 0x21, 0x46, 0x20, 0x05, 0x28, 0x02, 0x0c, 0x21, 0x47, 0x20, 0x47, + 0x20, 0x46, 0x3b, 0x01, 0x02, 0x20, 0x05, 0x28, 0x02, 0x58, 0x21, 0x48, + 0x20, 0x48, 0x2f, 0x01, 0x08, 0x21, 0x49, 0x41, 0xff, 0xff, 0x03, 0x21, + 0x4a, 0x20, 0x49, 0x20, 0x4a, 0x71, 0x21, 0x4b, 0x20, 0x4b, 0x10, 0xa5, + 0x80, 0x80, 0x80, 0x00, 0x21, 0x4c, 0x20, 0x05, 0x28, 0x02, 0x0c, 0x21, + 0x4d, 0x20, 0x4d, 0x20, 0x4c, 0x3b, 0x01, 0x04, 0x20, 0x05, 0x28, 0x02, + 0x58, 0x21, 0x4e, 0x20, 0x4e, 0x2f, 0x01, 0x0a, 0x21, 0x4f, 0x41, 0xff, + 0xff, 0x03, 0x21, 0x50, 0x20, 0x4f, 0x20, 0x50, 0x71, 0x21, 0x51, 0x20, + 0x51, 0x10, 0xa5, 0x80, 0x80, 0x80, 0x00, 0x21, 0x52, 0x20, 0x05, 0x28, + 0x02, 0x0c, 0x21, 0x53, 0x20, 0x53, 0x20, 0x52, 0x3b, 0x01, 0x06, 0x20, + 0x05, 0x28, 0x02, 0x58, 0x21, 0x54, 0x20, 0x54, 0x2f, 0x01, 0x0c, 0x21, + 0x55, 0x41, 0xff, 0xff, 0x03, 0x21, 0x56, 0x20, 0x55, 0x20, 0x56, 0x71, + 0x21, 0x57, 0x20, 0x57, 0x10, 0xa5, 0x80, 0x80, 0x80, 0x00, 0x21, 0x58, + 0x20, 0x05, 0x28, 0x02, 0x0c, 0x21, 0x59, 0x20, 0x59, 0x20, 0x58, 0x3b, + 0x01, 0x08, 0x20, 0x05, 0x28, 0x02, 0x58, 0x21, 0x5a, 0x20, 0x5a, 0x2f, + 0x01, 0x0e, 0x21, 0x5b, 0x41, 0xff, 0xff, 0x03, 0x21, 0x5c, 0x20, 0x5b, + 0x20, 0x5c, 0x71, 0x21, 0x5d, 0x20, 0x5d, 0x10, 0xa5, 0x80, 0x80, 0x80, + 0x00, 0x21, 0x5e, 0x20, 0x05, 0x28, 0x02, 0x0c, 0x21, 0x5f, 0x20, 0x5f, + 0x20, 0x5e, 0x3b, 0x01, 0x0a, 0x20, 0x05, 0x28, 0x02, 0x58, 0x21, 0x60, + 0x20, 0x60, 0x2f, 0x01, 0x10, 0x21, 0x61, 0x41, 0xff, 0xff, 0x03, 0x21, + 0x62, 0x20, 0x61, 0x20, 0x62, 0x71, 0x21, 0x63, 0x20, 0x63, 0x10, 0xa5, + 0x80, 0x80, 0x80, 0x00, 0x21, 0x64, 0x20, 0x05, 0x28, 0x02, 0x0c, 0x21, + 0x65, 0x20, 0x65, 0x20, 0x64, 0x3b, 0x01, 0x0c, 0x20, 0x05, 0x28, 0x02, + 0x58, 0x21, 0x66, 0x20, 0x66, 0x2f, 0x01, 0x12, 0x21, 0x67, 0x41, 0xff, + 0xff, 0x03, 0x21, 0x68, 0x20, 0x67, 0x20, 0x68, 0x71, 0x21, 0x69, 0x20, + 0x69, 0x10, 0xa5, 0x80, 0x80, 0x80, 0x00, 0x21, 0x6a, 0x20, 0x05, 0x28, + 0x02, 0x0c, 0x21, 0x6b, 0x20, 0x6b, 0x20, 0x6a, 0x3b, 0x01, 0x0e, 0x41, + 0x02, 0x21, 0x6c, 0x20, 0x05, 0x20, 0x6c, 0x3b, 0x01, 0x10, 0x20, 0x05, + 0x28, 0x02, 0x58, 0x21, 0x6d, 0x20, 0x6d, 0x2f, 0x01, 0x14, 0x21, 0x6e, + 0x41, 0xff, 0xff, 0x03, 0x21, 0x6f, 0x20, 0x6e, 0x20, 0x6f, 0x71, 0x21, + 0x70, 0x20, 0x70, 0x10, 0xa5, 0x80, 0x80, 0x80, 0x00, 0x21, 0x71, 0x20, + 0x05, 0x20, 0x71, 0x3b, 0x01, 0x12, 0x20, 0x05, 0x28, 0x02, 0x54, 0x21, + 0x72, 0x20, 0x05, 0x29, 0x03, 0x10, 0x21, 0x73, 0x20, 0x72, 0x20, 0x73, + 0x37, 0x03, 0x00, 0x41, 0x08, 0x21, 0x74, 0x20, 0x72, 0x20, 0x74, 0x6a, + 0x21, 0x75, 0x20, 0x05, 0x29, 0x03, 0x18, 0x21, 0x76, 0x20, 0x75, 0x20, + 0x76, 0x37, 0x03, 0x00, 0x41, 0x18, 0x21, 0x77, 0x20, 0x72, 0x20, 0x77, + 0x6a, 0x21, 0x78, 0x41, 0x10, 0x21, 0x79, 0x20, 0x05, 0x20, 0x79, 0x6a, + 0x21, 0x7a, 0x20, 0x7a, 0x20, 0x77, 0x6a, 0x21, 0x7b, 0x20, 0x7b, 0x29, + 0x03, 0x00, 0x21, 0x7c, 0x20, 0x78, 0x20, 0x7c, 0x37, 0x03, 0x00, 0x41, + 0x10, 0x21, 0x7d, 0x20, 0x72, 0x20, 0x7d, 0x6a, 0x21, 0x7e, 0x41, 0x10, + 0x21, 0x7f, 0x20, 0x05, 0x20, 0x7f, 0x6a, 0x21, 0x80, 0x01, 0x20, 0x80, + 0x01, 0x20, 0x7d, 0x6a, 0x21, 0x81, 0x01, 0x20, 0x81, 0x01, 0x29, 0x03, + 0x00, 0x21, 0x82, 0x01, 0x20, 0x7e, 0x20, 0x82, 0x01, 0x37, 0x03, 0x00, + 0x20, 0x05, 0x28, 0x02, 0x50, 0x21, 0x83, 0x01, 0x41, 0x20, 0x21, 0x84, + 0x01, 0x20, 0x83, 0x01, 0x20, 0x84, 0x01, 0x36, 0x02, 0x00, 0x0c, 0x01, + 0x0b, 0x41, 0x05, 0x21, 0x85, 0x01, 0x20, 0x05, 0x20, 0x85, 0x01, 0x3b, + 0x01, 0x5e, 0x0c, 0x01, 0x0b, 0x41, 0x00, 0x21, 0x86, 0x01, 0x20, 0x05, + 0x20, 0x86, 0x01, 0x3b, 0x01, 0x5e, 0x0b, 0x20, 0x05, 0x2f, 0x01, 0x5e, + 0x21, 0x87, 0x01, 0x41, 0xff, 0xff, 0x03, 0x21, 0x88, 0x01, 0x20, 0x87, + 0x01, 0x20, 0x88, 0x01, 0x71, 0x21, 0x89, 0x01, 0x41, 0xe0, 0x00, 0x21, + 0x8a, 0x01, 0x20, 0x05, 0x20, 0x8a, 0x01, 0x6a, 0x21, 0x8b, 0x01, 0x20, + 0x8b, 0x01, 0x24, 0x80, 0x80, 0x80, 0x80, 0x00, 0x20, 0x89, 0x01, 0x0f, + 0x0b, 0xac, 0x04, 0x01, 0x43, 0x7f, 0x23, 0x80, 0x80, 0x80, 0x80, 0x00, + 0x21, 0x03, 0x41, 0x10, 0x21, 0x04, 0x20, 0x03, 0x20, 0x04, 0x6b, 0x21, + 0x05, 0x20, 0x05, 0x24, 0x80, 0x80, 0x80, 0x80, 0x00, 0x20, 0x05, 0x20, + 0x00, 0x36, 0x02, 0x0c, 0x20, 0x05, 0x20, 0x01, 0x36, 0x02, 0x08, 0x20, + 0x05, 0x20, 0x02, 0x36, 0x02, 0x04, 0x41, 0x00, 0x21, 0x06, 0x20, 0x05, + 0x20, 0x06, 0x3b, 0x01, 0x02, 0x20, 0x05, 0x28, 0x02, 0x0c, 0x21, 0x07, + 0x20, 0x07, 0x2f, 0x01, 0x00, 0x21, 0x08, 0x41, 0xff, 0xff, 0x03, 0x21, + 0x09, 0x20, 0x08, 0x20, 0x09, 0x71, 0x21, 0x0a, 0x41, 0x01, 0x21, 0x0b, + 0x20, 0x0b, 0x21, 0x0c, 0x20, 0x0a, 0x21, 0x0d, 0x20, 0x0c, 0x20, 0x0d, + 0x46, 0x21, 0x0e, 0x41, 0x01, 0x21, 0x0f, 0x20, 0x0e, 0x20, 0x0f, 0x71, + 0x21, 0x10, 0x02, 0x40, 0x02, 0x40, 0x20, 0x10, 0x45, 0x0d, 0x00, 0x20, + 0x05, 0x28, 0x02, 0x08, 0x21, 0x11, 0x41, 0x10, 0x21, 0x12, 0x20, 0x12, + 0x21, 0x13, 0x20, 0x11, 0x21, 0x14, 0x20, 0x13, 0x20, 0x14, 0x4d, 0x21, + 0x15, 0x41, 0x01, 0x21, 0x16, 0x20, 0x15, 0x20, 0x16, 0x71, 0x21, 0x17, + 0x02, 0x40, 0x20, 0x17, 0x0d, 0x00, 0x41, 0xb6, 0x88, 0x80, 0x80, 0x00, + 0x21, 0x18, 0x41, 0x8b, 0x89, 0x80, 0x80, 0x00, 0x21, 0x19, 0x41, 0xc4, + 0x00, 0x21, 0x1a, 0x41, 0xa0, 0x88, 0x80, 0x80, 0x00, 0x21, 0x1b, 0x20, + 0x18, 0x20, 0x19, 0x20, 0x1a, 0x20, 0x1b, 0x10, 0xc5, 0x80, 0x80, 0x80, + 0x00, 0x00, 0x0b, 0x20, 0x05, 0x28, 0x02, 0x0c, 0x21, 0x1c, 0x20, 0x1c, + 0x28, 0x02, 0x04, 0x21, 0x1d, 0x20, 0x05, 0x28, 0x02, 0x0c, 0x21, 0x1e, + 0x20, 0x1e, 0x2f, 0x01, 0x02, 0x21, 0x1f, 0x20, 0x05, 0x28, 0x02, 0x04, + 0x21, 0x20, 0x41, 0xff, 0xff, 0x03, 0x21, 0x21, 0x20, 0x1f, 0x20, 0x21, + 0x71, 0x21, 0x22, 0x20, 0x1d, 0x20, 0x22, 0x20, 0x20, 0x10, 0xcb, 0x80, + 0x80, 0x80, 0x00, 0x0c, 0x01, 0x0b, 0x20, 0x05, 0x28, 0x02, 0x0c, 0x21, + 0x23, 0x20, 0x23, 0x2f, 0x01, 0x00, 0x21, 0x24, 0x41, 0xff, 0xff, 0x03, + 0x21, 0x25, 0x20, 0x24, 0x20, 0x25, 0x71, 0x21, 0x26, 0x41, 0x02, 0x21, + 0x27, 0x20, 0x27, 0x21, 0x28, 0x20, 0x26, 0x21, 0x29, 0x20, 0x28, 0x20, + 0x29, 0x46, 0x21, 0x2a, 0x41, 0x01, 0x21, 0x2b, 0x20, 0x2a, 0x20, 0x2b, + 0x71, 0x21, 0x2c, 0x02, 0x40, 0x02, 0x40, 0x20, 0x2c, 0x45, 0x0d, 0x00, + 0x20, 0x05, 0x28, 0x02, 0x08, 0x21, 0x2d, 0x41, 0x20, 0x21, 0x2e, 0x20, + 0x2e, 0x21, 0x2f, 0x20, 0x2d, 0x21, 0x30, 0x20, 0x2f, 0x20, 0x30, 0x4d, + 0x21, 0x31, 0x41, 0x01, 0x21, 0x32, 0x20, 0x31, 0x20, 0x32, 0x71, 0x21, + 0x33, 0x02, 0x40, 0x20, 0x33, 0x0d, 0x00, 0x41, 0xdc, 0x88, 0x80, 0x80, + 0x00, 0x21, 0x34, 0x41, 0x8b, 0x89, 0x80, 0x80, 0x00, 0x21, 0x35, 0x41, + 0xcb, 0x00, 0x21, 0x36, 0x41, 0xa0, 0x88, 0x80, 0x80, 0x00, 0x21, 0x37, + 0x20, 0x34, 0x20, 0x35, 0x20, 0x36, 0x20, 0x37, 0x10, 0xc5, 0x80, 0x80, + 0x80, 0x00, 0x00, 0x0b, 0x20, 0x05, 0x28, 0x02, 0x0c, 0x21, 0x38, 0x41, + 0x08, 0x21, 0x39, 0x20, 0x38, 0x20, 0x39, 0x6a, 0x21, 0x3a, 0x20, 0x05, + 0x28, 0x02, 0x0c, 0x21, 0x3b, 0x20, 0x3b, 0x2f, 0x01, 0x02, 0x21, 0x3c, + 0x20, 0x05, 0x28, 0x02, 0x04, 0x21, 0x3d, 0x41, 0xff, 0xff, 0x03, 0x21, + 0x3e, 0x20, 0x3c, 0x20, 0x3e, 0x71, 0x21, 0x3f, 0x20, 0x3a, 0x20, 0x3f, + 0x20, 0x3d, 0x10, 0xcc, 0x80, 0x80, 0x80, 0x00, 0x0c, 0x01, 0x0b, 0x41, + 0x05, 0x21, 0x40, 0x20, 0x05, 0x20, 0x40, 0x3b, 0x01, 0x02, 0x0b, 0x0b, + 0x20, 0x05, 0x2f, 0x01, 0x02, 0x21, 0x41, 0x41, 0xff, 0xff, 0x03, 0x21, + 0x42, 0x20, 0x41, 0x20, 0x42, 0x71, 0x21, 0x43, 0x41, 0x10, 0x21, 0x44, + 0x20, 0x05, 0x20, 0x44, 0x6a, 0x21, 0x45, 0x20, 0x45, 0x24, 0x80, 0x80, + 0x80, 0x80, 0x00, 0x20, 0x43, 0x0f, 0x0b, 0xa9, 0x01, 0x01, 0x10, 0x7f, + 0x23, 0x80, 0x80, 0x80, 0x80, 0x00, 0x21, 0x03, 0x41, 0x10, 0x21, 0x04, + 0x20, 0x03, 0x20, 0x04, 0x6b, 0x21, 0x05, 0x20, 0x05, 0x24, 0x80, 0x80, + 0x80, 0x80, 0x00, 0x20, 0x05, 0x20, 0x00, 0x36, 0x02, 0x0c, 0x20, 0x05, + 0x20, 0x01, 0x3b, 0x01, 0x0a, 0x20, 0x05, 0x20, 0x02, 0x36, 0x02, 0x04, + 0x20, 0x05, 0x28, 0x02, 0x04, 0x21, 0x06, 0x41, 0x00, 0x21, 0x07, 0x20, + 0x06, 0x20, 0x07, 0x36, 0x02, 0x00, 0x20, 0x05, 0x2f, 0x01, 0x0a, 0x21, + 0x08, 0x41, 0xff, 0xff, 0x03, 0x21, 0x09, 0x20, 0x08, 0x20, 0x09, 0x71, + 0x21, 0x0a, 0x20, 0x0a, 0x10, 0xc7, 0x80, 0x80, 0x80, 0x00, 0x21, 0x0b, + 0x20, 0x05, 0x28, 0x02, 0x04, 0x21, 0x0c, 0x20, 0x0c, 0x20, 0x0b, 0x3b, + 0x01, 0x08, 0x20, 0x05, 0x28, 0x02, 0x0c, 0x21, 0x0d, 0x20, 0x05, 0x28, + 0x02, 0x04, 0x21, 0x0e, 0x41, 0x04, 0x21, 0x0f, 0x20, 0x0e, 0x20, 0x0f, + 0x6a, 0x21, 0x10, 0x20, 0x0d, 0x20, 0x10, 0x10, 0xd5, 0x80, 0x80, 0x80, + 0x00, 0x41, 0x10, 0x21, 0x11, 0x20, 0x05, 0x20, 0x11, 0x6a, 0x21, 0x12, + 0x20, 0x12, 0x24, 0x80, 0x80, 0x80, 0x80, 0x00, 0x0f, 0x0b, 0xa9, 0x01, + 0x01, 0x10, 0x7f, 0x23, 0x80, 0x80, 0x80, 0x80, 0x00, 0x21, 0x03, 0x41, + 0x10, 0x21, 0x04, 0x20, 0x03, 0x20, 0x04, 0x6b, 0x21, 0x05, 0x20, 0x05, + 0x24, 0x80, 0x80, 0x80, 0x80, 0x00, 0x20, 0x05, 0x20, 0x00, 0x36, 0x02, + 0x0c, 0x20, 0x05, 0x20, 0x01, 0x3b, 0x01, 0x0a, 0x20, 0x05, 0x20, 0x02, + 0x36, 0x02, 0x04, 0x20, 0x05, 0x28, 0x02, 0x04, 0x21, 0x06, 0x41, 0x01, + 0x21, 0x07, 0x20, 0x06, 0x20, 0x07, 0x36, 0x02, 0x00, 0x20, 0x05, 0x2f, + 0x01, 0x0a, 0x21, 0x08, 0x41, 0xff, 0xff, 0x03, 0x21, 0x09, 0x20, 0x08, + 0x20, 0x09, 0x71, 0x21, 0x0a, 0x20, 0x0a, 0x10, 0xc7, 0x80, 0x80, 0x80, + 0x00, 0x21, 0x0b, 0x20, 0x05, 0x28, 0x02, 0x04, 0x21, 0x0c, 0x20, 0x0c, + 0x20, 0x0b, 0x3b, 0x01, 0x14, 0x20, 0x05, 0x28, 0x02, 0x0c, 0x21, 0x0d, + 0x20, 0x05, 0x28, 0x02, 0x04, 0x21, 0x0e, 0x41, 0x04, 0x21, 0x0f, 0x20, + 0x0e, 0x20, 0x0f, 0x6a, 0x21, 0x10, 0x20, 0x0d, 0x20, 0x10, 0x10, 0xd6, + 0x80, 0x80, 0x80, 0x00, 0x41, 0x10, 0x21, 0x11, 0x20, 0x05, 0x20, 0x11, + 0x6a, 0x21, 0x12, 0x20, 0x12, 0x24, 0x80, 0x80, 0x80, 0x80, 0x00, 0x0f, + 0x0b, 0xb4, 0x04, 0x05, 0x05, 0x7f, 0x01, 0x7e, 0x1c, 0x7f, 0x01, 0x7e, + 0x17, 0x7f, 0x23, 0x80, 0x80, 0x80, 0x80, 0x00, 0x21, 0x03, 0x41, 0xe0, + 0x00, 0x21, 0x04, 0x20, 0x03, 0x20, 0x04, 0x6b, 0x21, 0x05, 0x20, 0x05, + 0x24, 0x80, 0x80, 0x80, 0x80, 0x00, 0x20, 0x05, 0x20, 0x00, 0x36, 0x02, + 0x58, 0x20, 0x05, 0x20, 0x01, 0x36, 0x02, 0x54, 0x20, 0x05, 0x20, 0x02, + 0x36, 0x02, 0x50, 0x41, 0xc8, 0x00, 0x21, 0x06, 0x20, 0x05, 0x20, 0x06, + 0x6a, 0x21, 0x07, 0x42, 0x00, 0x21, 0x08, 0x20, 0x07, 0x20, 0x08, 0x37, + 0x03, 0x00, 0x41, 0xc0, 0x00, 0x21, 0x09, 0x20, 0x05, 0x20, 0x09, 0x6a, + 0x21, 0x0a, 0x20, 0x0a, 0x20, 0x08, 0x37, 0x03, 0x00, 0x20, 0x05, 0x20, + 0x08, 0x37, 0x03, 0x38, 0x20, 0x05, 0x28, 0x02, 0x54, 0x21, 0x0b, 0x41, + 0x00, 0x21, 0x0c, 0x20, 0x0c, 0x21, 0x0d, 0x20, 0x0b, 0x21, 0x0e, 0x20, + 0x0d, 0x20, 0x0e, 0x46, 0x21, 0x0f, 0x41, 0x01, 0x21, 0x10, 0x20, 0x0f, + 0x20, 0x10, 0x71, 0x21, 0x11, 0x02, 0x40, 0x02, 0x40, 0x20, 0x11, 0x45, + 0x0d, 0x00, 0x41, 0x80, 0xa8, 0x80, 0x80, 0x00, 0x21, 0x12, 0x41, 0x1c, + 0x21, 0x13, 0x20, 0x12, 0x20, 0x13, 0x36, 0x02, 0x00, 0x41, 0x7f, 0x21, + 0x14, 0x20, 0x05, 0x20, 0x14, 0x36, 0x02, 0x5c, 0x0c, 0x01, 0x0b, 0x20, + 0x05, 0x28, 0x02, 0x54, 0x21, 0x15, 0x20, 0x05, 0x28, 0x02, 0x50, 0x21, + 0x16, 0x41, 0x38, 0x21, 0x17, 0x20, 0x05, 0x20, 0x17, 0x6a, 0x21, 0x18, + 0x20, 0x18, 0x21, 0x19, 0x20, 0x15, 0x20, 0x16, 0x20, 0x19, 0x10, 0xca, + 0x80, 0x80, 0x80, 0x00, 0x21, 0x1a, 0x20, 0x05, 0x20, 0x1a, 0x3b, 0x01, + 0x36, 0x20, 0x05, 0x2f, 0x01, 0x36, 0x21, 0x1b, 0x41, 0xff, 0xff, 0x03, + 0x21, 0x1c, 0x20, 0x1b, 0x20, 0x1c, 0x71, 0x21, 0x1d, 0x02, 0x40, 0x20, + 0x1d, 0x45, 0x0d, 0x00, 0x20, 0x05, 0x2f, 0x01, 0x36, 0x21, 0x1e, 0x41, + 0xff, 0xff, 0x03, 0x21, 0x1f, 0x20, 0x1e, 0x20, 0x1f, 0x71, 0x21, 0x20, + 0x41, 0x80, 0xa8, 0x80, 0x80, 0x00, 0x21, 0x21, 0x20, 0x21, 0x20, 0x20, + 0x36, 0x02, 0x00, 0x41, 0x7f, 0x21, 0x22, 0x20, 0x05, 0x20, 0x22, 0x36, + 0x02, 0x5c, 0x0c, 0x01, 0x0b, 0x41, 0x28, 0x21, 0x23, 0x20, 0x05, 0x20, + 0x23, 0x6a, 0x21, 0x24, 0x42, 0x00, 0x21, 0x25, 0x20, 0x24, 0x20, 0x25, + 0x37, 0x03, 0x00, 0x41, 0x20, 0x21, 0x26, 0x20, 0x05, 0x20, 0x26, 0x6a, + 0x21, 0x27, 0x20, 0x27, 0x20, 0x25, 0x37, 0x03, 0x00, 0x41, 0x18, 0x21, + 0x28, 0x20, 0x05, 0x20, 0x28, 0x6a, 0x21, 0x29, 0x20, 0x29, 0x20, 0x25, + 0x37, 0x03, 0x00, 0x41, 0x10, 0x21, 0x2a, 0x20, 0x05, 0x20, 0x2a, 0x6a, + 0x21, 0x2b, 0x20, 0x2b, 0x20, 0x25, 0x37, 0x03, 0x00, 0x20, 0x05, 0x20, + 0x25, 0x37, 0x03, 0x08, 0x20, 0x05, 0x20, 0x25, 0x37, 0x03, 0x00, 0x20, + 0x05, 0x28, 0x02, 0x58, 0x21, 0x2c, 0x41, 0x38, 0x21, 0x2d, 0x20, 0x05, + 0x20, 0x2d, 0x6a, 0x21, 0x2e, 0x20, 0x2e, 0x21, 0x2f, 0x20, 0x2c, 0x20, + 0x2f, 0x10, 0xce, 0x80, 0x80, 0x80, 0x00, 0x21, 0x30, 0x20, 0x05, 0x20, + 0x30, 0x3b, 0x01, 0x36, 0x20, 0x05, 0x2f, 0x01, 0x36, 0x21, 0x31, 0x41, + 0xff, 0xff, 0x03, 0x21, 0x32, 0x20, 0x31, 0x20, 0x32, 0x71, 0x21, 0x33, + 0x02, 0x40, 0x20, 0x33, 0x45, 0x0d, 0x00, 0x20, 0x05, 0x2f, 0x01, 0x36, + 0x21, 0x34, 0x41, 0xff, 0xff, 0x03, 0x21, 0x35, 0x20, 0x34, 0x20, 0x35, + 0x71, 0x21, 0x36, 0x41, 0x80, 0xa8, 0x80, 0x80, 0x00, 0x21, 0x37, 0x20, + 0x37, 0x20, 0x36, 0x36, 0x02, 0x00, 0x41, 0x7f, 0x21, 0x38, 0x20, 0x05, + 0x20, 0x38, 0x36, 0x02, 0x5c, 0x0c, 0x01, 0x0b, 0x41, 0x00, 0x21, 0x39, + 0x20, 0x05, 0x20, 0x39, 0x36, 0x02, 0x5c, 0x0b, 0x20, 0x05, 0x28, 0x02, + 0x5c, 0x21, 0x3a, 0x41, 0xe0, 0x00, 0x21, 0x3b, 0x20, 0x05, 0x20, 0x3b, + 0x6a, 0x21, 0x3c, 0x20, 0x3c, 0x24, 0x80, 0x80, 0x80, 0x80, 0x00, 0x20, + 0x3a, 0x0f, 0x0b, 0x6a, 0x01, 0x0a, 0x7f, 0x23, 0x80, 0x80, 0x80, 0x80, + 0x00, 0x21, 0x02, 0x41, 0x10, 0x21, 0x03, 0x20, 0x02, 0x20, 0x03, 0x6b, + 0x21, 0x04, 0x20, 0x04, 0x24, 0x80, 0x80, 0x80, 0x80, 0x00, 0x20, 0x04, + 0x20, 0x00, 0x36, 0x02, 0x0c, 0x20, 0x04, 0x20, 0x01, 0x36, 0x02, 0x08, + 0x20, 0x04, 0x28, 0x02, 0x0c, 0x21, 0x05, 0x20, 0x04, 0x28, 0x02, 0x08, + 0x21, 0x06, 0x20, 0x05, 0x20, 0x06, 0x10, 0x88, 0x80, 0x80, 0x80, 0x00, + 0x21, 0x07, 0x41, 0xff, 0xff, 0x03, 0x21, 0x08, 0x20, 0x07, 0x20, 0x08, + 0x71, 0x21, 0x09, 0x41, 0x10, 0x21, 0x0a, 0x20, 0x04, 0x20, 0x0a, 0x6a, + 0x21, 0x0b, 0x20, 0x0b, 0x24, 0x80, 0x80, 0x80, 0x80, 0x00, 0x20, 0x09, + 0x0f, 0x0b, 0x99, 0x04, 0x01, 0x35, 0x7f, 0x23, 0x80, 0x80, 0x80, 0x80, + 0x00, 0x21, 0x06, 0x41, 0xd0, 0x00, 0x21, 0x07, 0x20, 0x06, 0x20, 0x07, + 0x6b, 0x21, 0x08, 0x20, 0x08, 0x24, 0x80, 0x80, 0x80, 0x80, 0x00, 0x20, + 0x08, 0x20, 0x00, 0x36, 0x02, 0x48, 0x20, 0x08, 0x20, 0x01, 0x36, 0x02, + 0x44, 0x20, 0x08, 0x20, 0x02, 0x36, 0x02, 0x40, 0x20, 0x08, 0x20, 0x03, + 0x36, 0x02, 0x3c, 0x20, 0x08, 0x20, 0x04, 0x36, 0x02, 0x38, 0x20, 0x08, + 0x20, 0x05, 0x36, 0x02, 0x34, 0x20, 0x08, 0x28, 0x02, 0x44, 0x21, 0x09, + 0x20, 0x08, 0x20, 0x09, 0x36, 0x02, 0x2c, 0x20, 0x08, 0x28, 0x02, 0x40, + 0x21, 0x0a, 0x20, 0x08, 0x20, 0x0a, 0x36, 0x02, 0x30, 0x41, 0x00, 0x21, + 0x0b, 0x20, 0x08, 0x20, 0x0b, 0x36, 0x02, 0x28, 0x41, 0x01, 0x21, 0x0c, + 0x20, 0x08, 0x20, 0x0c, 0x36, 0x02, 0x08, 0x41, 0x00, 0x21, 0x0d, 0x20, + 0x08, 0x20, 0x0d, 0x3b, 0x01, 0x06, 0x20, 0x08, 0x28, 0x02, 0x3c, 0x21, + 0x0e, 0x02, 0x40, 0x02, 0x40, 0x20, 0x0e, 0x45, 0x0d, 0x00, 0x41, 0x80, + 0xa8, 0x80, 0x80, 0x00, 0x21, 0x0f, 0x41, 0x32, 0x21, 0x10, 0x20, 0x0f, + 0x20, 0x10, 0x36, 0x02, 0x00, 0x41, 0x7f, 0x21, 0x11, 0x20, 0x08, 0x20, + 0x11, 0x36, 0x02, 0x4c, 0x0c, 0x01, 0x0b, 0x20, 0x08, 0x28, 0x02, 0x38, + 0x21, 0x12, 0x20, 0x08, 0x28, 0x02, 0x34, 0x21, 0x13, 0x41, 0x10, 0x21, + 0x14, 0x20, 0x08, 0x20, 0x14, 0x6a, 0x21, 0x15, 0x20, 0x15, 0x21, 0x16, + 0x20, 0x12, 0x20, 0x13, 0x20, 0x16, 0x10, 0xca, 0x80, 0x80, 0x80, 0x00, + 0x21, 0x17, 0x20, 0x08, 0x20, 0x17, 0x3b, 0x01, 0x0e, 0x20, 0x08, 0x2f, + 0x01, 0x0e, 0x21, 0x18, 0x41, 0xff, 0xff, 0x03, 0x21, 0x19, 0x20, 0x18, + 0x20, 0x19, 0x71, 0x21, 0x1a, 0x02, 0x40, 0x20, 0x1a, 0x45, 0x0d, 0x00, + 0x20, 0x08, 0x2f, 0x01, 0x0e, 0x21, 0x1b, 0x41, 0xff, 0xff, 0x03, 0x21, + 0x1c, 0x20, 0x1b, 0x20, 0x1c, 0x71, 0x21, 0x1d, 0x41, 0x80, 0xa8, 0x80, + 0x80, 0x00, 0x21, 0x1e, 0x20, 0x1e, 0x20, 0x1d, 0x36, 0x02, 0x00, 0x41, + 0x7f, 0x21, 0x1f, 0x20, 0x08, 0x20, 0x1f, 0x36, 0x02, 0x4c, 0x0c, 0x01, + 0x0b, 0x20, 0x08, 0x28, 0x02, 0x48, 0x21, 0x20, 0x20, 0x08, 0x28, 0x02, + 0x08, 0x21, 0x21, 0x20, 0x08, 0x2f, 0x01, 0x06, 0x21, 0x22, 0x41, 0x2c, + 0x21, 0x23, 0x20, 0x08, 0x20, 0x23, 0x6a, 0x21, 0x24, 0x20, 0x24, 0x21, + 0x25, 0x41, 0x10, 0x21, 0x26, 0x20, 0x08, 0x20, 0x26, 0x6a, 0x21, 0x27, + 0x20, 0x27, 0x21, 0x28, 0x41, 0x28, 0x21, 0x29, 0x20, 0x08, 0x20, 0x29, + 0x6a, 0x21, 0x2a, 0x20, 0x2a, 0x21, 0x2b, 0x41, 0xff, 0xff, 0x03, 0x21, + 0x2c, 0x20, 0x22, 0x20, 0x2c, 0x71, 0x21, 0x2d, 0x20, 0x20, 0x20, 0x25, + 0x20, 0x21, 0x20, 0x2d, 0x20, 0x28, 0x20, 0x2b, 0x10, 0xd0, 0x80, 0x80, + 0x80, 0x00, 0x21, 0x2e, 0x20, 0x08, 0x20, 0x2e, 0x3b, 0x01, 0x0e, 0x20, + 0x08, 0x2f, 0x01, 0x0e, 0x21, 0x2f, 0x41, 0xff, 0xff, 0x03, 0x21, 0x30, + 0x20, 0x2f, 0x20, 0x30, 0x71, 0x21, 0x31, 0x02, 0x40, 0x20, 0x31, 0x45, + 0x0d, 0x00, 0x20, 0x08, 0x2f, 0x01, 0x0e, 0x21, 0x32, 0x41, 0xff, 0xff, + 0x03, 0x21, 0x33, 0x20, 0x32, 0x20, 0x33, 0x71, 0x21, 0x34, 0x41, 0x80, + 0xa8, 0x80, 0x80, 0x00, 0x21, 0x35, 0x20, 0x35, 0x20, 0x34, 0x36, 0x02, + 0x00, 0x41, 0x7f, 0x21, 0x36, 0x20, 0x08, 0x20, 0x36, 0x36, 0x02, 0x4c, + 0x0c, 0x01, 0x0b, 0x20, 0x08, 0x28, 0x02, 0x28, 0x21, 0x37, 0x20, 0x08, + 0x20, 0x37, 0x36, 0x02, 0x4c, 0x0b, 0x20, 0x08, 0x28, 0x02, 0x4c, 0x21, + 0x38, 0x41, 0xd0, 0x00, 0x21, 0x39, 0x20, 0x08, 0x20, 0x39, 0x6a, 0x21, + 0x3a, 0x20, 0x3a, 0x24, 0x80, 0x80, 0x80, 0x80, 0x00, 0x20, 0x38, 0x0f, + 0x0b, 0xb7, 0x01, 0x01, 0x10, 0x7f, 0x23, 0x80, 0x80, 0x80, 0x80, 0x00, + 0x21, 0x06, 0x41, 0x20, 0x21, 0x07, 0x20, 0x06, 0x20, 0x07, 0x6b, 0x21, + 0x08, 0x20, 0x08, 0x24, 0x80, 0x80, 0x80, 0x80, 0x00, 0x20, 0x08, 0x20, + 0x00, 0x36, 0x02, 0x1c, 0x20, 0x08, 0x20, 0x01, 0x36, 0x02, 0x18, 0x20, + 0x08, 0x20, 0x02, 0x36, 0x02, 0x14, 0x20, 0x08, 0x20, 0x03, 0x3b, 0x01, + 0x12, 0x20, 0x08, 0x20, 0x04, 0x36, 0x02, 0x0c, 0x20, 0x08, 0x20, 0x05, + 0x36, 0x02, 0x08, 0x20, 0x08, 0x28, 0x02, 0x1c, 0x21, 0x09, 0x20, 0x08, + 0x28, 0x02, 0x18, 0x21, 0x0a, 0x20, 0x08, 0x28, 0x02, 0x14, 0x21, 0x0b, + 0x20, 0x08, 0x2f, 0x01, 0x12, 0x21, 0x0c, 0x41, 0xff, 0xff, 0x03, 0x21, + 0x0d, 0x20, 0x0c, 0x20, 0x0d, 0x71, 0x21, 0x0e, 0x20, 0x08, 0x28, 0x02, + 0x0c, 0x21, 0x0f, 0x20, 0x08, 0x28, 0x02, 0x08, 0x21, 0x10, 0x20, 0x09, + 0x20, 0x0a, 0x20, 0x0b, 0x20, 0x0e, 0x20, 0x0f, 0x20, 0x10, 0x10, 0x89, + 0x80, 0x80, 0x80, 0x00, 0x21, 0x11, 0x41, 0xff, 0xff, 0x03, 0x21, 0x12, + 0x20, 0x11, 0x20, 0x12, 0x71, 0x21, 0x13, 0x41, 0x20, 0x21, 0x14, 0x20, + 0x08, 0x20, 0x14, 0x6a, 0x21, 0x15, 0x20, 0x15, 0x24, 0x80, 0x80, 0x80, + 0x80, 0x00, 0x20, 0x13, 0x0f, 0x0b, 0xff, 0x05, 0x01, 0x50, 0x7f, 0x23, + 0x80, 0x80, 0x80, 0x80, 0x00, 0x21, 0x06, 0x41, 0xd0, 0x00, 0x21, 0x07, + 0x20, 0x06, 0x20, 0x07, 0x6b, 0x21, 0x08, 0x20, 0x08, 0x24, 0x80, 0x80, + 0x80, 0x80, 0x00, 0x20, 0x08, 0x20, 0x00, 0x36, 0x02, 0x48, 0x20, 0x08, + 0x20, 0x01, 0x36, 0x02, 0x44, 0x20, 0x08, 0x20, 0x02, 0x36, 0x02, 0x40, + 0x20, 0x08, 0x20, 0x03, 0x36, 0x02, 0x3c, 0x20, 0x08, 0x20, 0x04, 0x36, + 0x02, 0x38, 0x20, 0x08, 0x20, 0x05, 0x36, 0x02, 0x34, 0x20, 0x08, 0x28, + 0x02, 0x44, 0x21, 0x09, 0x20, 0x08, 0x20, 0x09, 0x36, 0x02, 0x2c, 0x20, + 0x08, 0x28, 0x02, 0x40, 0x21, 0x0a, 0x20, 0x08, 0x20, 0x0a, 0x36, 0x02, + 0x30, 0x41, 0x00, 0x21, 0x0b, 0x20, 0x08, 0x20, 0x0b, 0x36, 0x02, 0x28, + 0x41, 0x01, 0x21, 0x0c, 0x20, 0x08, 0x20, 0x0c, 0x36, 0x02, 0x08, 0x41, + 0x00, 0x21, 0x0d, 0x20, 0x08, 0x20, 0x0d, 0x3b, 0x01, 0x06, 0x20, 0x08, + 0x28, 0x02, 0x3c, 0x21, 0x0e, 0x02, 0x40, 0x02, 0x40, 0x20, 0x0e, 0x45, + 0x0d, 0x00, 0x41, 0x80, 0xa8, 0x80, 0x80, 0x00, 0x21, 0x0f, 0x41, 0x32, + 0x21, 0x10, 0x20, 0x0f, 0x20, 0x10, 0x36, 0x02, 0x00, 0x41, 0x7f, 0x21, + 0x11, 0x20, 0x08, 0x20, 0x11, 0x36, 0x02, 0x4c, 0x0c, 0x01, 0x0b, 0x20, + 0x08, 0x28, 0x02, 0x38, 0x21, 0x12, 0x41, 0x00, 0x21, 0x13, 0x20, 0x12, + 0x21, 0x14, 0x20, 0x13, 0x21, 0x15, 0x20, 0x14, 0x20, 0x15, 0x47, 0x21, + 0x16, 0x41, 0x01, 0x21, 0x17, 0x20, 0x16, 0x20, 0x17, 0x71, 0x21, 0x18, + 0x02, 0x40, 0x20, 0x18, 0x0d, 0x00, 0x20, 0x08, 0x28, 0x02, 0x48, 0x21, + 0x19, 0x20, 0x08, 0x28, 0x02, 0x44, 0x21, 0x1a, 0x20, 0x08, 0x28, 0x02, + 0x40, 0x21, 0x1b, 0x20, 0x08, 0x28, 0x02, 0x3c, 0x21, 0x1c, 0x20, 0x19, + 0x20, 0x1a, 0x20, 0x1b, 0x20, 0x1c, 0x10, 0xc6, 0x80, 0x80, 0x80, 0x00, + 0x21, 0x1d, 0x20, 0x08, 0x20, 0x1d, 0x36, 0x02, 0x4c, 0x0c, 0x01, 0x0b, + 0x20, 0x08, 0x28, 0x02, 0x38, 0x21, 0x1e, 0x20, 0x08, 0x28, 0x02, 0x34, + 0x21, 0x1f, 0x20, 0x1f, 0x28, 0x02, 0x00, 0x21, 0x20, 0x41, 0x10, 0x21, + 0x21, 0x20, 0x08, 0x20, 0x21, 0x6a, 0x21, 0x22, 0x20, 0x22, 0x21, 0x23, + 0x20, 0x1e, 0x20, 0x20, 0x20, 0x23, 0x10, 0xca, 0x80, 0x80, 0x80, 0x00, + 0x21, 0x24, 0x20, 0x08, 0x20, 0x24, 0x3b, 0x01, 0x0e, 0x20, 0x08, 0x2f, + 0x01, 0x0e, 0x21, 0x25, 0x41, 0xff, 0xff, 0x03, 0x21, 0x26, 0x20, 0x25, + 0x20, 0x26, 0x71, 0x21, 0x27, 0x02, 0x40, 0x20, 0x27, 0x45, 0x0d, 0x00, + 0x20, 0x08, 0x2f, 0x01, 0x0e, 0x21, 0x28, 0x41, 0xff, 0xff, 0x03, 0x21, + 0x29, 0x20, 0x28, 0x20, 0x29, 0x71, 0x21, 0x2a, 0x41, 0x80, 0xa8, 0x80, + 0x80, 0x00, 0x21, 0x2b, 0x20, 0x2b, 0x20, 0x2a, 0x36, 0x02, 0x00, 0x41, + 0x7f, 0x21, 0x2c, 0x20, 0x08, 0x20, 0x2c, 0x36, 0x02, 0x4c, 0x0c, 0x01, + 0x0b, 0x20, 0x08, 0x28, 0x02, 0x48, 0x21, 0x2d, 0x20, 0x08, 0x28, 0x02, + 0x08, 0x21, 0x2e, 0x20, 0x08, 0x2f, 0x01, 0x06, 0x21, 0x2f, 0x41, 0x2c, + 0x21, 0x30, 0x20, 0x08, 0x20, 0x30, 0x6a, 0x21, 0x31, 0x20, 0x31, 0x21, + 0x32, 0x41, 0x10, 0x21, 0x33, 0x20, 0x08, 0x20, 0x33, 0x6a, 0x21, 0x34, + 0x20, 0x34, 0x21, 0x35, 0x41, 0x28, 0x21, 0x36, 0x20, 0x08, 0x20, 0x36, + 0x6a, 0x21, 0x37, 0x20, 0x37, 0x21, 0x38, 0x41, 0xff, 0xff, 0x03, 0x21, + 0x39, 0x20, 0x2f, 0x20, 0x39, 0x71, 0x21, 0x3a, 0x20, 0x2d, 0x20, 0x32, + 0x20, 0x2e, 0x20, 0x3a, 0x20, 0x35, 0x20, 0x38, 0x10, 0xd2, 0x80, 0x80, + 0x80, 0x00, 0x21, 0x3b, 0x20, 0x08, 0x20, 0x3b, 0x3b, 0x01, 0x0e, 0x20, + 0x08, 0x2f, 0x01, 0x0e, 0x21, 0x3c, 0x41, 0xff, 0xff, 0x03, 0x21, 0x3d, + 0x20, 0x3c, 0x20, 0x3d, 0x71, 0x21, 0x3e, 0x02, 0x40, 0x20, 0x3e, 0x45, + 0x0d, 0x00, 0x20, 0x08, 0x2f, 0x01, 0x0e, 0x21, 0x3f, 0x41, 0xff, 0xff, + 0x03, 0x21, 0x40, 0x20, 0x3f, 0x20, 0x40, 0x71, 0x21, 0x41, 0x41, 0x80, + 0xa8, 0x80, 0x80, 0x00, 0x21, 0x42, 0x20, 0x42, 0x20, 0x41, 0x36, 0x02, + 0x00, 0x41, 0x7f, 0x21, 0x43, 0x20, 0x08, 0x20, 0x43, 0x36, 0x02, 0x4c, + 0x0c, 0x01, 0x0b, 0x20, 0x08, 0x28, 0x02, 0x38, 0x21, 0x44, 0x20, 0x08, + 0x28, 0x02, 0x34, 0x21, 0x45, 0x41, 0x10, 0x21, 0x46, 0x20, 0x08, 0x20, + 0x46, 0x6a, 0x21, 0x47, 0x20, 0x47, 0x21, 0x48, 0x20, 0x48, 0x20, 0x44, + 0x20, 0x45, 0x10, 0xc9, 0x80, 0x80, 0x80, 0x00, 0x21, 0x49, 0x20, 0x08, + 0x20, 0x49, 0x3b, 0x01, 0x0e, 0x20, 0x08, 0x2f, 0x01, 0x0e, 0x21, 0x4a, + 0x41, 0xff, 0xff, 0x03, 0x21, 0x4b, 0x20, 0x4a, 0x20, 0x4b, 0x71, 0x21, + 0x4c, 0x02, 0x40, 0x20, 0x4c, 0x45, 0x0d, 0x00, 0x20, 0x08, 0x2f, 0x01, + 0x0e, 0x21, 0x4d, 0x41, 0xff, 0xff, 0x03, 0x21, 0x4e, 0x20, 0x4d, 0x20, + 0x4e, 0x71, 0x21, 0x4f, 0x41, 0x80, 0xa8, 0x80, 0x80, 0x00, 0x21, 0x50, + 0x20, 0x50, 0x20, 0x4f, 0x36, 0x02, 0x00, 0x41, 0x7f, 0x21, 0x51, 0x20, + 0x08, 0x20, 0x51, 0x36, 0x02, 0x4c, 0x0c, 0x01, 0x0b, 0x20, 0x08, 0x28, + 0x02, 0x28, 0x21, 0x52, 0x20, 0x08, 0x20, 0x52, 0x36, 0x02, 0x4c, 0x0b, + 0x20, 0x08, 0x28, 0x02, 0x4c, 0x21, 0x53, 0x41, 0xd0, 0x00, 0x21, 0x54, + 0x20, 0x08, 0x20, 0x54, 0x6a, 0x21, 0x55, 0x20, 0x55, 0x24, 0x80, 0x80, + 0x80, 0x80, 0x00, 0x20, 0x53, 0x0f, 0x0b, 0xb7, 0x01, 0x01, 0x10, 0x7f, + 0x23, 0x80, 0x80, 0x80, 0x80, 0x00, 0x21, 0x06, 0x41, 0x20, 0x21, 0x07, + 0x20, 0x06, 0x20, 0x07, 0x6b, 0x21, 0x08, 0x20, 0x08, 0x24, 0x80, 0x80, + 0x80, 0x80, 0x00, 0x20, 0x08, 0x20, 0x00, 0x36, 0x02, 0x1c, 0x20, 0x08, + 0x20, 0x01, 0x36, 0x02, 0x18, 0x20, 0x08, 0x20, 0x02, 0x36, 0x02, 0x14, + 0x20, 0x08, 0x20, 0x03, 0x3b, 0x01, 0x12, 0x20, 0x08, 0x20, 0x04, 0x36, + 0x02, 0x0c, 0x20, 0x08, 0x20, 0x05, 0x36, 0x02, 0x08, 0x20, 0x08, 0x28, + 0x02, 0x1c, 0x21, 0x09, 0x20, 0x08, 0x28, 0x02, 0x18, 0x21, 0x0a, 0x20, + 0x08, 0x28, 0x02, 0x14, 0x21, 0x0b, 0x20, 0x08, 0x2f, 0x01, 0x12, 0x21, + 0x0c, 0x41, 0xff, 0xff, 0x03, 0x21, 0x0d, 0x20, 0x0c, 0x20, 0x0d, 0x71, + 0x21, 0x0e, 0x20, 0x08, 0x28, 0x02, 0x0c, 0x21, 0x0f, 0x20, 0x08, 0x28, + 0x02, 0x08, 0x21, 0x10, 0x20, 0x09, 0x20, 0x0a, 0x20, 0x0b, 0x20, 0x0e, + 0x20, 0x0f, 0x20, 0x10, 0x10, 0x8a, 0x80, 0x80, 0x80, 0x00, 0x21, 0x11, + 0x41, 0xff, 0xff, 0x03, 0x21, 0x12, 0x20, 0x11, 0x20, 0x12, 0x71, 0x21, + 0x13, 0x41, 0x20, 0x21, 0x14, 0x20, 0x08, 0x20, 0x14, 0x6a, 0x21, 0x15, + 0x20, 0x15, 0x24, 0x80, 0x80, 0x80, 0x80, 0x00, 0x20, 0x13, 0x0f, 0x0b, + 0x82, 0x04, 0x01, 0x39, 0x7f, 0x23, 0x80, 0x80, 0x80, 0x80, 0x00, 0x21, + 0x03, 0x41, 0x30, 0x21, 0x04, 0x20, 0x03, 0x20, 0x04, 0x6b, 0x21, 0x05, + 0x20, 0x05, 0x24, 0x80, 0x80, 0x80, 0x80, 0x00, 0x20, 0x05, 0x20, 0x00, + 0x36, 0x02, 0x28, 0x20, 0x05, 0x20, 0x01, 0x36, 0x02, 0x24, 0x20, 0x05, + 0x20, 0x02, 0x36, 0x02, 0x20, 0x41, 0x7f, 0x21, 0x06, 0x20, 0x05, 0x20, + 0x06, 0x36, 0x02, 0x1c, 0x20, 0x05, 0x28, 0x02, 0x28, 0x21, 0x07, 0x41, + 0x01, 0x21, 0x08, 0x20, 0x08, 0x21, 0x09, 0x20, 0x07, 0x21, 0x0a, 0x20, + 0x09, 0x20, 0x0a, 0x46, 0x21, 0x0b, 0x41, 0x01, 0x21, 0x0c, 0x20, 0x0b, + 0x20, 0x0c, 0x71, 0x21, 0x0d, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, 0x20, + 0x0d, 0x45, 0x0d, 0x00, 0x41, 0x00, 0x21, 0x0e, 0x20, 0x05, 0x20, 0x0e, + 0x36, 0x02, 0x10, 0x0c, 0x01, 0x0b, 0x20, 0x05, 0x28, 0x02, 0x28, 0x21, + 0x0f, 0x41, 0x02, 0x21, 0x10, 0x20, 0x10, 0x21, 0x11, 0x20, 0x0f, 0x21, + 0x12, 0x20, 0x11, 0x20, 0x12, 0x46, 0x21, 0x13, 0x41, 0x01, 0x21, 0x14, + 0x20, 0x13, 0x20, 0x14, 0x71, 0x21, 0x15, 0x02, 0x40, 0x02, 0x40, 0x20, + 0x15, 0x45, 0x0d, 0x00, 0x41, 0x01, 0x21, 0x16, 0x20, 0x05, 0x20, 0x16, + 0x36, 0x02, 0x10, 0x0c, 0x01, 0x0b, 0x41, 0x32, 0x21, 0x17, 0x20, 0x05, + 0x20, 0x17, 0x36, 0x02, 0x2c, 0x0c, 0x02, 0x0b, 0x0b, 0x20, 0x05, 0x28, + 0x02, 0x24, 0x21, 0x18, 0x41, 0x05, 0x21, 0x19, 0x20, 0x19, 0x21, 0x1a, + 0x20, 0x18, 0x21, 0x1b, 0x20, 0x1a, 0x20, 0x1b, 0x46, 0x21, 0x1c, 0x41, + 0x01, 0x21, 0x1d, 0x20, 0x1c, 0x20, 0x1d, 0x71, 0x21, 0x1e, 0x02, 0x40, + 0x02, 0x40, 0x20, 0x1e, 0x45, 0x0d, 0x00, 0x41, 0x00, 0x21, 0x1f, 0x20, + 0x05, 0x20, 0x1f, 0x36, 0x02, 0x0c, 0x0c, 0x01, 0x0b, 0x20, 0x05, 0x28, + 0x02, 0x24, 0x21, 0x20, 0x41, 0x06, 0x21, 0x21, 0x20, 0x21, 0x21, 0x22, + 0x20, 0x20, 0x21, 0x23, 0x20, 0x22, 0x20, 0x23, 0x46, 0x21, 0x24, 0x41, + 0x01, 0x21, 0x25, 0x20, 0x24, 0x20, 0x25, 0x71, 0x21, 0x26, 0x02, 0x40, + 0x02, 0x40, 0x20, 0x26, 0x45, 0x0d, 0x00, 0x41, 0x01, 0x21, 0x27, 0x20, + 0x05, 0x20, 0x27, 0x36, 0x02, 0x0c, 0x0c, 0x01, 0x0b, 0x41, 0x32, 0x21, + 0x28, 0x20, 0x05, 0x20, 0x28, 0x36, 0x02, 0x2c, 0x0c, 0x02, 0x0b, 0x0b, + 0x20, 0x05, 0x28, 0x02, 0x1c, 0x21, 0x29, 0x20, 0x05, 0x28, 0x02, 0x10, + 0x21, 0x2a, 0x20, 0x05, 0x28, 0x02, 0x0c, 0x21, 0x2b, 0x41, 0x18, 0x21, + 0x2c, 0x20, 0x05, 0x20, 0x2c, 0x6a, 0x21, 0x2d, 0x20, 0x2d, 0x21, 0x2e, + 0x20, 0x29, 0x20, 0x2a, 0x20, 0x2b, 0x20, 0x2e, 0x10, 0xd4, 0x80, 0x80, + 0x80, 0x00, 0x21, 0x2f, 0x20, 0x05, 0x20, 0x2f, 0x3b, 0x01, 0x16, 0x20, + 0x05, 0x2f, 0x01, 0x16, 0x21, 0x30, 0x41, 0xff, 0xff, 0x03, 0x21, 0x31, + 0x20, 0x30, 0x20, 0x31, 0x71, 0x21, 0x32, 0x02, 0x40, 0x20, 0x32, 0x45, + 0x0d, 0x00, 0x20, 0x05, 0x2f, 0x01, 0x16, 0x21, 0x33, 0x41, 0xff, 0xff, + 0x03, 0x21, 0x34, 0x20, 0x33, 0x20, 0x34, 0x71, 0x21, 0x35, 0x41, 0x80, + 0xa8, 0x80, 0x80, 0x00, 0x21, 0x36, 0x20, 0x36, 0x20, 0x35, 0x36, 0x02, + 0x00, 0x41, 0x7f, 0x21, 0x37, 0x20, 0x05, 0x20, 0x37, 0x36, 0x02, 0x2c, + 0x0c, 0x01, 0x0b, 0x20, 0x05, 0x28, 0x02, 0x18, 0x21, 0x38, 0x20, 0x05, + 0x20, 0x38, 0x36, 0x02, 0x2c, 0x0b, 0x20, 0x05, 0x28, 0x02, 0x2c, 0x21, + 0x39, 0x41, 0x30, 0x21, 0x3a, 0x20, 0x05, 0x20, 0x3a, 0x6a, 0x21, 0x3b, + 0x20, 0x3b, 0x24, 0x80, 0x80, 0x80, 0x80, 0x00, 0x20, 0x39, 0x0f, 0x0b, + 0x8a, 0x01, 0x01, 0x0c, 0x7f, 0x23, 0x80, 0x80, 0x80, 0x80, 0x00, 0x21, + 0x04, 0x41, 0x10, 0x21, 0x05, 0x20, 0x04, 0x20, 0x05, 0x6b, 0x21, 0x06, + 0x20, 0x06, 0x24, 0x80, 0x80, 0x80, 0x80, 0x00, 0x20, 0x06, 0x20, 0x00, + 0x36, 0x02, 0x0c, 0x20, 0x06, 0x20, 0x01, 0x36, 0x02, 0x08, 0x20, 0x06, + 0x20, 0x02, 0x36, 0x02, 0x04, 0x20, 0x06, 0x20, 0x03, 0x36, 0x02, 0x00, + 0x20, 0x06, 0x28, 0x02, 0x0c, 0x21, 0x07, 0x20, 0x06, 0x28, 0x02, 0x08, + 0x21, 0x08, 0x20, 0x06, 0x28, 0x02, 0x04, 0x21, 0x09, 0x20, 0x06, 0x28, + 0x02, 0x00, 0x21, 0x0a, 0x20, 0x07, 0x20, 0x08, 0x20, 0x09, 0x20, 0x0a, + 0x10, 0x8b, 0x80, 0x80, 0x80, 0x00, 0x21, 0x0b, 0x41, 0xff, 0xff, 0x03, + 0x21, 0x0c, 0x20, 0x0b, 0x20, 0x0c, 0x71, 0x21, 0x0d, 0x41, 0x10, 0x21, + 0x0e, 0x20, 0x06, 0x20, 0x0e, 0x6a, 0x21, 0x0f, 0x20, 0x0f, 0x24, 0x80, + 0x80, 0x80, 0x80, 0x00, 0x20, 0x0d, 0x0f, 0x0b, 0x83, 0x02, 0x01, 0x1d, + 0x7f, 0x23, 0x80, 0x80, 0x80, 0x80, 0x00, 0x21, 0x02, 0x41, 0x10, 0x21, + 0x03, 0x20, 0x02, 0x20, 0x03, 0x6b, 0x21, 0x04, 0x20, 0x04, 0x24, 0x80, + 0x80, 0x80, 0x80, 0x00, 0x20, 0x04, 0x20, 0x00, 0x36, 0x02, 0x0c, 0x20, + 0x04, 0x20, 0x01, 0x36, 0x02, 0x08, 0x20, 0x04, 0x28, 0x02, 0x0c, 0x21, + 0x05, 0x20, 0x05, 0x10, 0xc8, 0x80, 0x80, 0x80, 0x00, 0x21, 0x06, 0x20, + 0x04, 0x20, 0x06, 0x36, 0x02, 0x0c, 0x20, 0x04, 0x28, 0x02, 0x0c, 0x21, + 0x07, 0x41, 0x80, 0x80, 0x80, 0x78, 0x21, 0x08, 0x20, 0x07, 0x20, 0x08, + 0x71, 0x21, 0x09, 0x41, 0x18, 0x21, 0x0a, 0x20, 0x09, 0x20, 0x0a, 0x76, + 0x21, 0x0b, 0x20, 0x04, 0x28, 0x02, 0x08, 0x21, 0x0c, 0x20, 0x0c, 0x20, + 0x0b, 0x3a, 0x00, 0x00, 0x20, 0x04, 0x28, 0x02, 0x0c, 0x21, 0x0d, 0x41, + 0x80, 0x80, 0xfc, 0x07, 0x21, 0x0e, 0x20, 0x0d, 0x20, 0x0e, 0x71, 0x21, + 0x0f, 0x41, 0x10, 0x21, 0x10, 0x20, 0x0f, 0x20, 0x10, 0x76, 0x21, 0x11, + 0x20, 0x04, 0x28, 0x02, 0x08, 0x21, 0x12, 0x20, 0x12, 0x20, 0x11, 0x3a, + 0x00, 0x01, 0x20, 0x04, 0x28, 0x02, 0x0c, 0x21, 0x13, 0x41, 0x80, 0xfe, + 0x03, 0x21, 0x14, 0x20, 0x13, 0x20, 0x14, 0x71, 0x21, 0x15, 0x41, 0x08, + 0x21, 0x16, 0x20, 0x15, 0x20, 0x16, 0x76, 0x21, 0x17, 0x20, 0x04, 0x28, + 0x02, 0x08, 0x21, 0x18, 0x20, 0x18, 0x20, 0x17, 0x3a, 0x00, 0x02, 0x20, + 0x04, 0x28, 0x02, 0x0c, 0x21, 0x19, 0x41, 0xff, 0x01, 0x21, 0x1a, 0x20, + 0x19, 0x20, 0x1a, 0x71, 0x21, 0x1b, 0x20, 0x04, 0x28, 0x02, 0x08, 0x21, + 0x1c, 0x20, 0x1c, 0x20, 0x1b, 0x3a, 0x00, 0x03, 0x41, 0x10, 0x21, 0x1d, + 0x20, 0x04, 0x20, 0x1d, 0x6a, 0x21, 0x1e, 0x20, 0x1e, 0x24, 0x80, 0x80, + 0x80, 0x80, 0x00, 0x0f, 0x0b, 0xd9, 0x03, 0x01, 0x35, 0x7f, 0x23, 0x80, + 0x80, 0x80, 0x80, 0x00, 0x21, 0x02, 0x41, 0x10, 0x21, 0x03, 0x20, 0x02, + 0x20, 0x03, 0x6b, 0x21, 0x04, 0x20, 0x04, 0x24, 0x80, 0x80, 0x80, 0x80, + 0x00, 0x20, 0x04, 0x20, 0x00, 0x36, 0x02, 0x0c, 0x20, 0x04, 0x20, 0x01, + 0x36, 0x02, 0x08, 0x20, 0x04, 0x28, 0x02, 0x0c, 0x21, 0x05, 0x20, 0x05, + 0x2f, 0x01, 0x00, 0x21, 0x06, 0x41, 0xff, 0xff, 0x03, 0x21, 0x07, 0x20, + 0x06, 0x20, 0x07, 0x71, 0x21, 0x08, 0x20, 0x08, 0x10, 0xc7, 0x80, 0x80, + 0x80, 0x00, 0x21, 0x09, 0x20, 0x04, 0x28, 0x02, 0x08, 0x21, 0x0a, 0x20, + 0x0a, 0x20, 0x09, 0x3b, 0x01, 0x00, 0x20, 0x04, 0x28, 0x02, 0x0c, 0x21, + 0x0b, 0x20, 0x0b, 0x2f, 0x01, 0x02, 0x21, 0x0c, 0x41, 0xff, 0xff, 0x03, + 0x21, 0x0d, 0x20, 0x0c, 0x20, 0x0d, 0x71, 0x21, 0x0e, 0x20, 0x0e, 0x10, + 0xc7, 0x80, 0x80, 0x80, 0x00, 0x21, 0x0f, 0x20, 0x04, 0x28, 0x02, 0x08, + 0x21, 0x10, 0x20, 0x10, 0x20, 0x0f, 0x3b, 0x01, 0x02, 0x20, 0x04, 0x28, + 0x02, 0x0c, 0x21, 0x11, 0x20, 0x11, 0x2f, 0x01, 0x04, 0x21, 0x12, 0x41, + 0xff, 0xff, 0x03, 0x21, 0x13, 0x20, 0x12, 0x20, 0x13, 0x71, 0x21, 0x14, + 0x20, 0x14, 0x10, 0xc7, 0x80, 0x80, 0x80, 0x00, 0x21, 0x15, 0x20, 0x04, + 0x28, 0x02, 0x08, 0x21, 0x16, 0x20, 0x16, 0x20, 0x15, 0x3b, 0x01, 0x04, + 0x20, 0x04, 0x28, 0x02, 0x0c, 0x21, 0x17, 0x20, 0x17, 0x2f, 0x01, 0x06, + 0x21, 0x18, 0x41, 0xff, 0xff, 0x03, 0x21, 0x19, 0x20, 0x18, 0x20, 0x19, + 0x71, 0x21, 0x1a, 0x20, 0x1a, 0x10, 0xc7, 0x80, 0x80, 0x80, 0x00, 0x21, + 0x1b, 0x20, 0x04, 0x28, 0x02, 0x08, 0x21, 0x1c, 0x20, 0x1c, 0x20, 0x1b, + 0x3b, 0x01, 0x06, 0x20, 0x04, 0x28, 0x02, 0x0c, 0x21, 0x1d, 0x20, 0x1d, + 0x2f, 0x01, 0x08, 0x21, 0x1e, 0x41, 0xff, 0xff, 0x03, 0x21, 0x1f, 0x20, + 0x1e, 0x20, 0x1f, 0x71, 0x21, 0x20, 0x20, 0x20, 0x10, 0xc7, 0x80, 0x80, + 0x80, 0x00, 0x21, 0x21, 0x20, 0x04, 0x28, 0x02, 0x08, 0x21, 0x22, 0x20, + 0x22, 0x20, 0x21, 0x3b, 0x01, 0x08, 0x20, 0x04, 0x28, 0x02, 0x0c, 0x21, + 0x23, 0x20, 0x23, 0x2f, 0x01, 0x0a, 0x21, 0x24, 0x41, 0xff, 0xff, 0x03, + 0x21, 0x25, 0x20, 0x24, 0x20, 0x25, 0x71, 0x21, 0x26, 0x20, 0x26, 0x10, + 0xc7, 0x80, 0x80, 0x80, 0x00, 0x21, 0x27, 0x20, 0x04, 0x28, 0x02, 0x08, + 0x21, 0x28, 0x20, 0x28, 0x20, 0x27, 0x3b, 0x01, 0x0a, 0x20, 0x04, 0x28, + 0x02, 0x0c, 0x21, 0x29, 0x20, 0x29, 0x2f, 0x01, 0x0c, 0x21, 0x2a, 0x41, + 0xff, 0xff, 0x03, 0x21, 0x2b, 0x20, 0x2a, 0x20, 0x2b, 0x71, 0x21, 0x2c, + 0x20, 0x2c, 0x10, 0xc7, 0x80, 0x80, 0x80, 0x00, 0x21, 0x2d, 0x20, 0x04, + 0x28, 0x02, 0x08, 0x21, 0x2e, 0x20, 0x2e, 0x20, 0x2d, 0x3b, 0x01, 0x0c, + 0x20, 0x04, 0x28, 0x02, 0x0c, 0x21, 0x2f, 0x20, 0x2f, 0x2f, 0x01, 0x0e, + 0x21, 0x30, 0x41, 0xff, 0xff, 0x03, 0x21, 0x31, 0x20, 0x30, 0x20, 0x31, + 0x71, 0x21, 0x32, 0x20, 0x32, 0x10, 0xc7, 0x80, 0x80, 0x80, 0x00, 0x21, + 0x33, 0x20, 0x04, 0x28, 0x02, 0x08, 0x21, 0x34, 0x20, 0x34, 0x20, 0x33, + 0x3b, 0x01, 0x0e, 0x41, 0x10, 0x21, 0x35, 0x20, 0x04, 0x20, 0x35, 0x6a, + 0x21, 0x36, 0x20, 0x36, 0x24, 0x80, 0x80, 0x80, 0x80, 0x00, 0x0f, 0x0b, + 0x0b, 0xfb, 0x17, 0x02, 0x00, 0x41, 0x80, 0x08, 0x0b, 0x80, 0x16, 0x2d, + 0x2b, 0x20, 0x20, 0x20, 0x30, 0x58, 0x30, 0x78, 0x00, 0x2d, 0x30, 0x58, + 0x2b, 0x30, 0x58, 0x20, 0x30, 0x58, 0x2d, 0x30, 0x78, 0x2b, 0x30, 0x78, + 0x20, 0x30, 0x78, 0x00, 0x25, 0x73, 0x00, 0x73, 0x6f, 0x63, 0x6b, 0x61, + 0x64, 0x64, 0x72, 0x5f, 0x74, 0x6f, 0x5f, 0x77, 0x61, 0x73, 0x69, 0x5f, + 0x61, 0x64, 0x64, 0x72, 0x00, 0x73, 0x69, 0x7a, 0x65, 0x6f, 0x66, 0x28, + 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x20, 0x73, 0x6f, 0x63, 0x6b, 0x61, + 0x64, 0x64, 0x72, 0x5f, 0x69, 0x6e, 0x29, 0x20, 0x3c, 0x3d, 0x20, 0x61, + 0x64, 0x64, 0x72, 0x6c, 0x65, 0x6e, 0x00, 0x73, 0x69, 0x7a, 0x65, 0x6f, + 0x66, 0x28, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x20, 0x73, 0x6f, 0x63, + 0x6b, 0x61, 0x64, 0x64, 0x72, 0x5f, 0x69, 0x6e, 0x36, 0x29, 0x20, 0x3c, + 0x3d, 0x20, 0x61, 0x64, 0x64, 0x72, 0x6c, 0x65, 0x6e, 0x00, 0x6e, 0x61, + 0x6e, 0x00, 0x69, 0x6e, 0x66, 0x00, 0x69, 0x6e, 0x63, 0x2f, 0x77, 0x61, + 0x73, 0x69, 0x5f, 0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x5f, 0x65, 0x78, + 0x74, 0x2e, 0x63, 0x00, 0x4e, 0x41, 0x4e, 0x00, 0x49, 0x4e, 0x46, 0x00, + 0x2e, 0x00, 0x28, 0x6e, 0x75, 0x6c, 0x6c, 0x29, 0x00, 0x5b, 0x77, 0x61, + 0x73, 0x6d, 0x2d, 0x6d, 0x6f, 0x64, 0x5d, 0x20, 0x6c, 0x65, 0x6e, 0x20, + 0x3d, 0x20, 0x30, 0x20, 0x62, 0x72, 0x65, 0x61, 0x6b, 0x0a, 0x00, 0x5b, + 0x77, 0x61, 0x73, 0x6d, 0x2d, 0x6d, 0x6f, 0x64, 0x5d, 0x20, 0x43, 0x6f, + 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x63, 0x6c, 0x6f, + 0x73, 0x65, 0x64, 0x0a, 0x00, 0x5b, 0x77, 0x61, 0x73, 0x6d, 0x2d, 0x6d, + 0x6f, 0x64, 0x5d, 0x20, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x20, 0x25, 0x64, + 0x0a, 0x00, 0x5b, 0x77, 0x61, 0x73, 0x6d, 0x2d, 0x6d, 0x6f, 0x64, 0x5d, + 0x20, 0x73, 0x6f, 0x63, 0x6b, 0x20, 0x3d, 0x20, 0x25, 0x64, 0x0a, 0x00, + 0x5b, 0x77, 0x61, 0x73, 0x6d, 0x2d, 0x6d, 0x6f, 0x64, 0x5d, 0x20, 0x63, + 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x20, 0x72, 0x63, 0x20, 0x3d, 0x20, + 0x25, 0x64, 0x0a, 0x00, 0x5b, 0x77, 0x61, 0x73, 0x6d, 0x2d, 0x6d, 0x6f, + 0x64, 0x5d, 0x20, 0x73, 0x65, 0x6e, 0x64, 0x20, 0x72, 0x63, 0x20, 0x3d, + 0x20, 0x25, 0x64, 0x0a, 0x00, 0x5b, 0x77, 0x61, 0x73, 0x6d, 0x2d, 0x6d, + 0x6f, 0x64, 0x5d, 0x20, 0x50, 0x72, 0x65, 0x70, 0x61, 0x72, 0x69, 0x6e, + 0x67, 0x20, 0x48, 0x54, 0x54, 0x50, 0x20, 0x47, 0x45, 0x54, 0x20, 0x72, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x68, + 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x31, 0x39, 0x32, 0x2e, 0x30, 0x2e, + 0x32, 0x2e, 0x31, 0x30, 0x3a, 0x38, 0x30, 0x30, 0x30, 0x2f, 0x0a, 0x00, + 0x53, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x20, 0x66, 0x6f, 0x72, 0x20, + 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x6c, + 0x6f, 0x6e, 0x67, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x73, 0x20, 0x69, 0x73, 0x20, 0x63, 0x75, 0x72, + 0x72, 0x65, 0x6e, 0x74, 0x6c, 0x79, 0x20, 0x64, 0x69, 0x73, 0x61, 0x62, + 0x6c, 0x65, 0x64, 0x2e, 0x0a, 0x54, 0x6f, 0x20, 0x65, 0x6e, 0x61, 0x62, + 0x6c, 0x65, 0x20, 0x69, 0x74, 0x2c, 0x20, 0x61, 0x64, 0x64, 0x20, 0x2d, + 0x6c, 0x63, 0x2d, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x73, 0x63, 0x61, 0x6e, + 0x2d, 0x6c, 0x6f, 0x6e, 0x67, 0x2d, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, + 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6c, 0x69, 0x6e, 0x6b, + 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x2e, 0x0a, 0x00, 0x41, + 0x73, 0x73, 0x65, 0x72, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x66, 0x61, 0x69, + 0x6c, 0x65, 0x64, 0x3a, 0x20, 0x25, 0x73, 0x20, 0x28, 0x25, 0x73, 0x3a, + 0x20, 0x25, 0x73, 0x3a, 0x20, 0x25, 0x64, 0x29, 0x0a, 0x00, 0x47, 0x45, + 0x54, 0x20, 0x2f, 0x20, 0x48, 0x54, 0x54, 0x50, 0x2f, 0x31, 0x2e, 0x30, + 0x0d, 0x0a, 0x48, 0x6f, 0x73, 0x74, 0x3a, 0x20, 0x31, 0x39, 0x32, 0x2e, + 0x30, 0x2e, 0x32, 0x2e, 0x31, 0x30, 0x0d, 0x0a, 0x0d, 0x0a, 0x00, 0x5b, + 0x77, 0x61, 0x73, 0x6d, 0x2d, 0x6d, 0x6f, 0x64, 0x5d, 0x20, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x3a, 0x0a, 0x0a, 0x00, 0x53, 0x75, + 0x63, 0x63, 0x65, 0x73, 0x73, 0x00, 0x49, 0x6c, 0x6c, 0x65, 0x67, 0x61, + 0x6c, 0x20, 0x62, 0x79, 0x74, 0x65, 0x20, 0x73, 0x65, 0x71, 0x75, 0x65, + 0x6e, 0x63, 0x65, 0x00, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x20, 0x65, + 0x72, 0x72, 0x6f, 0x72, 0x00, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x20, + 0x6e, 0x6f, 0x74, 0x20, 0x72, 0x65, 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, + 0x74, 0x61, 0x62, 0x6c, 0x65, 0x00, 0x4e, 0x6f, 0x74, 0x20, 0x61, 0x20, + 0x74, 0x74, 0x79, 0x00, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, + 0x6f, 0x6e, 0x20, 0x64, 0x65, 0x6e, 0x69, 0x65, 0x64, 0x00, 0x4f, 0x70, + 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6e, 0x6f, 0x74, 0x20, + 0x70, 0x65, 0x72, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x00, 0x4e, 0x6f, + 0x20, 0x73, 0x75, 0x63, 0x68, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x20, 0x6f, + 0x72, 0x20, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x00, + 0x4e, 0x6f, 0x20, 0x73, 0x75, 0x63, 0x68, 0x20, 0x70, 0x72, 0x6f, 0x63, + 0x65, 0x73, 0x73, 0x00, 0x46, 0x69, 0x6c, 0x65, 0x20, 0x65, 0x78, 0x69, + 0x73, 0x74, 0x73, 0x00, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x74, 0x6f, + 0x6f, 0x20, 0x6c, 0x61, 0x72, 0x67, 0x65, 0x20, 0x66, 0x6f, 0x72, 0x20, + 0x64, 0x61, 0x74, 0x61, 0x20, 0x74, 0x79, 0x70, 0x65, 0x00, 0x4e, 0x6f, + 0x20, 0x73, 0x70, 0x61, 0x63, 0x65, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x20, + 0x6f, 0x6e, 0x20, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x00, 0x4f, 0x75, + 0x74, 0x20, 0x6f, 0x66, 0x20, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x00, + 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x20, 0x62, 0x75, 0x73, + 0x79, 0x00, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x72, 0x75, 0x70, 0x74, 0x65, + 0x64, 0x20, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x20, 0x63, 0x61, 0x6c, + 0x6c, 0x00, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x20, 0x74, + 0x65, 0x6d, 0x70, 0x6f, 0x72, 0x61, 0x72, 0x69, 0x6c, 0x79, 0x20, 0x75, + 0x6e, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x00, 0x49, + 0x6e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x20, 0x73, 0x65, 0x65, 0x6b, 0x00, + 0x43, 0x72, 0x6f, 0x73, 0x73, 0x2d, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, + 0x20, 0x6c, 0x69, 0x6e, 0x6b, 0x00, 0x52, 0x65, 0x61, 0x64, 0x2d, 0x6f, + 0x6e, 0x6c, 0x79, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x20, 0x73, 0x79, 0x73, + 0x74, 0x65, 0x6d, 0x00, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, + 0x79, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x00, + 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x72, + 0x65, 0x73, 0x65, 0x74, 0x20, 0x62, 0x79, 0x20, 0x70, 0x65, 0x65, 0x72, + 0x00, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, + 0x69, 0x6d, 0x65, 0x64, 0x20, 0x6f, 0x75, 0x74, 0x00, 0x43, 0x6f, 0x6e, + 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x72, 0x65, 0x66, 0x75, + 0x73, 0x65, 0x64, 0x00, 0x48, 0x6f, 0x73, 0x74, 0x20, 0x69, 0x73, 0x20, + 0x75, 0x6e, 0x72, 0x65, 0x61, 0x63, 0x68, 0x61, 0x62, 0x6c, 0x65, 0x00, + 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x20, 0x69, 0x6e, 0x20, 0x75, + 0x73, 0x65, 0x00, 0x42, 0x72, 0x6f, 0x6b, 0x65, 0x6e, 0x20, 0x70, 0x69, + 0x70, 0x65, 0x00, 0x49, 0x2f, 0x4f, 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, + 0x00, 0x4e, 0x6f, 0x20, 0x73, 0x75, 0x63, 0x68, 0x20, 0x64, 0x65, 0x76, + 0x69, 0x63, 0x65, 0x20, 0x6f, 0x72, 0x20, 0x61, 0x64, 0x64, 0x72, 0x65, + 0x73, 0x73, 0x00, 0x4e, 0x6f, 0x20, 0x73, 0x75, 0x63, 0x68, 0x20, 0x64, + 0x65, 0x76, 0x69, 0x63, 0x65, 0x00, 0x4e, 0x6f, 0x74, 0x20, 0x61, 0x20, + 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x00, 0x49, 0x73, + 0x20, 0x61, 0x20, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, + 0x00, 0x54, 0x65, 0x78, 0x74, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x20, 0x62, + 0x75, 0x73, 0x79, 0x00, 0x45, 0x78, 0x65, 0x63, 0x20, 0x66, 0x6f, 0x72, + 0x6d, 0x61, 0x74, 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x00, 0x49, 0x6e, + 0x76, 0x61, 0x6c, 0x69, 0x64, 0x20, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, + 0x6e, 0x74, 0x00, 0x41, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x20, + 0x6c, 0x69, 0x73, 0x74, 0x20, 0x74, 0x6f, 0x6f, 0x20, 0x6c, 0x6f, 0x6e, + 0x67, 0x00, 0x53, 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x69, 0x63, 0x20, 0x6c, + 0x69, 0x6e, 0x6b, 0x20, 0x6c, 0x6f, 0x6f, 0x70, 0x00, 0x46, 0x69, 0x6c, + 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x74, 0x6f, 0x6f, 0x20, 0x6c, 0x6f, + 0x6e, 0x67, 0x00, 0x54, 0x6f, 0x6f, 0x20, 0x6d, 0x61, 0x6e, 0x79, 0x20, + 0x6f, 0x70, 0x65, 0x6e, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x20, 0x69, + 0x6e, 0x20, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x00, 0x4e, 0x6f, 0x20, + 0x66, 0x69, 0x6c, 0x65, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x6f, 0x72, 0x73, 0x20, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, + 0x6c, 0x65, 0x00, 0x42, 0x61, 0x64, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x20, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x00, 0x4e, + 0x6f, 0x20, 0x63, 0x68, 0x69, 0x6c, 0x64, 0x20, 0x70, 0x72, 0x6f, 0x63, + 0x65, 0x73, 0x73, 0x00, 0x42, 0x61, 0x64, 0x20, 0x61, 0x64, 0x64, 0x72, + 0x65, 0x73, 0x73, 0x00, 0x46, 0x69, 0x6c, 0x65, 0x20, 0x74, 0x6f, 0x6f, + 0x20, 0x6c, 0x61, 0x72, 0x67, 0x65, 0x00, 0x54, 0x6f, 0x6f, 0x20, 0x6d, + 0x61, 0x6e, 0x79, 0x20, 0x6c, 0x69, 0x6e, 0x6b, 0x73, 0x00, 0x4e, 0x6f, + 0x20, 0x6c, 0x6f, 0x63, 0x6b, 0x73, 0x20, 0x61, 0x76, 0x61, 0x69, 0x6c, + 0x61, 0x62, 0x6c, 0x65, 0x00, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, + 0x65, 0x20, 0x64, 0x65, 0x61, 0x64, 0x6c, 0x6f, 0x63, 0x6b, 0x20, 0x77, + 0x6f, 0x75, 0x6c, 0x64, 0x20, 0x6f, 0x63, 0x63, 0x75, 0x72, 0x00, 0x53, + 0x74, 0x61, 0x74, 0x65, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x72, 0x65, 0x63, + 0x6f, 0x76, 0x65, 0x72, 0x61, 0x62, 0x6c, 0x65, 0x00, 0x50, 0x72, 0x65, + 0x76, 0x69, 0x6f, 0x75, 0x73, 0x20, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x20, + 0x64, 0x69, 0x65, 0x64, 0x00, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x63, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x65, 0x64, 0x00, + 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6e, 0x6f, 0x74, + 0x20, 0x69, 0x6d, 0x70, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x65, 0x64, + 0x00, 0x4e, 0x6f, 0x20, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x20, + 0x6f, 0x66, 0x20, 0x64, 0x65, 0x73, 0x69, 0x72, 0x65, 0x64, 0x20, 0x74, + 0x79, 0x70, 0x65, 0x00, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, + 0x65, 0x72, 0x20, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x64, 0x00, 0x4c, + 0x69, 0x6e, 0x6b, 0x20, 0x68, 0x61, 0x73, 0x20, 0x62, 0x65, 0x65, 0x6e, + 0x20, 0x73, 0x65, 0x76, 0x65, 0x72, 0x65, 0x64, 0x00, 0x50, 0x72, 0x6f, + 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x00, + 0x42, 0x61, 0x64, 0x20, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x00, + 0x4e, 0x6f, 0x74, 0x20, 0x61, 0x20, 0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, + 0x00, 0x44, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x20, 0x72, 0x65, 0x71, + 0x75, 0x69, 0x72, 0x65, 0x64, 0x00, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, + 0x65, 0x20, 0x74, 0x6f, 0x6f, 0x20, 0x6c, 0x61, 0x72, 0x67, 0x65, 0x00, + 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x20, 0x77, 0x72, 0x6f, + 0x6e, 0x67, 0x20, 0x74, 0x79, 0x70, 0x65, 0x20, 0x66, 0x6f, 0x72, 0x20, + 0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x00, 0x50, 0x72, 0x6f, 0x74, 0x6f, + 0x63, 0x6f, 0x6c, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x61, 0x76, 0x61, 0x69, + 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x00, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, + 0x6f, 0x6c, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x73, 0x75, 0x70, 0x70, 0x6f, + 0x72, 0x74, 0x65, 0x64, 0x00, 0x4e, 0x6f, 0x74, 0x20, 0x73, 0x75, 0x70, + 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x00, 0x41, 0x64, 0x64, 0x72, 0x65, + 0x73, 0x73, 0x20, 0x66, 0x61, 0x6d, 0x69, 0x6c, 0x79, 0x20, 0x6e, 0x6f, + 0x74, 0x20, 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x20, + 0x62, 0x79, 0x20, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x00, + 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x20, 0x6e, 0x6f, 0x74, 0x20, + 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x00, 0x4e, 0x65, + 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x20, 0x69, 0x73, 0x20, 0x64, 0x6f, 0x77, + 0x6e, 0x00, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x20, 0x75, 0x6e, + 0x72, 0x65, 0x61, 0x63, 0x68, 0x61, 0x62, 0x6c, 0x65, 0x00, 0x43, 0x6f, + 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x72, 0x65, 0x73, + 0x65, 0x74, 0x20, 0x62, 0x79, 0x20, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, + 0x6b, 0x00, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x61, 0x62, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x00, 0x4e, 0x6f, 0x20, + 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x20, 0x73, 0x70, 0x61, 0x63, 0x65, + 0x20, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x00, 0x53, + 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x20, 0x69, 0x73, 0x20, 0x63, 0x6f, 0x6e, + 0x6e, 0x65, 0x63, 0x74, 0x65, 0x64, 0x00, 0x53, 0x6f, 0x63, 0x6b, 0x65, + 0x74, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, + 0x74, 0x65, 0x64, 0x00, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x61, 0x6c, 0x72, 0x65, 0x61, 0x64, 0x79, 0x20, 0x69, 0x6e, + 0x20, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x00, 0x4f, 0x70, + 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x69, 0x6e, 0x20, 0x70, + 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x00, 0x53, 0x74, 0x61, 0x6c, + 0x65, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x20, 0x68, 0x61, 0x6e, 0x64, 0x6c, + 0x65, 0x00, 0x51, 0x75, 0x6f, 0x74, 0x61, 0x20, 0x65, 0x78, 0x63, 0x65, + 0x65, 0x64, 0x65, 0x64, 0x00, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x68, 0x6f, + 0x70, 0x20, 0x61, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x65, 0x64, 0x00, + 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, + 0x20, 0x69, 0x6e, 0x73, 0x75, 0x66, 0x66, 0x69, 0x63, 0x69, 0x65, 0x6e, + 0x74, 0x00, 0x00, 0x00, 0x00, 0x75, 0x02, 0x4e, 0x00, 0xd6, 0x01, 0xe2, + 0x04, 0xb9, 0x04, 0x18, 0x01, 0x8e, 0x05, 0xed, 0x02, 0x16, 0x04, 0xf2, + 0x00, 0x97, 0x03, 0x01, 0x03, 0x38, 0x05, 0xaf, 0x01, 0x82, 0x01, 0x4f, + 0x03, 0x2f, 0x04, 0x1e, 0x00, 0xd4, 0x05, 0xa2, 0x00, 0x12, 0x03, 0x1e, + 0x03, 0xc2, 0x01, 0xde, 0x03, 0x08, 0x00, 0xac, 0x05, 0x00, 0x01, 0x64, + 0x02, 0xf1, 0x01, 0x65, 0x05, 0x34, 0x02, 0x8c, 0x02, 0xcf, 0x02, 0x2d, + 0x03, 0x4c, 0x04, 0xe3, 0x05, 0x9f, 0x02, 0xf8, 0x04, 0x1c, 0x05, 0x08, + 0x05, 0xb1, 0x02, 0x4b, 0x05, 0x15, 0x02, 0x78, 0x00, 0x52, 0x02, 0x3c, + 0x03, 0xf1, 0x03, 0xe4, 0x00, 0xc3, 0x03, 0x7d, 0x04, 0xcc, 0x00, 0xaa, + 0x03, 0x79, 0x05, 0x24, 0x02, 0x6e, 0x01, 0x6d, 0x03, 0x22, 0x04, 0xab, + 0x04, 0x44, 0x00, 0xfb, 0x01, 0xae, 0x00, 0x83, 0x03, 0x60, 0x00, 0xe5, + 0x01, 0x07, 0x04, 0x94, 0x04, 0x5e, 0x04, 0x2b, 0x00, 0x58, 0x01, 0x39, + 0x01, 0x92, 0x00, 0xc2, 0x05, 0x9b, 0x01, 0x43, 0x02, 0x46, 0x01, 0xf6, + 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x19, 0x00, 0x0a, 0x00, 0x19, + 0x19, 0x19, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x19, 0x00, 0x11, 0x0a, 0x19, 0x19, 0x19, 0x03, 0x0a, + 0x07, 0x00, 0x01, 0x1b, 0x09, 0x0b, 0x18, 0x00, 0x00, 0x09, 0x06, 0x0b, + 0x00, 0x00, 0x0b, 0x00, 0x06, 0x19, 0x00, 0x00, 0x00, 0x19, 0x19, 0x19, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x19, 0x00, 0x0a, 0x0d, 0x19, 0x19, 0x19, 0x00, 0x0d, 0x00, 0x00, + 0x02, 0x00, 0x09, 0x0e, 0x00, 0x00, 0x00, 0x09, 0x00, 0x0e, 0x00, 0x00, + 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x00, + 0x09, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x0c, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x0f, 0x00, 0x00, 0x00, 0x04, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x09, 0x10, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, + 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x00, 0x09, 0x12, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x12, 0x00, 0x00, 0x1a, 0x00, 0x00, + 0x00, 0x1a, 0x1a, 0x1a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x00, 0x00, 0x00, 0x1a, 0x1a, 0x1a, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x17, 0x00, 0x00, 0x00, 0x00, 0x17, + 0x00, 0x00, 0x00, 0x00, 0x09, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, + 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x15, 0x00, 0x00, 0x00, 0x00, 0x15, 0x00, 0x00, + 0x00, 0x00, 0x09, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x16, 0x00, 0x00, + 0x16, 0x00, 0x00, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, + 0x39, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x00, 0x41, 0x80, 0x1e, 0x0b, + 0xec, 0x01, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, + 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x08, 0x16, 0x00, 0x00, 0x00, 0x04, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, + 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x34, 0x1a, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x0f, 0x00, 0x00, 0x00, 0xbb, + 0x0c, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x01, 0xeb, 0x0b, 0x57, 0x00, 0x2a, + 0x5f, 0x5f, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x5f, 0x77, + 0x61, 0x73, 0x69, 0x5f, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, + 0x5f, 0x70, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x31, 0x5f, 0x61, 0x72, + 0x67, 0x73, 0x5f, 0x67, 0x65, 0x74, 0x01, 0x30, 0x5f, 0x5f, 0x69, 0x6d, + 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x5f, 0x77, 0x61, 0x73, 0x69, 0x5f, + 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x5f, 0x70, 0x72, 0x65, + 0x76, 0x69, 0x65, 0x77, 0x31, 0x5f, 0x61, 0x72, 0x67, 0x73, 0x5f, 0x73, + 0x69, 0x7a, 0x65, 0x73, 0x5f, 0x67, 0x65, 0x74, 0x02, 0x2a, 0x5f, 0x5f, + 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x5f, 0x77, 0x61, 0x73, + 0x69, 0x5f, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x5f, 0x70, + 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x31, 0x5f, 0x66, 0x64, 0x5f, 0x63, + 0x6c, 0x6f, 0x73, 0x65, 0x03, 0x2f, 0x5f, 0x5f, 0x69, 0x6d, 0x70, 0x6f, + 0x72, 0x74, 0x65, 0x64, 0x5f, 0x77, 0x61, 0x73, 0x69, 0x5f, 0x73, 0x6e, + 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x5f, 0x70, 0x72, 0x65, 0x76, 0x69, + 0x65, 0x77, 0x31, 0x5f, 0x66, 0x64, 0x5f, 0x66, 0x64, 0x73, 0x74, 0x61, + 0x74, 0x5f, 0x67, 0x65, 0x74, 0x04, 0x29, 0x5f, 0x5f, 0x69, 0x6d, 0x70, + 0x6f, 0x72, 0x74, 0x65, 0x64, 0x5f, 0x77, 0x61, 0x73, 0x69, 0x5f, 0x73, + 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x5f, 0x70, 0x72, 0x65, 0x76, + 0x69, 0x65, 0x77, 0x31, 0x5f, 0x66, 0x64, 0x5f, 0x73, 0x65, 0x65, 0x6b, + 0x05, 0x2a, 0x5f, 0x5f, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64, + 0x5f, 0x77, 0x61, 0x73, 0x69, 0x5f, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, + 0x6f, 0x74, 0x5f, 0x70, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x31, 0x5f, + 0x66, 0x64, 0x5f, 0x77, 0x72, 0x69, 0x74, 0x65, 0x06, 0x2b, 0x5f, 0x5f, + 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x5f, 0x77, 0x61, 0x73, + 0x69, 0x5f, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x5f, 0x70, + 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x31, 0x5f, 0x70, 0x72, 0x6f, 0x63, + 0x5f, 0x65, 0x78, 0x69, 0x74, 0x07, 0x2b, 0x5f, 0x5f, 0x69, 0x6d, 0x70, + 0x6f, 0x72, 0x74, 0x65, 0x64, 0x5f, 0x77, 0x61, 0x73, 0x69, 0x5f, 0x73, + 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x5f, 0x70, 0x72, 0x65, 0x76, + 0x69, 0x65, 0x77, 0x31, 0x5f, 0x73, 0x6f, 0x63, 0x6b, 0x5f, 0x72, 0x65, + 0x63, 0x76, 0x08, 0x2e, 0x5f, 0x5f, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, + 0x65, 0x64, 0x5f, 0x77, 0x61, 0x73, 0x69, 0x5f, 0x73, 0x6e, 0x61, 0x70, + 0x73, 0x68, 0x6f, 0x74, 0x5f, 0x70, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, + 0x31, 0x5f, 0x73, 0x6f, 0x63, 0x6b, 0x5f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, + 0x63, 0x74, 0x09, 0x2e, 0x5f, 0x5f, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, + 0x65, 0x64, 0x5f, 0x77, 0x61, 0x73, 0x69, 0x5f, 0x73, 0x6e, 0x61, 0x70, + 0x73, 0x68, 0x6f, 0x74, 0x5f, 0x70, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, + 0x31, 0x5f, 0x73, 0x6f, 0x63, 0x6b, 0x5f, 0x73, 0x65, 0x6e, 0x64, 0x5f, + 0x74, 0x6f, 0x0a, 0x30, 0x5f, 0x5f, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, + 0x65, 0x64, 0x5f, 0x77, 0x61, 0x73, 0x69, 0x5f, 0x73, 0x6e, 0x61, 0x70, + 0x73, 0x68, 0x6f, 0x74, 0x5f, 0x70, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, + 0x31, 0x5f, 0x73, 0x6f, 0x63, 0x6b, 0x5f, 0x72, 0x65, 0x63, 0x76, 0x5f, + 0x66, 0x72, 0x6f, 0x6d, 0x0b, 0x2b, 0x5f, 0x5f, 0x69, 0x6d, 0x70, 0x6f, + 0x72, 0x74, 0x65, 0x64, 0x5f, 0x77, 0x61, 0x73, 0x69, 0x5f, 0x73, 0x6e, + 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x5f, 0x70, 0x72, 0x65, 0x76, 0x69, + 0x65, 0x77, 0x31, 0x5f, 0x73, 0x6f, 0x63, 0x6b, 0x5f, 0x6f, 0x70, 0x65, + 0x6e, 0x0c, 0x11, 0x5f, 0x5f, 0x77, 0x61, 0x73, 0x6d, 0x5f, 0x63, 0x61, + 0x6c, 0x6c, 0x5f, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x0d, 0x06, 0x5f, 0x73, + 0x74, 0x61, 0x72, 0x74, 0x0e, 0x04, 0x6d, 0x61, 0x69, 0x6e, 0x0f, 0x06, + 0x6d, 0x61, 0x6c, 0x6c, 0x6f, 0x63, 0x10, 0x08, 0x64, 0x6c, 0x6d, 0x61, + 0x6c, 0x6c, 0x6f, 0x63, 0x11, 0x04, 0x66, 0x72, 0x65, 0x65, 0x12, 0x06, + 0x64, 0x6c, 0x66, 0x72, 0x65, 0x65, 0x13, 0x06, 0x63, 0x61, 0x6c, 0x6c, + 0x6f, 0x63, 0x14, 0x05, 0x5f, 0x45, 0x78, 0x69, 0x74, 0x15, 0x0b, 0x5f, + 0x5f, 0x6d, 0x61, 0x69, 0x6e, 0x5f, 0x76, 0x6f, 0x69, 0x64, 0x16, 0x1c, + 0x5f, 0x5f, 0x77, 0x61, 0x73, 0x69, 0x6c, 0x69, 0x62, 0x63, 0x5f, 0x70, + 0x6f, 0x70, 0x75, 0x6c, 0x61, 0x74, 0x65, 0x5f, 0x70, 0x72, 0x65, 0x6f, + 0x70, 0x65, 0x6e, 0x73, 0x17, 0x05, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x18, + 0x0f, 0x5f, 0x5f, 0x77, 0x61, 0x73, 0x69, 0x5f, 0x61, 0x72, 0x67, 0x73, + 0x5f, 0x67, 0x65, 0x74, 0x19, 0x15, 0x5f, 0x5f, 0x77, 0x61, 0x73, 0x69, + 0x5f, 0x61, 0x72, 0x67, 0x73, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x73, 0x5f, + 0x67, 0x65, 0x74, 0x1a, 0x0f, 0x5f, 0x5f, 0x77, 0x61, 0x73, 0x69, 0x5f, + 0x66, 0x64, 0x5f, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x1b, 0x14, 0x5f, 0x5f, + 0x77, 0x61, 0x73, 0x69, 0x5f, 0x66, 0x64, 0x5f, 0x66, 0x64, 0x73, 0x74, + 0x61, 0x74, 0x5f, 0x67, 0x65, 0x74, 0x1c, 0x0e, 0x5f, 0x5f, 0x77, 0x61, + 0x73, 0x69, 0x5f, 0x66, 0x64, 0x5f, 0x73, 0x65, 0x65, 0x6b, 0x1d, 0x0f, + 0x5f, 0x5f, 0x77, 0x61, 0x73, 0x69, 0x5f, 0x66, 0x64, 0x5f, 0x77, 0x72, + 0x69, 0x74, 0x65, 0x1e, 0x10, 0x5f, 0x5f, 0x77, 0x61, 0x73, 0x69, 0x5f, + 0x70, 0x72, 0x6f, 0x63, 0x5f, 0x65, 0x78, 0x69, 0x74, 0x1f, 0x10, 0x5f, + 0x5f, 0x77, 0x61, 0x73, 0x69, 0x5f, 0x73, 0x6f, 0x63, 0x6b, 0x5f, 0x72, + 0x65, 0x63, 0x76, 0x20, 0x05, 0x61, 0x62, 0x6f, 0x72, 0x74, 0x21, 0x04, + 0x73, 0x62, 0x72, 0x6b, 0x22, 0x05, 0x64, 0x75, 0x6d, 0x6d, 0x79, 0x23, + 0x11, 0x5f, 0x5f, 0x77, 0x61, 0x73, 0x6d, 0x5f, 0x63, 0x61, 0x6c, 0x6c, + 0x5f, 0x64, 0x74, 0x6f, 0x72, 0x73, 0x24, 0x05, 0x68, 0x74, 0x6f, 0x6e, + 0x6c, 0x25, 0x05, 0x68, 0x74, 0x6f, 0x6e, 0x73, 0x26, 0x06, 0x70, 0x72, + 0x69, 0x6e, 0x74, 0x66, 0x27, 0x0d, 0x5f, 0x5f, 0x73, 0x74, 0x64, 0x69, + 0x6f, 0x5f, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x28, 0x06, 0x77, 0x72, 0x69, + 0x74, 0x65, 0x76, 0x29, 0x0d, 0x5f, 0x5f, 0x73, 0x74, 0x64, 0x69, 0x6f, + 0x5f, 0x77, 0x72, 0x69, 0x74, 0x65, 0x2a, 0x08, 0x5f, 0x5f, 0x69, 0x73, + 0x61, 0x74, 0x74, 0x79, 0x2b, 0x0e, 0x5f, 0x5f, 0x73, 0x74, 0x64, 0x6f, + 0x75, 0x74, 0x5f, 0x77, 0x72, 0x69, 0x74, 0x65, 0x2c, 0x07, 0x5f, 0x5f, + 0x6c, 0x73, 0x65, 0x65, 0x6b, 0x2d, 0x0c, 0x5f, 0x5f, 0x73, 0x74, 0x64, + 0x69, 0x6f, 0x5f, 0x73, 0x65, 0x65, 0x6b, 0x2e, 0x0a, 0x5f, 0x5f, 0x6f, + 0x66, 0x6c, 0x5f, 0x6c, 0x6f, 0x63, 0x6b, 0x2f, 0x0c, 0x5f, 0x5f, 0x73, + 0x74, 0x64, 0x69, 0x6f, 0x5f, 0x65, 0x78, 0x69, 0x74, 0x30, 0x09, 0x5f, + 0x5f, 0x74, 0x6f, 0x77, 0x72, 0x69, 0x74, 0x65, 0x31, 0x09, 0x5f, 0x5f, + 0x66, 0x77, 0x72, 0x69, 0x74, 0x65, 0x78, 0x32, 0x06, 0x66, 0x77, 0x72, + 0x69, 0x74, 0x65, 0x33, 0x05, 0x64, 0x75, 0x6d, 0x6d, 0x79, 0x34, 0x09, + 0x5f, 0x5f, 0x6c, 0x63, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x35, 0x08, 0x73, + 0x74, 0x72, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x36, 0x07, 0x77, 0x63, 0x72, + 0x74, 0x6f, 0x6d, 0x62, 0x37, 0x06, 0x77, 0x63, 0x74, 0x6f, 0x6d, 0x62, + 0x38, 0x05, 0x66, 0x72, 0x65, 0x78, 0x70, 0x39, 0x05, 0x66, 0x70, 0x75, + 0x74, 0x73, 0x3a, 0x08, 0x76, 0x66, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x66, + 0x3b, 0x0b, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x66, 0x5f, 0x63, 0x6f, 0x72, + 0x65, 0x3c, 0x07, 0x70, 0x6f, 0x70, 0x5f, 0x61, 0x72, 0x67, 0x3d, 0x03, + 0x70, 0x61, 0x64, 0x3e, 0x19, 0x6c, 0x6f, 0x6e, 0x67, 0x5f, 0x64, 0x6f, + 0x75, 0x62, 0x6c, 0x65, 0x5f, 0x6e, 0x6f, 0x74, 0x5f, 0x73, 0x75, 0x70, + 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x3f, 0x06, 0x6d, 0x65, 0x6d, 0x63, + 0x70, 0x79, 0x40, 0x06, 0x6d, 0x65, 0x6d, 0x73, 0x65, 0x74, 0x41, 0x06, + 0x73, 0x74, 0x72, 0x6c, 0x65, 0x6e, 0x42, 0x06, 0x6d, 0x65, 0x6d, 0x63, + 0x68, 0x72, 0x43, 0x07, 0x73, 0x74, 0x72, 0x6e, 0x6c, 0x65, 0x6e, 0x44, + 0x07, 0x66, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x66, 0x45, 0x0d, 0x5f, 0x5f, + 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x5f, 0x66, 0x61, 0x69, 0x6c, 0x46, + 0x04, 0x72, 0x65, 0x63, 0x76, 0x47, 0x05, 0x6e, 0x74, 0x6f, 0x68, 0x73, + 0x48, 0x05, 0x6e, 0x74, 0x6f, 0x68, 0x6c, 0x49, 0x15, 0x77, 0x61, 0x73, + 0x69, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x5f, 0x74, 0x6f, 0x5f, 0x73, 0x6f, + 0x63, 0x6b, 0x61, 0x64, 0x64, 0x72, 0x4a, 0x15, 0x73, 0x6f, 0x63, 0x6b, + 0x61, 0x64, 0x64, 0x72, 0x5f, 0x74, 0x6f, 0x5f, 0x77, 0x61, 0x73, 0x69, + 0x5f, 0x61, 0x64, 0x64, 0x72, 0x4b, 0x16, 0x69, 0x70, 0x76, 0x34, 0x5f, + 0x61, 0x64, 0x64, 0x72, 0x5f, 0x74, 0x6f, 0x5f, 0x77, 0x61, 0x73, 0x69, + 0x5f, 0x61, 0x64, 0x64, 0x72, 0x4c, 0x16, 0x69, 0x70, 0x76, 0x36, 0x5f, + 0x61, 0x64, 0x64, 0x72, 0x5f, 0x74, 0x6f, 0x5f, 0x77, 0x61, 0x73, 0x69, + 0x5f, 0x61, 0x64, 0x64, 0x72, 0x4d, 0x07, 0x63, 0x6f, 0x6e, 0x6e, 0x65, + 0x63, 0x74, 0x4e, 0x13, 0x5f, 0x5f, 0x77, 0x61, 0x73, 0x69, 0x5f, 0x73, + 0x6f, 0x63, 0x6b, 0x5f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x4f, + 0x06, 0x73, 0x65, 0x6e, 0x64, 0x74, 0x6f, 0x50, 0x13, 0x5f, 0x5f, 0x77, + 0x61, 0x73, 0x69, 0x5f, 0x73, 0x6f, 0x63, 0x6b, 0x5f, 0x73, 0x65, 0x6e, + 0x64, 0x5f, 0x74, 0x6f, 0x51, 0x08, 0x72, 0x65, 0x63, 0x76, 0x66, 0x72, + 0x6f, 0x6d, 0x52, 0x15, 0x5f, 0x5f, 0x77, 0x61, 0x73, 0x69, 0x5f, 0x73, + 0x6f, 0x63, 0x6b, 0x5f, 0x72, 0x65, 0x63, 0x76, 0x5f, 0x66, 0x72, 0x6f, + 0x6d, 0x53, 0x06, 0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x54, 0x10, 0x5f, + 0x5f, 0x77, 0x61, 0x73, 0x69, 0x5f, 0x73, 0x6f, 0x63, 0x6b, 0x5f, 0x6f, + 0x70, 0x65, 0x6e, 0x55, 0x1a, 0x69, 0x70, 0x76, 0x34, 0x5f, 0x61, 0x64, + 0x64, 0x72, 0x5f, 0x74, 0x6f, 0x5f, 0x77, 0x61, 0x73, 0x69, 0x5f, 0x69, + 0x70, 0x34, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x56, 0x1b, 0x69, 0x70, 0x76, + 0x36, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x5f, 0x74, 0x6f, 0x5f, 0x77, 0x61, + 0x73, 0x69, 0x5f, 0x69, 0x70, 0x76, 0x36, 0x5f, 0x61, 0x64, 0x64, 0x72, + 0x07, 0x33, 0x02, 0x00, 0x0f, 0x5f, 0x5f, 0x73, 0x74, 0x61, 0x63, 0x6b, + 0x5f, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x01, 0x1f, 0x47, 0x4f, + 0x54, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, + 0x6e, 0x61, 0x6c, 0x2e, 0x5f, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, + 0x5f, 0x62, 0x61, 0x73, 0x65, 0x09, 0x11, 0x02, 0x00, 0x07, 0x2e, 0x72, + 0x6f, 0x64, 0x61, 0x74, 0x61, 0x01, 0x05, 0x2e, 0x64, 0x61, 0x74, 0x61, + 0x00, 0x26, 0x09, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x65, 0x72, 0x73, + 0x01, 0x0c, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x65, 0x64, 0x2d, + 0x62, 0x79, 0x01, 0x05, 0x63, 0x6c, 0x61, 0x6e, 0x67, 0x06, 0x31, 0x37, + 0x2e, 0x30, 0x2e, 0x36, 0x00, 0x39, 0x0f, 0x74, 0x61, 0x72, 0x67, 0x65, + 0x74, 0x5f, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x03, 0x2b, + 0x0b, 0x62, 0x75, 0x6c, 0x6b, 0x2d, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, + 0x2b, 0x0f, 0x6d, 0x75, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2d, 0x67, 0x6c, + 0x6f, 0x62, 0x61, 0x6c, 0x73, 0x2b, 0x08, 0x73, 0x69, 0x67, 0x6e, 0x2d, + 0x65, 0x78, 0x74 +}; \ No newline at end of file diff --git a/product-mini/platforms/zephyr/simple-http/src/main.c b/product-mini/platforms/zephyr/simple-http/src/main.c new file mode 100644 index 0000000000..a9caf5d0c4 --- /dev/null +++ b/product-mini/platforms/zephyr/simple-http/src/main.c @@ -0,0 +1,141 @@ +/* + * Copyright (C) 2019 Intel Corporation. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception + */ + +// #include + +#include +#include +#include "bh_platform.h" +#include "bh_assert.h" +#include "bh_log.h" +#include "wasm_export.h" +#include "http_get.h" + +#include +#include +#include +#include +#include +#include + +#define CONFIG_HEAP_MEM_POOL_SIZE WASM_GLOBAL_HEAP_SIZE +#define CONFIG_APP_STACK_SIZE 8192 +#define CONFIG_APP_HEAP_SIZE 8192 + +static char global_heap_buf[CONFIG_HEAP_MEM_POOL_SIZE] = { 0 }; + +static int app_argc; +static char **app_argv; + +int +main(void) +{ + int start, end; + start = k_uptime_get_32(); + uint8 *wasm_file_buf = NULL; + uint32 wasm_file_size; + wasm_module_t wasm_module = NULL; + wasm_module_inst_t wasm_module_inst = NULL; + RuntimeInitArgs init_args; + char error_buf[128]; + const char *exception; + + int log_verbose_level = 2; + + memset(&init_args, 0, sizeof(RuntimeInitArgs)); + +#if WASM_ENABLE_GLOBAL_HEAP_POOL != 0 + init_args.mem_alloc_type = Alloc_With_Pool; + init_args.mem_alloc_option.pool.heap_buf = global_heap_buf; + init_args.mem_alloc_option.pool.heap_size = sizeof(global_heap_buf); + printf("global heap size: %d\n", sizeof(global_heap_buf)); +#else +#error "memory allocation scheme is not defined." +#endif + + /* initialize runtime environment */ + if (!wasm_runtime_full_init(&init_args)) { + printf("Init runtime environment failed.\n"); + return; + } + + bh_log_set_verbose_level(log_verbose_level); + + /* load WASM byte buffer from byte buffer of include file */ + wasm_file_buf = (uint8 *)wasm_test_file; + wasm_file_size = sizeof(wasm_test_file); + printf("Wasm file size: %d\n", wasm_file_size); + + /* load WASM module */ + if (!(wasm_module = wasm_runtime_load(wasm_file_buf, wasm_file_size, + error_buf, sizeof(error_buf)))) { + printf("Failed to load module: %s\n", error_buf); + goto fail1; + } + + /* Set the WASI context */ +#if WASM_ENABLE_LIBC_WASI != 0 +#define ADDRESS_POOL_SIZE 1 + const char *addr_pool[ADDRESS_POOL_SIZE] = { + "192.0.2.10/24", + }; + /* No dir list => No file system + * dir_cont = 0 + * No mapped dir list => No file system + * map_dir_cont = 0 + * No environment variables + * env_count = 0 + * No command line arguments + * argv 0 + */ + wasm_runtime_set_wasi_args(wasm_module, NULL, 0, NULL, 0, NULL, 0, NULL, 0); + wasm_runtime_set_wasi_addr_pool(wasm_module, addr_pool, ADDRESS_POOL_SIZE); + wasm_runtime_set_wasi_ns_lookup_pool(wasm_module, NULL, 0); +#endif + + /* instantiate the module */ + if (!(wasm_module_inst = wasm_runtime_instantiate( + wasm_module, CONFIG_APP_STACK_SIZE, CONFIG_APP_HEAP_SIZE, + error_buf, sizeof(error_buf)))) { + printf("Failed to instantiate module: %s\n", error_buf); + goto fail2; + } + + /* invoke the main function */ + if (wasm_runtime_lookup_function(wasm_module_inst, "_start") + || wasm_runtime_lookup_function(wasm_module_inst, "__main_argc_argv")) { + + printf("main found\n"); + wasm_application_execute_main(wasm_module_inst, 0, NULL); + printf("main executed\n"); + } + else { + printf("Failed to lookup function main\n"); + return -1; + } + + if ((exception = wasm_runtime_get_exception(wasm_module_inst))) + printf("%s\n", exception); + + int rc = wasm_runtime_get_wasi_exit_code(wasm_module_inst); + printf("wasi exit code: %d\n", rc); // 1 = _WASI_E2BIG + + /* destroy the module instance */ + wasm_runtime_deinstantiate(wasm_module_inst); + +fail2: + /* unload the module */ + wasm_runtime_unload(wasm_module); + +fail1: + /* destroy runtime environment */ + wasm_runtime_destroy(); + + end = k_uptime_get_32(); + + printf("elapsed: %dms\n", (end - start)); + + return 0; +} \ No newline at end of file diff --git a/product-mini/platforms/zephyr/simple-http/to_c_header.py b/product-mini/platforms/zephyr/simple-http/to_c_header.py new file mode 100644 index 0000000000..c9adf57dd8 --- /dev/null +++ b/product-mini/platforms/zephyr/simple-http/to_c_header.py @@ -0,0 +1,34 @@ +# Copyright (C) 2024 Grenoble INP - ESISAR. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception + +# Python script to convert wasm file to byte array in a .h file +import os + +CWD = os.getcwd() +CMAKE_CURRENT_BINARY_DIR = os.getenv('CMAKE_CURRENT_BINARY_DIR', CWD) +CMAKE_CURRENT_SOURCE_DIR = os.getenv('CMAKE_CURRENT_SOURCE_DIR', f'{CWD}/../src') + +LICENCE_HEADER = """/* + * Copyright (c) 2017 Linaro Limited + * Copyright (C) 2024 Grenoble INP - ESISAR Limited + * + * SPDX-License-Identifier: Apache-2.0 + */ +""" + +print('CMAKE_CURRENT_BINARY_DIR:', CMAKE_CURRENT_BINARY_DIR) +print('CMAKE_CURRENT_SOURCE_DIR:', CMAKE_CURRENT_SOURCE_DIR) + +# Open the wasm file in binary mode and read the data +with open(f'{CWD}/wasm-apps/http_get.wasm', 'rb') as f: + wasm_bytes = f.read() + +# Convert the bytes to a comma-separated string of hex values +byte_array = ', '.join(f'0x{byte:02x}' for byte in wasm_bytes) + +# Create the output string +output = f'unsigned char __aligned(4) wasm_test_file[] = {{ {byte_array} }};' + +# Write the output string to the .h file +with open(f'{CWD}/src/http_get.h', 'w') as f: + f.write(output) \ No newline at end of file diff --git a/product-mini/platforms/zephyr/simple-http/wasm-apps/http_get.c b/product-mini/platforms/zephyr/simple-http/wasm-apps/http_get.c new file mode 100644 index 0000000000..581a4aef46 --- /dev/null +++ b/product-mini/platforms/zephyr/simple-http/wasm-apps/http_get.c @@ -0,0 +1,91 @@ +/* + * Copyright (c) 2017 Linaro Limited + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#include +#include + +#include +#include +#include +#include +#include + +#ifdef __wasi__ +#include +#endif + +/* HTTP server to connect to */ +#define HTTP_HOST "192.0.2.10" +/* Port to connect to, as string */ +#define HTTP_PORT "8000" +/* HTTP path to request */ +#define HTTP_PATH "/" + +#define SSTRLEN(s) (sizeof(s) - 1) +// #define CHECK(r) { if (r == -1) { printf("Error %d: " #r "\n", errno); +// exit(1); } } + +#define REQUEST "GET " HTTP_PATH " HTTP/1.0\r\nHost: " HTTP_HOST "\r\n\r\n" + +static char response[1024]; + +int +main(int argc, char **argv) +{ + int st, sock; + struct sockaddr_in addr; + int rc = 0; + + printf("[wasm-mod] Preparing HTTP GET request for http://" HTTP_HOST + ":" HTTP_PORT HTTP_PATH "\n"); + + memset(&addr, 0, sizeof(addr)); + addr.sin_family = AF_INET; + addr.sin_port = htons(8000); + addr.sin_addr.s_addr = + htonl(0xC000020A); // hard coded IP address for 192.0.2.10 + + sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); + printf("[wasm-mod] sock = %d\n", sock); + + rc = connect(sock, (struct sockaddr *)&addr, sizeof(addr)); + printf("[wasm-mod] connect rc = %d\n", rc); + + rc = sendto(sock, (const void *)REQUEST, SSTRLEN(REQUEST), 0, + (struct sockaddr *)&addr, sizeof(addr)); + printf("[wasm-mod] send rc = %d\n", rc); + if (rc < 0) { + printf("[wasm-mod] Error %d\n", errno); + return 0; + } + + printf("[wasm-mod] Response:\n\n"); + + while (1) { + socklen_t socklen = sizeof(struct sockaddr_in); + int len = recvfrom(sock, response, sizeof(response) - 1, 0, + (struct sockaddr *)&addr, &socklen); + + if (len < 0) { + printf("[wasm-mod] Error %d\n", errno); + return 0; + } + + response[len] = 0; + printf("%s", response); + + if (len == 0) { + printf("[wasm-mod] len = 0 break\n"); + break; + } + } + + printf("\n"); + + (void)close(sock); + printf("[wasm-mod] Connection closed\n"); + return 0; +} diff --git a/product-mini/platforms/zephyr/simple-http/wasm-apps/inc/location.md b/product-mini/platforms/zephyr/simple-http/wasm-apps/inc/location.md new file mode 100644 index 0000000000..51a3ae6f00 --- /dev/null +++ b/product-mini/platforms/zephyr/simple-http/wasm-apps/inc/location.md @@ -0,0 +1,5 @@ +The lib source code are located there: +* [wasi_socket_ext.h](../../../../../../core/iwasm/libraries/lib-socket/inc/wasi_socket_ext.h) +* [wasi_socket_ext.c](../../../../../../core/iwasm/libraries/lib-socket/src/wasi/wasi_socket_ext.c) + + diff --git a/samples/socket-api/wasm-src/CMakeLists.txt b/samples/socket-api/wasm-src/CMakeLists.txt index 38e8139168..2de2b7688d 100644 --- a/samples/socket-api/wasm-src/CMakeLists.txt +++ b/samples/socket-api/wasm-src/CMakeLists.txt @@ -88,4 +88,4 @@ compile_with_clang(udp_server.c) compile_with_clang(multicast_client.c) compile_with_clang(multicast_server.c) compile_with_clang(timeout_client.c) -compile_with_clang(timeout_server.c) +compile_with_clang(timeout_server.c) \ No newline at end of file From 9cb1cc4af619ea8a0820a408a5b2eb5e468a1a62 Mon Sep 17 00:00:00 2001 From: "liang.he" Date: Wed, 27 Aug 2025 07:15:08 +0800 Subject: [PATCH 047/103] fix: cast file descriptor to size_t for comparison in fd_prestats functions (#4582) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ``` comparison of integer expressions of different signedness: ‘__wasi_fd_t’ {aka ‘int’} and ‘size_t’ {aka ‘long unsigned int’} [-Werror=sign-compare] 288 | if (fd >= pt->size) ``` --- .../libc-wasi/sandboxed-system-primitives/src/posix.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/core/iwasm/libraries/libc-wasi/sandboxed-system-primitives/src/posix.c b/core/iwasm/libraries/libc-wasi/sandboxed-system-primitives/src/posix.c index 684233558b..3d90811bca 100644 --- a/core/iwasm/libraries/libc-wasi/sandboxed-system-primitives/src/posix.c +++ b/core/iwasm/libraries/libc-wasi/sandboxed-system-primitives/src/posix.c @@ -285,7 +285,7 @@ fd_prestats_get_entry(struct fd_prestats *pt, __wasi_fd_t fd, struct fd_prestat **ret) REQUIRES_SHARED(pt->lock) { // Test for file descriptor existence. - if (fd >= pt->size) + if ((size_t)fd >= pt->size) return __WASI_EBADF; struct fd_prestat *prestat = &pt->prestats[fd]; if (prestat->dir == NULL) @@ -301,7 +301,7 @@ static __wasi_errno_t fd_prestats_remove_entry(struct fd_prestats *pt, __wasi_fd_t fd) { // Test for file descriptor existence. - if (fd >= pt->size) + if ((size_t)fd >= pt->size) return __WASI_EBADF; struct fd_prestat *prestat = &pt->prestats[fd]; @@ -356,7 +356,7 @@ fd_table_get_entry(struct fd_table *ft, __wasi_fd_t fd, REQUIRES_SHARED(ft->lock) { // Test for file descriptor existence. - if (fd >= ft->size) { + if ((size_t)fd >= ft->size) { return __WASI_EBADF; } From 1a56951a6a1e142a632ffb38edb2a30985a89138 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 27 Aug 2025 07:16:41 +0800 Subject: [PATCH 048/103] build(deps): Bump requests from 2.32.4 to 2.32.5 in /build-scripts (#4580) Bumps [requests](https://github.com/psf/requests) from 2.32.4 to 2.32.5. - [Release notes](https://github.com/psf/requests/releases) - [Changelog](https://github.com/psf/requests/blob/main/HISTORY.md) - [Commits](https://github.com/psf/requests/compare/v2.32.4...v2.32.5) --- updated-dependencies: - dependency-name: requests dependency-version: 2.32.5 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- build-scripts/requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build-scripts/requirements.txt b/build-scripts/requirements.txt index 480d0c4bbf..1e1bdeb6c6 100644 --- a/build-scripts/requirements.txt +++ b/build-scripts/requirements.txt @@ -1 +1 @@ -requests==2.32.4 \ No newline at end of file +requests==2.32.5 \ No newline at end of file From 42851ca821103a240142ede8bdac224e23b4d0a4 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 27 Aug 2025 07:31:06 +0800 Subject: [PATCH 049/103] build(deps): Bump github/codeql-action from 3.29.10 to 3.29.11 (#4579) Bumps [github/codeql-action](https://github.com/github/codeql-action) from 3.29.10 to 3.29.11. - [Release notes](https://github.com/github/codeql-action/releases) - [Commits](https://github.com/github/codeql-action/compare/v3.29.10...v3.29.11) --- updated-dependencies: - dependency-name: github/codeql-action dependency-version: 3.29.11 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/codeql.yml | 6 +++--- .github/workflows/supply_chain.yml | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml index 453193acae..fcd0117401 100644 --- a/.github/workflows/codeql.yml +++ b/.github/workflows/codeql.yml @@ -53,7 +53,7 @@ jobs: # Initializes the CodeQL tools for scanning. - name: Initialize CodeQL - uses: github/codeql-action/init@v3.29.10 + uses: github/codeql-action/init@v3.29.11 with: languages: ${{ matrix.language }} @@ -70,7 +70,7 @@ jobs: - run: | ./.github/scripts/codeql_buildscript.sh - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@v3.29.10 + uses: github/codeql-action/analyze@v3.29.11 with: category: "/language:${{matrix.language}}" upload: false @@ -99,7 +99,7 @@ jobs: output: ${{ steps.step1.outputs.sarif-output }}/cpp.sarif - name: Upload CodeQL results to code scanning - uses: github/codeql-action/upload-sarif@v3.29.10 + uses: github/codeql-action/upload-sarif@v3.29.11 with: sarif_file: ${{ steps.step1.outputs.sarif-output }} category: "/language:${{matrix.language}}" diff --git a/.github/workflows/supply_chain.yml b/.github/workflows/supply_chain.yml index f05372ee4e..b62249146f 100644 --- a/.github/workflows/supply_chain.yml +++ b/.github/workflows/supply_chain.yml @@ -60,6 +60,6 @@ jobs: # Upload the results to GitHub's code scanning dashboard. - name: "Upload to code-scanning" - uses: github/codeql-action/upload-sarif@e96e340c1e95e91449de06aabfa9525b7b98113f + uses: github/codeql-action/upload-sarif@5b49155c7f37b5ec074ffd26b428e6b64b1bf412 with: sarif_file: results.sarif From 6c3f6fd01761e8f722576f36d70fd298b1be1737 Mon Sep 17 00:00:00 2001 From: Oscar Spencer Date: Wed, 27 Aug 2025 00:57:30 -0500 Subject: [PATCH 050/103] Update note on WAMR_BUILD_LIBC_UVWASI for Windows (#4583) --- doc/build_wamr.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/build_wamr.md b/doc/build_wamr.md index 78e0711ec9..e5487cbf0a 100644 --- a/doc/build_wamr.md +++ b/doc/build_wamr.md @@ -57,7 +57,7 @@ cmake -DWAMR_BUILD_PLATFORM=linux -DWAMR_BUILD_TARGET=ARM - **WAMR_BUILD_LIBC_UVWASI**=1/0 (Experiment), build the [WASI](https://github.com/WebAssembly/WASI) libc subset for WASM app based on [uvwasi](https://github.com/nodejs/uvwasi) implementation, default to disable if not set -> Note: for platform which doesn't support **WAMR_BUILD_LIBC_WASI**, e.g. Windows, developer can try using **WAMR_BUILD_LIBC_UVWASI**. +> Note: WAMR doesn't support a safe sandbox on all platforms. For platforms that do not support **WAMR_BUILD_LIBC_WASI**, e.g. Windows, developers can try using an unsafe uvwasi-based WASI implementation by using **WAMR_BUILD_LIBC_UVWASI**. ### **Enable Multi-Module feature** From 9295d52508bae4918d676f98aa53b4b49abae9be Mon Sep 17 00:00:00 2001 From: Cur1ed Date: Mon, 1 Sep 2025 23:26:17 +0800 Subject: [PATCH 051/103] Correct the build command in the doc --- doc/build_wamr.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/build_wamr.md b/doc/build_wamr.md index e5487cbf0a..6d4e60741a 100644 --- a/doc/build_wamr.md +++ b/doc/build_wamr.md @@ -341,7 +341,7 @@ And the wasm app can calls below APIs to allocate/free memory from/to the shared We can combine the configurations. For example, if we want to disable interpreter, enable AOT and WASI, we can run command: ``` Bash -cmake .. -DWAMR_BUILD_INTERP=0 -DWAMR_BUILD_AOT=1 -DWAMR_BUILD_LIBC_WASI=0 -DWAMR_BUILD_PLATFORM=linux +cmake .. -DWAMR_BUILD_INTERP=0 -DWAMR_BUILD_AOT=1 -DWAMR_BUILD_LIBC_WASI=1 -DWAMR_BUILD_PLATFORM=linux ``` Or if we want to enable interpreter, disable AOT and WASI, and build as X86_32, we can run command: From d55852d99255f57184132bee47200693c0b60f8e Mon Sep 17 00:00:00 2001 From: Zhenwei Jin <109658203+kylo5aby@users.noreply.github.com> Date: Tue, 2 Sep 2025 08:33:06 +0800 Subject: [PATCH 052/103] fix potential overflow in memory size calculation (#4549) Signed-off-by: zhenweijin --- core/iwasm/aot/aot_runtime.c | 6 +++--- core/iwasm/interpreter/wasm_runtime.c | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/core/iwasm/aot/aot_runtime.c b/core/iwasm/aot/aot_runtime.c index 5709a94d41..876e4b1f09 100644 --- a/core/iwasm/aot/aot_runtime.c +++ b/core/iwasm/aot/aot_runtime.c @@ -1026,14 +1026,14 @@ memory_instantiate(AOTModuleInstance *module_inst, AOTModuleInstance *parent, /* If only one page and at most one page, we just append the app heap to the end of linear memory, enlarge the num_bytes_per_page, and don't change the page count */ - heap_offset = num_bytes_per_page; - num_bytes_per_page += heap_size; - if (num_bytes_per_page < heap_size) { + if (heap_size > UINT32_MAX - num_bytes_per_page) { set_error_buf(error_buf, error_buf_size, "failed to insert app heap into linear memory, " "try using `--heap-size=0` option"); return NULL; } + heap_offset = num_bytes_per_page; + num_bytes_per_page += heap_size; } else if (heap_size > 0) { if (init_page_count == max_page_count && init_page_count == 0) { diff --git a/core/iwasm/interpreter/wasm_runtime.c b/core/iwasm/interpreter/wasm_runtime.c index b4aa483d71..55e65142a7 100644 --- a/core/iwasm/interpreter/wasm_runtime.c +++ b/core/iwasm/interpreter/wasm_runtime.c @@ -335,14 +335,14 @@ memory_instantiate(WASMModuleInstance *module_inst, WASMModuleInstance *parent, /* If only one page and at most one page, we just append the app heap to the end of linear memory, enlarge the num_bytes_per_page, and don't change the page count */ - heap_offset = num_bytes_per_page; - num_bytes_per_page += heap_size; - if (num_bytes_per_page < heap_size) { + if (heap_size > UINT32_MAX - num_bytes_per_page) { set_error_buf(error_buf, error_buf_size, "failed to insert app heap into linear memory, " "try using `--heap-size=0` option"); return NULL; } + heap_offset = num_bytes_per_page; + num_bytes_per_page += heap_size; } else if (heap_size > 0) { if (init_page_count == max_page_count && init_page_count == 0) { From 6253bd1b5269565142e2a5a4f33777847059f9ee Mon Sep 17 00:00:00 2001 From: YAMAMOTO Takashi Date: Thu, 4 Sep 2025 11:58:09 +0900 Subject: [PATCH 053/103] Reduce the code duplication a bit (#4596) This is a preparation for https://github.com/bytecodealliance/wasm-micro-runtime/issues/4364 No functional changes are intended. --- core/iwasm/aot/aot_loader.c | 10 +--------- core/iwasm/common/wasm_runtime_common.c | 15 +++++++++++++++ core/iwasm/common/wasm_runtime_common.h | 3 +++ core/iwasm/interpreter/wasm_loader.c | 10 +--------- core/iwasm/interpreter/wasm_mini_loader.c | 10 +--------- 5 files changed, 21 insertions(+), 27 deletions(-) diff --git a/core/iwasm/aot/aot_loader.c b/core/iwasm/aot/aot_loader.c index a87aee0a72..2f7e6c9f25 100644 --- a/core/iwasm/aot/aot_loader.c +++ b/core/iwasm/aot/aot_loader.c @@ -4226,15 +4226,7 @@ create_module(char *name, char *error_buf, uint32 error_buf_size) #endif #if WASM_ENABLE_LIBC_WASI != 0 -#if WASM_ENABLE_UVWASI == 0 - module->wasi_args.stdio[0] = os_invalid_raw_handle(); - module->wasi_args.stdio[1] = os_invalid_raw_handle(); - module->wasi_args.stdio[2] = os_invalid_raw_handle(); -#else - module->wasi_args.stdio[0] = os_get_invalid_handle(); - module->wasi_args.stdio[1] = os_get_invalid_handle(); - module->wasi_args.stdio[2] = os_get_invalid_handle(); -#endif /* WASM_ENABLE_UVWASI == 0 */ + wasi_args_set_defaults(&module->wasi_args); #endif /* WASM_ENABLE_LIBC_WASI != 0 */ return module; diff --git a/core/iwasm/common/wasm_runtime_common.c b/core/iwasm/common/wasm_runtime_common.c index 943b46fc4c..26283b3f8b 100644 --- a/core/iwasm/common/wasm_runtime_common.c +++ b/core/iwasm/common/wasm_runtime_common.c @@ -3438,6 +3438,21 @@ wasm_runtime_module_dup_data(WASMModuleInstanceCommon *module_inst, #if WASM_ENABLE_LIBC_WASI != 0 +void +wasi_args_set_defaults(WASIArguments *args) +{ + memset(args, 0, sizeof(*args)); +#if WASM_ENABLE_UVWASI == 0 + args->stdio[0] = os_invalid_raw_handle(); + args->stdio[1] = os_invalid_raw_handle(); + args->stdio[2] = os_invalid_raw_handle(); +#else + args->stdio[0] = os_get_invalid_handle(); + args->stdio[1] = os_get_invalid_handle(); + args->stdio[2] = os_get_invalid_handle(); +#endif /* WASM_ENABLE_UVWASI == 0 */ +} + static WASIArguments * get_wasi_args_from_module(wasm_module_t module) { diff --git a/core/iwasm/common/wasm_runtime_common.h b/core/iwasm/common/wasm_runtime_common.h index 324620bef3..a315c75da6 100644 --- a/core/iwasm/common/wasm_runtime_common.h +++ b/core/iwasm/common/wasm_runtime_common.h @@ -1118,6 +1118,9 @@ wasm_runtime_lookup_wasi_start_function(WASMModuleInstanceCommon *module_inst); WASM_RUNTIME_API_EXTERN uint32_t wasm_runtime_get_wasi_exit_code(WASMModuleInstanceCommon *module_inst); +void +wasi_args_set_defaults(WASIArguments *args); + bool wasm_runtime_init_wasi(WASMModuleInstanceCommon *module_inst, const char *dir_list[], uint32 dir_count, diff --git a/core/iwasm/interpreter/wasm_loader.c b/core/iwasm/interpreter/wasm_loader.c index e89e91e0d2..55128795ce 100644 --- a/core/iwasm/interpreter/wasm_loader.c +++ b/core/iwasm/interpreter/wasm_loader.c @@ -6712,15 +6712,7 @@ create_module(char *name, char *error_buf, uint32 error_buf_size) #endif #if WASM_ENABLE_LIBC_WASI != 0 -#if WASM_ENABLE_UVWASI == 0 - module->wasi_args.stdio[0] = os_invalid_raw_handle(); - module->wasi_args.stdio[1] = os_invalid_raw_handle(); - module->wasi_args.stdio[2] = os_invalid_raw_handle(); -#else - module->wasi_args.stdio[0] = os_get_invalid_handle(); - module->wasi_args.stdio[1] = os_get_invalid_handle(); - module->wasi_args.stdio[2] = os_get_invalid_handle(); -#endif /* WASM_ENABLE_UVWASI == 0 */ + wasi_args_set_defaults(&module->wasi_args); #endif /* WASM_ENABLE_LIBC_WASI != 0 */ (void)ret; diff --git a/core/iwasm/interpreter/wasm_mini_loader.c b/core/iwasm/interpreter/wasm_mini_loader.c index 771538a142..6fff2fa17f 100644 --- a/core/iwasm/interpreter/wasm_mini_loader.c +++ b/core/iwasm/interpreter/wasm_mini_loader.c @@ -3316,15 +3316,7 @@ create_module(char *name, char *error_buf, uint32 error_buf_size) #endif #if WASM_ENABLE_LIBC_WASI != 0 -#if WASM_ENABLE_LIBC_UVWASI == 0 - module->wasi_args.stdio[0] = os_invalid_raw_handle(); - module->wasi_args.stdio[1] = os_invalid_raw_handle(); - module->wasi_args.stdio[2] = os_invalid_raw_handle(); -#else - module->wasi_args.stdio[0] = os_get_invalid_handle(); - module->wasi_args.stdio[1] = os_get_invalid_handle(); - module->wasi_args.stdio[2] = os_get_invalid_handle(); -#endif /* WASM_ENABLE_UVWASI == 0 */ + wasi_args_set_defaults(&module->wasi_args); #endif /* WASM_ENABLE_LIBC_WASI != 0 */ (void)ret; From ce3358f58e3c525b35428cc6f653d8c111089845 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 9 Sep 2025 13:23:20 +0800 Subject: [PATCH 054/103] build(deps): Bump actions/setup-node from 4 to 5 (#4608) Bumps [actions/setup-node](https://github.com/actions/setup-node) from 4 to 5. - [Release notes](https://github.com/actions/setup-node/releases) - [Commits](https://github.com/actions/setup-node/compare/v4...v5) --- updated-dependencies: - dependency-name: actions/setup-node dependency-version: '5' dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/build_wamr_vscode_ext.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build_wamr_vscode_ext.yml b/.github/workflows/build_wamr_vscode_ext.yml index 5b72612baf..02a6ac7a32 100644 --- a/.github/workflows/build_wamr_vscode_ext.yml +++ b/.github/workflows/build_wamr_vscode_ext.yml @@ -27,7 +27,7 @@ jobs: - uses: actions/checkout@v5 - name: Use Node.js 18.x - uses: actions/setup-node@v4 + uses: actions/setup-node@v5 with: node-version: 18.x From 9f8a6ab2d617cf6c3cb19d47b01475a929752136 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 9 Sep 2025 13:23:34 +0800 Subject: [PATCH 055/103] build(deps): Bump github/codeql-action from 3.29.11 to 3.30.1 (#4607) Bumps [github/codeql-action](https://github.com/github/codeql-action) from 3.29.11 to 3.30.1. - [Release notes](https://github.com/github/codeql-action/releases) - [Commits](https://github.com/github/codeql-action/compare/v3.29.11...v3.30.1) --- updated-dependencies: - dependency-name: github/codeql-action dependency-version: 3.30.1 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/codeql.yml | 6 +++--- .github/workflows/supply_chain.yml | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml index fcd0117401..a2548f1d90 100644 --- a/.github/workflows/codeql.yml +++ b/.github/workflows/codeql.yml @@ -53,7 +53,7 @@ jobs: # Initializes the CodeQL tools for scanning. - name: Initialize CodeQL - uses: github/codeql-action/init@v3.29.11 + uses: github/codeql-action/init@v3.30.1 with: languages: ${{ matrix.language }} @@ -70,7 +70,7 @@ jobs: - run: | ./.github/scripts/codeql_buildscript.sh - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@v3.29.11 + uses: github/codeql-action/analyze@v3.30.1 with: category: "/language:${{matrix.language}}" upload: false @@ -99,7 +99,7 @@ jobs: output: ${{ steps.step1.outputs.sarif-output }}/cpp.sarif - name: Upload CodeQL results to code scanning - uses: github/codeql-action/upload-sarif@v3.29.11 + uses: github/codeql-action/upload-sarif@v3.30.1 with: sarif_file: ${{ steps.step1.outputs.sarif-output }} category: "/language:${{matrix.language}}" diff --git a/.github/workflows/supply_chain.yml b/.github/workflows/supply_chain.yml index b62249146f..73fb683ee0 100644 --- a/.github/workflows/supply_chain.yml +++ b/.github/workflows/supply_chain.yml @@ -60,6 +60,6 @@ jobs: # Upload the results to GitHub's code scanning dashboard. - name: "Upload to code-scanning" - uses: github/codeql-action/upload-sarif@5b49155c7f37b5ec074ffd26b428e6b64b1bf412 + uses: github/codeql-action/upload-sarif@144880b6f0c9977178ab4000985a49023783178f with: sarif_file: results.sarif From 7263a04e4355cd7eed78fc8e2bfcf9f323ef473d Mon Sep 17 00:00:00 2001 From: YAMAMOTO Takashi Date: Thu, 11 Sep 2025 07:31:22 +0900 Subject: [PATCH 056/103] wasi-nn: add a missing address validation for get_output (#4535) cf. https://github.com/bytecodealliance/wasm-micro-runtime/issues/4533 --- core/iwasm/libraries/wasi-nn/src/wasi_nn.c | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/core/iwasm/libraries/wasi-nn/src/wasi_nn.c b/core/iwasm/libraries/wasi-nn/src/wasi_nn.c index 787c3a432d..f857835eb3 100644 --- a/core/iwasm/libraries/wasi-nn/src/wasi_nn.c +++ b/core/iwasm/libraries/wasi-nn/src/wasi_nn.c @@ -795,6 +795,22 @@ wasi_nn_get_output(wasm_exec_env_t exec_env, graph_execution_context ctx, if (success != (res = is_model_initialized(wasi_nn_ctx))) goto fail; +#if WASM_ENABLE_WASI_EPHEMERAL_NN != 0 + if (!wasm_runtime_validate_native_addr(instance, output_tensor, + output_tensor_len)) { + NN_ERR_PRINTF("output_tensor is invalid"); + res = invalid_argument; + goto fail; + } +#else + if (!wasm_runtime_validate_native_addr(instance, output_tensor, + *output_tensor_size)) { + NN_ERR_PRINTF("output_tensor is invalid"); + res = invalid_argument; + goto fail; + } +#endif + if (!wasm_runtime_validate_native_addr(instance, output_tensor_size, (uint64)sizeof(uint32_t))) { NN_ERR_PRINTF("output_tensor_size is invalid"); From 0264686eeae8f14567074b96a040b3ed6880e8bb Mon Sep 17 00:00:00 2001 From: TianlongLiang <111852609+TianlongLiang@users.noreply.github.com> Date: Thu, 11 Sep 2025 06:31:51 +0800 Subject: [PATCH 057/103] fix the source_all override in platform_api_math.cmake for alios, riot, rt-thread, zephyr platform (#4604) --- core/shared/platform/common/math/platform_api_math.cmake | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/shared/platform/common/math/platform_api_math.cmake b/core/shared/platform/common/math/platform_api_math.cmake index 09c74bfc50..6be55262bf 100644 --- a/core/shared/platform/common/math/platform_api_math.cmake +++ b/core/shared/platform/common/math/platform_api_math.cmake @@ -3,6 +3,6 @@ set (PLATFORM_COMMON_MATH_DIR ${CMAKE_CURRENT_LIST_DIR}) -file (GLOB_RECURSE source_all ${PLATFORM_COMMON_MATH_DIR}/*.c) +file (GLOB_RECURSE math_source_all ${PLATFORM_COMMON_MATH_DIR}/*.c) -set (PLATFORM_COMMON_MATH_SOURCE ${source_all} ) +set (PLATFORM_COMMON_MATH_SOURCE ${math_source_all} ) From e2cf59cc266589b8e5660200c02462711f4440b4 Mon Sep 17 00:00:00 2001 From: "liang.he" Date: Thu, 11 Sep 2025 06:32:15 +0800 Subject: [PATCH 058/103] Fix an undefined reference problem (#4612) The issue was previously covered by WAMR_BUILD_LIBC_BUILTIN and WAMR_BUILD_LIBC_WASI. Reproduced by ``` $ cmake -S . -B build -DWAMR_BUILD_SHARE_HEAP=1 -DWAMR_BUILD_LIBC_BUILTIN=0 -DWAMR_BUILD_LIBC_WASI=0 $ cmake --build build ``` --- core/iwasm/common/wasm_native.c | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/core/iwasm/common/wasm_native.c b/core/iwasm/common/wasm_native.c index 060bb2c3d3..42aa55db28 100644 --- a/core/iwasm/common/wasm_native.c +++ b/core/iwasm/common/wasm_native.c @@ -347,7 +347,8 @@ static dtor_t g_context_dtors[WASM_MAX_INSTANCE_CONTEXTS]; static void dtor_noop(WASMModuleInstanceCommon *inst, void *ctx) -{} +{ +} void * wasm_native_create_context_key(void (*dtor)(WASMModuleInstanceCommon *inst, @@ -485,7 +486,8 @@ wasm_native_init() || WASM_ENABLE_LIB_RATS != 0 || WASM_ENABLE_WASI_NN != 0 \ || WASM_ENABLE_APP_FRAMEWORK != 0 || WASM_ENABLE_LIBC_WASI != 0 \ || WASM_ENABLE_LIB_PTHREAD != 0 || WASM_ENABLE_LIB_WASI_THREADS != 0 \ - || WASM_ENABLE_WASI_NN != 0 || WASM_ENABLE_WASI_EPHEMERAL_NN != 0 + || WASM_ENABLE_WASI_NN != 0 || WASM_ENABLE_WASI_EPHEMERAL_NN != 0 \ + || WASM_ENABLE_SHARED_HEAP != 0 NativeSymbol *native_symbols; uint32 n_native_symbols; #endif @@ -602,7 +604,8 @@ wasm_native_init() || WASM_ENABLE_LIB_RATS != 0 || WASM_ENABLE_WASI_NN != 0 \ || WASM_ENABLE_APP_FRAMEWORK != 0 || WASM_ENABLE_LIBC_WASI != 0 \ || WASM_ENABLE_LIB_PTHREAD != 0 || WASM_ENABLE_LIB_WASI_THREADS != 0 \ - || WASM_ENABLE_WASI_NN != 0 || WASM_ENABLE_WASI_EPHEMERAL_NN != 0 + || WASM_ENABLE_WASI_NN != 0 || WASM_ENABLE_WASI_EPHEMERAL_NN != 0 \ + || WASM_ENABLE_SHARED_HEAP != 0 goto fail; #else return false; @@ -616,7 +619,8 @@ wasm_native_init() || WASM_ENABLE_LIB_RATS != 0 || WASM_ENABLE_WASI_NN != 0 \ || WASM_ENABLE_APP_FRAMEWORK != 0 || WASM_ENABLE_LIBC_WASI != 0 \ || WASM_ENABLE_LIB_PTHREAD != 0 || WASM_ENABLE_LIB_WASI_THREADS != 0 \ - || WASM_ENABLE_WASI_NN != 0 || WASM_ENABLE_WASI_EPHEMERAL_NN != 0 + || WASM_ENABLE_WASI_NN != 0 || WASM_ENABLE_WASI_EPHEMERAL_NN != 0 \ + || WASM_ENABLE_SHARED_HEAP != 0 fail: wasm_native_destroy(); return false; From b71a6bf58f0fbc3f9c2a930bb693b1943fa862e2 Mon Sep 17 00:00:00 2001 From: "liang.he" Date: Thu, 11 Sep 2025 06:33:04 +0800 Subject: [PATCH 059/103] Turn warnings into errors in CI (#4397) - Apply global warnings in warnings.cmake instead of maintaining them in separate files. - Enable errors during CI when building iwasm and wamrc. - Since GCC and Clang are the default compilers on Ubuntu and macOS, enabling `-Werror` on both platforms can be treated as checking with different compilers. --- .../compilation_on_android_ubuntu.yml | 6 ++-- .github/workflows/compilation_on_macos.yml | 4 +-- CMakeLists.txt | 2 -- build-scripts/config_common.cmake | 2 ++ build-scripts/runtime_lib.cmake | 3 +- build-scripts/warnings.cmake | 28 +++++++++++++++++++ product-mini/platforms/android/CMakeLists.txt | 3 -- .../platforms/cosmopolitan/CMakeLists.txt | 5 ---- product-mini/platforms/ios/CMakeLists.txt | 3 -- product-mini/platforms/linux/CMakeLists.txt | 5 ---- product-mini/platforms/windows/CMakeLists.txt | 3 -- samples/basic/CMakeLists.txt | 1 - samples/debug-tools/CMakeLists.txt | 1 - samples/file/src/CMakeLists.txt | 1 - samples/inst-context-threads/CMakeLists.txt | 1 - samples/inst-context/CMakeLists.txt | 1 - samples/multi-module/CMakeLists.txt | 1 - samples/multi-thread/CMakeLists.txt | 1 - samples/native-lib/CMakeLists.txt | 1 - samples/native-stack-overflow/CMakeLists.txt | 1 - samples/ref-types/CMakeLists.txt | 1 - samples/shared-heap/CMakeLists.txt | 1 - samples/shared-module/CMakeLists.txt | 1 - samples/socket-api/CMakeLists.txt | 1 - samples/spawn-thread/CMakeLists.txt | 1 - samples/terminate/CMakeLists.txt | 1 - samples/wasi-threads/CMakeLists.txt | 1 - samples/wasm-c-api-imports/CMakeLists.txt | 1 - samples/wasm-c-api/CMakeLists.txt | 1 - test-tools/aot-analyzer/CMakeLists.txt | 5 ---- .../test-invoke-native/CMakeLists.txt | 5 ---- .../test-module-malloc/CMakeLists.txt | 1 - .../test-running-modes/c-embed/CMakeLists.txt | 2 -- tests/unit/wasm-c-api/CMakeLists.txt | 1 - wamr-compiler/CMakeLists.txt | 6 ++-- 35 files changed, 39 insertions(+), 63 deletions(-) create mode 100644 build-scripts/warnings.cmake diff --git a/.github/workflows/compilation_on_android_ubuntu.yml b/.github/workflows/compilation_on_android_ubuntu.yml index 032560db10..8a4a6aefef 100644 --- a/.github/workflows/compilation_on_android_ubuntu.yml +++ b/.github/workflows/compilation_on_android_ubuntu.yml @@ -124,7 +124,7 @@ jobs: - name: Build wamrc run: | mkdir build && cd build - cmake .. + cmake .. -DCMAKE_C_FLAGS="-Werror" cmake --build . --config Release --parallel 4 working-directory: wamr-compiler @@ -293,7 +293,7 @@ jobs: if: matrix.platform == 'linux' run: | mkdir build && cd build - cmake .. ${{ matrix.make_options_run_mode }} ${{ matrix.make_options_feature }} + cmake .. -DCMAKE_C_FLAGS="-Werror" ${{ matrix.make_options_run_mode }} ${{ matrix.make_options_feature }} cmake --build . --config Release --parallel 4 working-directory: product-mini/platforms/${{ matrix.platform }} @@ -301,7 +301,7 @@ jobs: if: matrix.platform == 'android' run: | mkdir build && cd build - cmake .. ${{ matrix.make_options_run_mode }} ${{ matrix.make_options_feature }} \ + cmake .. -DCMAKE_C_FLAGS="-Werror" ${{ matrix.make_options_run_mode }} ${{ matrix.make_options_feature }} \ -DWAMR_BUILD_TARGET=X86_64 cmake --build . --config Release --parallel 4 working-directory: product-mini/platforms/${{ matrix.platform }} diff --git a/.github/workflows/compilation_on_macos.yml b/.github/workflows/compilation_on_macos.yml index 872da9316c..8387ee0c75 100644 --- a/.github/workflows/compilation_on_macos.yml +++ b/.github/workflows/compilation_on_macos.yml @@ -107,7 +107,7 @@ jobs: - name: Build wamrc run: | mkdir build && cd build - cmake .. + cmake .. -DCMAKE_C_FLAGS="-Werror" cmake --build . --config Release --parallel 4 working-directory: wamr-compiler @@ -213,7 +213,7 @@ jobs: - name: Build iwasm run: | mkdir build && cd build - cmake .. ${{ matrix.make_options_run_mode }} ${{ matrix.make_options_feature }} + cmake .. -DCMAKE_C_FLAGS="-Werror" ${{ matrix.make_options_run_mode }} ${{ matrix.make_options_feature }} cmake --build . --config Release --parallel 4 working-directory: product-mini/platforms/${{ matrix.platform }} diff --git a/CMakeLists.txt b/CMakeLists.txt index 4b28fa89c1..c33b211e61 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -126,11 +126,9 @@ include (${WAMR_ROOT_DIR}/build-scripts/runtime_lib.cmake) if (NOT WIN32) set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -Wextra -Wformat -Wformat-security \ -ffunction-sections -fdata-sections \ - -Wno-unused-parameter -Wno-pedantic \ -fvisibility=hidden") # Remove the extra spaces for better make log string (REGEX REPLACE " *" " " CMAKE_C_FLAGS ${CMAKE_C_FLAGS}) - set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wextra -Wformat -Wformat-security -Wno-unused") endif() if (WAMR_BUILD_TARGET MATCHES "X86_.*" OR WAMR_BUILD_TARGET STREQUAL "AMD_64") diff --git a/build-scripts/config_common.cmake b/build-scripts/config_common.cmake index d21ca9c3a9..bd9e424092 100644 --- a/build-scripts/config_common.cmake +++ b/build-scripts/config_common.cmake @@ -81,6 +81,8 @@ elseif (WAMR_BUILD_TARGET MATCHES "THUMB.*") set (CMAKE_ASM_FLAGS "${CMAKE_ASM_FLAGS} -Wa,-mthumb") endif () +include (${CMAKE_CURRENT_LIST_DIR}/warnings.cmake) + if (NOT WAMR_BUILD_INTERP EQUAL 1) if (NOT WAMR_BUILD_AOT EQUAL 1) message (FATAL_ERROR "-- WAMR Interpreter and AOT must be enabled at least one") diff --git a/build-scripts/runtime_lib.cmake b/build-scripts/runtime_lib.cmake index f7639f6a61..bac81c4f2d 100644 --- a/build-scripts/runtime_lib.cmake +++ b/build-scripts/runtime_lib.cmake @@ -162,8 +162,7 @@ endif () ####################### Common sources ####################### if (NOT MSVC) - set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -std=gnu99 -ffunction-sections -fdata-sections \ - -Wall -Wno-unused-parameter -Wno-pedantic") + set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -std=gnu99 -ffunction-sections -fdata-sections") endif () # include the build config template file diff --git a/build-scripts/warnings.cmake b/build-scripts/warnings.cmake new file mode 100644 index 0000000000..14abf74a35 --- /dev/null +++ b/build-scripts/warnings.cmake @@ -0,0 +1,28 @@ +# Copyright (C) 2019 Intel Corporation. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception + +# global additional warnings. +if (MSVC) + # warning level 4 + add_compile_options(/W4) +else () + # refer to https://gcc.gnu.org/onlinedocs/gcc/Warning-Options.html + add_compile_options( + -Wall -Wextra -Wformat -Wformat-security + $<$:-Wshadow> + ) + # -pedantic causes warnings like "ISO C forbids initialization between function pointer and ‘void *’" which + # is widely used in the codebase. + # + # -fpermissive causes warnings like "-fpermissive is valid for C++/ObjC++ but not for C" + # + add_compile_options ( + $<$:-Wincompatible-pointer-types> + $<$:-Wimplicit-function-declaration> + ) + # waivers + add_compile_options ( + -Wno-unused + -Wno-unused-parameter + ) +endif () diff --git a/product-mini/platforms/android/CMakeLists.txt b/product-mini/platforms/android/CMakeLists.txt index 19bc1b11e7..9cc8cc6b94 100644 --- a/product-mini/platforms/android/CMakeLists.txt +++ b/product-mini/platforms/android/CMakeLists.txt @@ -111,9 +111,6 @@ set_version_info (vmlib) set (CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,--gc-sections -pie -fPIE") -set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -Wextra -Wformat -Wformat-security") -# set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wconversion -Wsign-conversion") - if (WAMR_BUILD_TARGET MATCHES "X86_.*" OR WAMR_BUILD_TARGET STREQUAL "AMD_64") if (NOT (CMAKE_C_COMPILER MATCHES ".*clang.*" OR CMAKE_C_COMPILER_ID MATCHES ".*Clang")) set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -mindirect-branch-register") diff --git a/product-mini/platforms/cosmopolitan/CMakeLists.txt b/product-mini/platforms/cosmopolitan/CMakeLists.txt index 7676ea6fb8..37641497aa 100644 --- a/product-mini/platforms/cosmopolitan/CMakeLists.txt +++ b/product-mini/platforms/cosmopolitan/CMakeLists.txt @@ -136,11 +136,6 @@ set_version_info (vmlib) set (CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,--gc-sections") -set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -Wextra -Wformat -Wformat-security -Wshadow") -# set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wconversion -Wsign-conversion") - -set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wextra -Wformat -Wformat-security -Wno-unused") - if (WAMR_BUILD_TARGET MATCHES "X86_.*" OR WAMR_BUILD_TARGET STREQUAL "AMD_64") if (NOT (CMAKE_C_COMPILER MATCHES ".*clang.*" OR CMAKE_C_COMPILER_ID MATCHES ".*Clang")) set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -mindirect-branch-register") diff --git a/product-mini/platforms/ios/CMakeLists.txt b/product-mini/platforms/ios/CMakeLists.txt index ca54aa1556..bc8542ffe9 100644 --- a/product-mini/platforms/ios/CMakeLists.txt +++ b/product-mini/platforms/ios/CMakeLists.txt @@ -113,9 +113,6 @@ include (${WAMR_ROOT_DIR}/build-scripts/runtime_lib.cmake) set (CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,--gc-sections -pie -fPIE") -set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -Wextra -Wformat -Wformat-security") -# set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wconversion -Wsign-conversion") - if (WAMR_BUILD_TARGET MATCHES "X86_.*" OR WAMR_BUILD_TARGET STREQUAL "AMD_64") if (NOT (CMAKE_C_COMPILER MATCHES ".*clang.*" OR CMAKE_C_COMPILER_ID MATCHES ".*Clang")) set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -mindirect-branch-register") diff --git a/product-mini/platforms/linux/CMakeLists.txt b/product-mini/platforms/linux/CMakeLists.txt index cef8329d77..e369197dc9 100644 --- a/product-mini/platforms/linux/CMakeLists.txt +++ b/product-mini/platforms/linux/CMakeLists.txt @@ -139,11 +139,6 @@ check_pie_supported() set (CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,--gc-sections") -set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -Wextra -Wformat -Wformat-security -Wshadow") -# set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wconversion -Wsign-conversion") - -set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wextra -Wformat -Wformat-security -Wno-unused") - if (WAMR_BUILD_TARGET MATCHES "X86_.*" OR WAMR_BUILD_TARGET STREQUAL "AMD_64") if (NOT (CMAKE_C_COMPILER MATCHES ".*clang.*" OR CMAKE_C_COMPILER_ID MATCHES ".*Clang")) set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -mindirect-branch-register") diff --git a/product-mini/platforms/windows/CMakeLists.txt b/product-mini/platforms/windows/CMakeLists.txt index 2a4017d686..39b373deb0 100644 --- a/product-mini/platforms/windows/CMakeLists.txt +++ b/product-mini/platforms/windows/CMakeLists.txt @@ -114,9 +114,6 @@ if (NOT MINGW) set (CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} /SAFESEH:NO") endif () -# set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -Wextra -Wformat -Wformat-security") -# set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wconversion -Wsign-conversion") - if (WAMR_BUILD_TARGET MATCHES "X86_.*" OR WAMR_BUILD_TARGET STREQUAL "AMD_64") if (NOT (CMAKE_C_COMPILER MATCHES ".*clang.*" OR CMAKE_C_COMPILER_ID MATCHES ".*Clang" OR MSVC)) set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -mindirect-branch-register") diff --git a/samples/basic/CMakeLists.txt b/samples/basic/CMakeLists.txt index 3be19df8c1..e7417e634c 100644 --- a/samples/basic/CMakeLists.txt +++ b/samples/basic/CMakeLists.txt @@ -60,7 +60,6 @@ if (NOT MSVC) if (NOT (CMAKE_C_COMPILER MATCHES ".*clang.*" OR CMAKE_C_COMPILER_ID MATCHES ".*Clang")) set (CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,--gc-sections") endif () - set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -Wextra -Wformat -Wformat-security") if (WAMR_BUILD_TARGET MATCHES "X86_.*" OR WAMR_BUILD_TARGET STREQUAL "AMD_64") if (NOT (CMAKE_C_COMPILER MATCHES ".*clang.*" OR CMAKE_C_COMPILER_ID MATCHES ".*Clang")) set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -mindirect-branch-register") diff --git a/samples/debug-tools/CMakeLists.txt b/samples/debug-tools/CMakeLists.txt index 512507d6ee..32d219faa5 100644 --- a/samples/debug-tools/CMakeLists.txt +++ b/samples/debug-tools/CMakeLists.txt @@ -60,7 +60,6 @@ set(WAMR_BUILD_DUMP_CALL_STACK 1) # Otherwise stack trace is not printed (addr2l if (NOT (CMAKE_C_COMPILER MATCHES ".*clang.*" OR CMAKE_C_COMPILER_ID MATCHES ".*Clang")) set (CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,--gc-sections") endif () -set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -Wextra -Wformat -Wformat-security") # build out vmlib set(WAMR_ROOT_DIR ${CMAKE_CURRENT_LIST_DIR}/../..) diff --git a/samples/file/src/CMakeLists.txt b/samples/file/src/CMakeLists.txt index 19775a08ea..d54e93c082 100644 --- a/samples/file/src/CMakeLists.txt +++ b/samples/file/src/CMakeLists.txt @@ -61,7 +61,6 @@ if (NOT MSVC) if (NOT (CMAKE_C_COMPILER MATCHES ".*clang.*" OR CMAKE_C_COMPILER_ID MATCHES ".*Clang")) set (CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,--gc-sections") endif () - set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -Wextra -Wformat -Wformat-security") if (WAMR_BUILD_TARGET MATCHES "X86_.*" OR WAMR_BUILD_TARGET STREQUAL "AMD_64") if (NOT (CMAKE_C_COMPILER MATCHES ".*clang.*" OR CMAKE_C_COMPILER_ID MATCHES ".*Clang")) set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -mindirect-branch-register") diff --git a/samples/inst-context-threads/CMakeLists.txt b/samples/inst-context-threads/CMakeLists.txt index 5ce8696d8d..b32d3053bf 100644 --- a/samples/inst-context-threads/CMakeLists.txt +++ b/samples/inst-context-threads/CMakeLists.txt @@ -61,7 +61,6 @@ if (NOT MSVC) if (NOT (CMAKE_C_COMPILER MATCHES ".*clang.*" OR CMAKE_C_COMPILER_ID MATCHES ".*Clang")) set (CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,--gc-sections") endif () - set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -Wextra -Wformat -Wformat-security") if (WAMR_BUILD_TARGET MATCHES "X86_.*" OR WAMR_BUILD_TARGET STREQUAL "AMD_64") if (NOT (CMAKE_C_COMPILER MATCHES ".*clang.*" OR CMAKE_C_COMPILER_ID MATCHES ".*Clang")) set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -mindirect-branch-register") diff --git a/samples/inst-context/CMakeLists.txt b/samples/inst-context/CMakeLists.txt index af387ca267..b9866a5ebd 100644 --- a/samples/inst-context/CMakeLists.txt +++ b/samples/inst-context/CMakeLists.txt @@ -60,7 +60,6 @@ if (NOT MSVC) if (NOT (CMAKE_C_COMPILER MATCHES ".*clang.*" OR CMAKE_C_COMPILER_ID MATCHES ".*Clang")) set (CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,--gc-sections") endif () - set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -Wextra -Wformat -Wformat-security") if (WAMR_BUILD_TARGET MATCHES "X86_.*" OR WAMR_BUILD_TARGET STREQUAL "AMD_64") if (NOT (CMAKE_C_COMPILER MATCHES ".*clang.*" OR CMAKE_C_COMPILER_ID MATCHES ".*Clang")) set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -mindirect-branch-register") diff --git a/samples/multi-module/CMakeLists.txt b/samples/multi-module/CMakeLists.txt index 3c2e8bd207..7d0499e4cc 100644 --- a/samples/multi-module/CMakeLists.txt +++ b/samples/multi-module/CMakeLists.txt @@ -65,7 +65,6 @@ set(WAMR_BUILD_MULTI_MODULE 1) if (NOT (CMAKE_C_COMPILER MATCHES ".*clang.*" OR CMAKE_C_COMPILER_ID MATCHES ".*Clang")) set (CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,--gc-sections") endif () -set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -Wextra -Wformat -Wformat-security") if (WAMR_BUILD_TARGET MATCHES "X86_.*" OR WAMR_BUILD_TARGET STREQUAL "AMD_64") if (NOT (CMAKE_C_COMPILER MATCHES ".*clang.*" OR CMAKE_C_COMPILER_ID MATCHES ".*Clang")) set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -mindirect-branch-register") diff --git a/samples/multi-thread/CMakeLists.txt b/samples/multi-thread/CMakeLists.txt index 67819eca2d..71a1cc5b44 100644 --- a/samples/multi-thread/CMakeLists.txt +++ b/samples/multi-thread/CMakeLists.txt @@ -54,7 +54,6 @@ set(WAMR_BUILD_LIB_PTHREAD_SEMAPHORE 1) if (NOT (CMAKE_C_COMPILER MATCHES ".*clang.*" OR CMAKE_C_COMPILER_ID MATCHES ".*Clang")) set (CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,--gc-sections") endif () -set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -Wextra -Wformat -Wformat-security") # build out vmlib set(WAMR_ROOT_DIR ${CMAKE_CURRENT_LIST_DIR}/../..) diff --git a/samples/native-lib/CMakeLists.txt b/samples/native-lib/CMakeLists.txt index d8201bae4f..497727cb09 100644 --- a/samples/native-lib/CMakeLists.txt +++ b/samples/native-lib/CMakeLists.txt @@ -52,7 +52,6 @@ set (WAMR_BUILD_FAST_INTERP 1) if (NOT (CMAKE_C_COMPILER MATCHES ".*clang.*" OR CMAKE_C_COMPILER_ID MATCHES ".*Clang")) set (CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,--gc-sections") endif () -set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -Wextra -Wformat -Wformat-security") # build out libiwasm set (WAMR_ROOT_DIR ${CMAKE_CURRENT_LIST_DIR}/../..) diff --git a/samples/native-stack-overflow/CMakeLists.txt b/samples/native-stack-overflow/CMakeLists.txt index efe5b5dc05..a2079bf4f5 100644 --- a/samples/native-stack-overflow/CMakeLists.txt +++ b/samples/native-stack-overflow/CMakeLists.txt @@ -60,7 +60,6 @@ if (NOT MSVC) if (NOT (CMAKE_C_COMPILER MATCHES ".*clang.*" OR CMAKE_C_COMPILER_ID MATCHES ".*Clang")) set (CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,--gc-sections") endif () - set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -Wextra -Wformat -Wformat-security") if (WAMR_BUILD_TARGET MATCHES "X86_.*" OR WAMR_BUILD_TARGET STREQUAL "AMD_64") if (NOT (CMAKE_C_COMPILER MATCHES ".*clang.*" OR CMAKE_C_COMPILER_ID MATCHES ".*Clang")) set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -mindirect-branch-register") diff --git a/samples/ref-types/CMakeLists.txt b/samples/ref-types/CMakeLists.txt index fd18e63780..0d0852a2ee 100644 --- a/samples/ref-types/CMakeLists.txt +++ b/samples/ref-types/CMakeLists.txt @@ -74,7 +74,6 @@ if (NOT MSVC) if (NOT (CMAKE_C_COMPILER MATCHES ".*clang.*" OR CMAKE_C_COMPILER_ID MATCHES ".*Clang")) set (CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,--gc-sections") endif () - set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -Wextra -Wformat -Wformat-security") if (WAMR_BUILD_TARGET MATCHES "X86_.*" OR WAMR_BUILD_TARGET STREQUAL "AMD_64") if (NOT (CMAKE_C_COMPILER MATCHES ".*clang.*" OR CMAKE_C_COMPILER_ID MATCHES ".*Clang")) set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -mindirect-branch-register") diff --git a/samples/shared-heap/CMakeLists.txt b/samples/shared-heap/CMakeLists.txt index 03906f7c32..94690a4ed5 100644 --- a/samples/shared-heap/CMakeLists.txt +++ b/samples/shared-heap/CMakeLists.txt @@ -61,7 +61,6 @@ if (NOT MSVC) if (NOT (CMAKE_C_COMPILER MATCHES ".*clang.*" OR CMAKE_C_COMPILER_ID MATCHES ".*Clang")) set (CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,--gc-sections") endif () - set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -Wextra -Wformat -Wformat-security") if (WAMR_BUILD_TARGET MATCHES "X86_.*" OR WAMR_BUILD_TARGET STREQUAL "AMD_64") if (NOT (CMAKE_C_COMPILER MATCHES ".*clang.*" OR CMAKE_C_COMPILER_ID MATCHES ".*Clang")) set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -mindirect-branch-register") diff --git a/samples/shared-module/CMakeLists.txt b/samples/shared-module/CMakeLists.txt index c094b071c9..4c9201e51c 100644 --- a/samples/shared-module/CMakeLists.txt +++ b/samples/shared-module/CMakeLists.txt @@ -65,7 +65,6 @@ if (NOT MSVC) if (NOT (CMAKE_C_COMPILER MATCHES ".*clang.*" OR CMAKE_C_COMPILER_ID MATCHES ".*Clang")) set (CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,--gc-sections") endif () - set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -Wextra -Wformat -Wformat-security") if (WAMR_BUILD_TARGET MATCHES "X86_.*" OR WAMR_BUILD_TARGET STREQUAL "AMD_64") if (NOT (CMAKE_C_COMPILER MATCHES ".*clang.*" OR CMAKE_C_COMPILER_ID MATCHES ".*Clang")) set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -mindirect-branch-register") diff --git a/samples/socket-api/CMakeLists.txt b/samples/socket-api/CMakeLists.txt index a68d0caba9..f09da910a9 100644 --- a/samples/socket-api/CMakeLists.txt +++ b/samples/socket-api/CMakeLists.txt @@ -177,7 +177,6 @@ set(WAMR_BUILD_REF_TYPES 1) if (NOT (CMAKE_C_COMPILER MATCHES ".*clang.*" OR CMAKE_C_COMPILER_ID MATCHES ".*Clang")) set (CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,--gc-sections") endif () -set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -Wextra -Wformat -Wformat-security") # build vmlib static lib set(WAMR_ROOT_DIR ${CMAKE_CURRENT_LIST_DIR}/../..) diff --git a/samples/spawn-thread/CMakeLists.txt b/samples/spawn-thread/CMakeLists.txt index 29c4dc429c..6733ca13fe 100644 --- a/samples/spawn-thread/CMakeLists.txt +++ b/samples/spawn-thread/CMakeLists.txt @@ -53,7 +53,6 @@ set(WAMR_BUILD_SHARED_MEMORY 1) if (NOT (CMAKE_C_COMPILER MATCHES ".*clang.*" OR CMAKE_C_COMPILER_ID MATCHES ".*Clang")) set (CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,--gc-sections") endif () -set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -Wextra -Wformat -Wformat-security") # build out vmlib set(WAMR_ROOT_DIR ${CMAKE_CURRENT_LIST_DIR}/../..) diff --git a/samples/terminate/CMakeLists.txt b/samples/terminate/CMakeLists.txt index 246b835ddc..3807332588 100644 --- a/samples/terminate/CMakeLists.txt +++ b/samples/terminate/CMakeLists.txt @@ -68,7 +68,6 @@ if (NOT MSVC) if (NOT (CMAKE_C_COMPILER MATCHES ".*clang.*" OR CMAKE_C_COMPILER_ID MATCHES ".*Clang")) set (CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,--gc-sections") endif () - set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -Wextra -Wformat -Wformat-security") if (WAMR_BUILD_TARGET MATCHES "X86_.*" OR WAMR_BUILD_TARGET STREQUAL "AMD_64") if (NOT (CMAKE_C_COMPILER MATCHES ".*clang.*" OR CMAKE_C_COMPILER_ID MATCHES ".*Clang")) set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -mindirect-branch-register") diff --git a/samples/wasi-threads/CMakeLists.txt b/samples/wasi-threads/CMakeLists.txt index 08cc3a7ffb..d532139665 100644 --- a/samples/wasi-threads/CMakeLists.txt +++ b/samples/wasi-threads/CMakeLists.txt @@ -55,7 +55,6 @@ set(WAMR_BUILD_REF_TYPES 1) if (NOT (CMAKE_C_COMPILER MATCHES ".*clang.*" OR CMAKE_C_COMPILER_ID MATCHES ".*Clang")) set (CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,--gc-sections") endif () -set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -Wextra -Wformat -Wformat-security") # build out vmlib set(WAMR_ROOT_DIR ${CMAKE_CURRENT_LIST_DIR}/../..) diff --git a/samples/wasm-c-api-imports/CMakeLists.txt b/samples/wasm-c-api-imports/CMakeLists.txt index 1325e110cb..bf318a2989 100644 --- a/samples/wasm-c-api-imports/CMakeLists.txt +++ b/samples/wasm-c-api-imports/CMakeLists.txt @@ -75,7 +75,6 @@ set(WAMR_BUILD_SIMD 0) if (NOT (CMAKE_C_COMPILER MATCHES ".*clang.*" OR CMAKE_C_COMPILER_ID MATCHES ".*Clang")) set (CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,--gc-sections") endif () -set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -Wextra -Wformat -Wformat-security") # build out vmlib set(WAMR_ROOT_DIR ${CMAKE_CURRENT_LIST_DIR}/../..) diff --git a/samples/wasm-c-api/CMakeLists.txt b/samples/wasm-c-api/CMakeLists.txt index 06dc92d5ef..c15cd28026 100644 --- a/samples/wasm-c-api/CMakeLists.txt +++ b/samples/wasm-c-api/CMakeLists.txt @@ -86,7 +86,6 @@ if (NOT MSVC) if (NOT (CMAKE_C_COMPILER MATCHES ".*clang.*" OR CMAKE_C_COMPILER_ID MATCHES ".*Clang")) set (CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,--gc-sections") endif () - set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -Wextra -Wformat -Wformat-security") if (WAMR_BUILD_TARGET MATCHES "X86_.*" OR WAMR_BUILD_TARGET STREQUAL "AMD_64") if (NOT (CMAKE_C_COMPILER MATCHES ".*clang.*" OR CMAKE_C_COMPILER_ID MATCHES ".*Clang")) set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -mindirect-branch-register") diff --git a/test-tools/aot-analyzer/CMakeLists.txt b/test-tools/aot-analyzer/CMakeLists.txt index 6f5f588cb8..04d3b636ce 100644 --- a/test-tools/aot-analyzer/CMakeLists.txt +++ b/test-tools/aot-analyzer/CMakeLists.txt @@ -61,11 +61,6 @@ if (NOT DEFINED WAMR_BIG_ENDIAN) set (WAMR_BIG_ENDIAN 0) endif () -set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -Wextra -Wformat -Wformat-security -Wshadow -Wno-unused-parameter") -# set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wconversion -Wsign-conversion") - -set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wextra -Wformat -Wformat-security -Wno-unused") - if (WAMR_BUILD_TARGET MATCHES "X86_.*" OR WAMR_BUILD_TARGET STREQUAL "AMD_64") if (NOT (CMAKE_C_COMPILER MATCHES ".*clang.*" OR CMAKE_C_COMPILER_ID MATCHES ".*Clang")) set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -mindirect-branch-register") diff --git a/tests/standalone/test-invoke-native/CMakeLists.txt b/tests/standalone/test-invoke-native/CMakeLists.txt index 9ba5858425..ce659ae42a 100644 --- a/tests/standalone/test-invoke-native/CMakeLists.txt +++ b/tests/standalone/test-invoke-native/CMakeLists.txt @@ -103,11 +103,6 @@ if (NOT WAMR_BUILD_PLATFORM STREQUAL "darwin") set (CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,--gc-sections -pie -fPIE") endif () -set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -Wextra -Wformat -Wformat-security -Wshadow") -# set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wconversion -Wsign-conversion") - -set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wextra -Wformat -Wformat-security -Wno-unused") - if (WAMR_BUILD_TARGET MATCHES "X86_.*" OR WAMR_BUILD_TARGET STREQUAL "AMD_64") if (NOT (CMAKE_C_COMPILER MATCHES ".*clang.*" OR CMAKE_C_COMPILER_ID MATCHES ".*Clang")) set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -mindirect-branch-register") diff --git a/tests/standalone/test-module-malloc/CMakeLists.txt b/tests/standalone/test-module-malloc/CMakeLists.txt index bdaff68347..c63d6678c0 100644 --- a/tests/standalone/test-module-malloc/CMakeLists.txt +++ b/tests/standalone/test-module-malloc/CMakeLists.txt @@ -58,7 +58,6 @@ set (WAMR_BUILD_LIBC_WASI 1) if (NOT (CMAKE_C_COMPILER MATCHES ".*clang.*" OR CMAKE_C_COMPILER_ID MATCHES ".*Clang")) set (CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,--gc-sections") endif () -set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -Wextra -Wformat -Wformat-security") ################ wasm application ############### add_subdirectory(wasm-app) diff --git a/tests/standalone/test-running-modes/c-embed/CMakeLists.txt b/tests/standalone/test-running-modes/c-embed/CMakeLists.txt index a79ca33b57..9b3cf43fda 100644 --- a/tests/standalone/test-running-modes/c-embed/CMakeLists.txt +++ b/tests/standalone/test-running-modes/c-embed/CMakeLists.txt @@ -43,8 +43,6 @@ set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS}") if (NOT WAMR_BUILD_PLATFORM STREQUAL "darwin") set (CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,--gc-sections -pie -fPIE") endif () -set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -Wextra -Wformat -Wformat-security -Wshadow") -set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wextra -Wformat -Wformat-security -Wno-unused") # build out vmlib include(${WAMR_ROOT_DIR}/build-scripts/runtime_lib.cmake) diff --git a/tests/unit/wasm-c-api/CMakeLists.txt b/tests/unit/wasm-c-api/CMakeLists.txt index 9556c600e1..95cbfbd544 100644 --- a/tests/unit/wasm-c-api/CMakeLists.txt +++ b/tests/unit/wasm-c-api/CMakeLists.txt @@ -25,7 +25,6 @@ set(WAMR_BUILD_FAST_INTERP 0) # compiling and linking flags set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,--gc-sections -pie -fPIE") -set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -Wextra -Wformat -Wformat-security -mindirect-branch-register") # build out vmlib # hard code path here diff --git a/wamr-compiler/CMakeLists.txt b/wamr-compiler/CMakeLists.txt index 00940c62d2..24afdd49dc 100644 --- a/wamr-compiler/CMakeLists.txt +++ b/wamr-compiler/CMakeLists.txt @@ -204,13 +204,13 @@ if (NOT (CMAKE_C_COMPILER MATCHES ".*clang.*" OR CMAKE_C_COMPILER_ID MATCHES ".* endif() if (NOT MSVC) - set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -Wextra -Wformat -Wformat-security \ - -ffunction-sections -fdata-sections \ - -Wno-unused-parameter -Wno-pedantic") + set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -ffunction-sections -fdata-sections") # Remove the extra spaces for better make log string (REGEX REPLACE " *" " " CMAKE_C_FLAGS ${CMAKE_C_FLAGS}) endif() +include (${PROJECT_SOURCE_DIR}/../build-scripts/warnings.cmake) + set (SHARED_DIR ../core/shared) set (IWASM_DIR ../core/iwasm) From 0d3b5caff0f77ecb0a8a3f9a89182bdf3b245c25 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lukas=20D=C3=B6llerer?= Date: Fri, 12 Sep 2025 02:42:48 +0200 Subject: [PATCH 060/103] Add support for metadata.code.branch_hint section (#4460) Add support for metadata.code.branch_hint section --- README.md | 3 +- build-scripts/config_common.cmake | 2 +- core/config.h | 4 + core/iwasm/compilation/aot.c | 7 ++ core/iwasm/compilation/aot.h | 7 ++ core/iwasm/compilation/aot_compiler.c | 4 +- core/iwasm/compilation/aot_emit_control.c | 91 ++++++++++++++++- core/iwasm/compilation/aot_emit_control.h | 2 +- core/iwasm/compilation/aot_llvm.c | 7 ++ core/iwasm/compilation/aot_llvm.h | 3 + core/iwasm/interpreter/wasm.h | 25 +++++ core/iwasm/interpreter/wasm_loader.c | 118 +++++++++++++++++++++- doc/stability_wasm_proposals.md | 22 ++-- wamr-compiler/CMakeLists.txt | 1 + 14 files changed, 272 insertions(+), 24 deletions(-) diff --git a/README.md b/README.md index 859ee3540f..9d79661c8f 100644 --- a/README.md +++ b/README.md @@ -47,7 +47,7 @@ WebAssembly Micro Runtime (WAMR) is a lightweight standalone WebAssembly (Wasm) - [128-bit SIMD](https://github.com/WebAssembly/simd), ref to [samples/workload](samples/workload) - [Reference Types](https://github.com/WebAssembly/reference-types), ref to [document](doc/ref_types.md) and [sample](samples/ref-types) - [Bulk memory operations](https://github.com/WebAssembly/bulk-memory-operations), [Shared memory](https://github.com/WebAssembly/threads/blob/main/proposals/threads/Overview.md#shared-linear-memory), [Memory64](https://github.com/WebAssembly/memory64) -- [Tail-call](https://github.com/WebAssembly/tail-call), [Garbage Collection](https://github.com/WebAssembly/gc), [Exception Handling](https://github.com/WebAssembly/exception-handling) +- [Tail-call](https://github.com/WebAssembly/tail-call), [Garbage Collection](https://github.com/WebAssembly/gc), [Exception Handling](https://github.com/WebAssembly/exception-handling), [Branch Hinting](https://github.com/WebAssembly/branch-hinting) - [Extended Constant Expressions](https://github.com/WebAssembly/extended-const) ### Supported architectures and platforms @@ -117,4 +117,3 @@ Any contributions you make will be under the same license. - [WAMR Blogs](https://bytecodealliance.github.io/wamr.dev/blog/) - [Community news and events](https://bytecodealliance.github.io/wamr.dev/events/) - [WAMR TSC meetings](https://github.com/bytecodealliance/wasm-micro-runtime/wiki/TSC-meeting-notes) - diff --git a/build-scripts/config_common.cmake b/build-scripts/config_common.cmake index bd9e424092..838baab9da 100644 --- a/build-scripts/config_common.cmake +++ b/build-scripts/config_common.cmake @@ -739,6 +739,7 @@ message ( " \"Non-trapping float-to-int Conversions\"\n" " \"Sign-extension Operators\"\n" " \"WebAssembly C and C++ API\"\n" +" \"Branch Hinting\"\n" " Configurable. 0 is OFF. 1 is ON:\n" " \"Bulk Memory Operation\" via WAMR_BUILD_BULK_MEMORY: ${WAMR_BUILD_BULK_MEMORY}\n" " \"Extended Constant Expressions\" via WAMR_BUILD_EXTENDED_CONST_EXPR: ${WAMR_BUILD_EXTENDED_CONST_EXPR}\n" @@ -753,7 +754,6 @@ message ( " \"Threads\" via WAMR_BUILD_SHARED_MEMORY: ${WAMR_BUILD_SHARED_MEMORY}\n" " \"Typed Function References\" via WAMR_BUILD_GC: ${WAMR_BUILD_GC}\n" " Unsupported (>= Phase4):\n" -" \"Branch Hinting\"\n" " \"Custom Annotation Syntax in the Text Format\"\n" " \"Exception Handling\"\n" " \"JS String Builtins\"\n" diff --git a/core/config.h b/core/config.h index 3ee0b2cd92..060bb32594 100644 --- a/core/config.h +++ b/core/config.h @@ -579,6 +579,10 @@ unless used elsewhere */ #define WASM_ENABLE_REF_TYPES 0 #endif +#ifndef WASM_ENABLE_BRANCH_HINTS +#define WASM_ENABLE_BRANCH_HINTS 0 +#endif + #ifndef WASM_ENABLE_GC #define WASM_ENABLE_GC 0 #endif diff --git a/core/iwasm/compilation/aot.c b/core/iwasm/compilation/aot.c index 5e1e554ac1..8e3eeec134 100644 --- a/core/iwasm/compilation/aot.c +++ b/core/iwasm/compilation/aot.c @@ -416,6 +416,9 @@ aot_create_funcs(const WASMModule *module, uint32 pointer_size) aot_func->local_types_wp = func->local_types; aot_func->code = func->code; aot_func->code_size = func->code_size; +#if WASM_ENABLE_BRANCH_HINTS != 0 + aot_func->code_body_begin = func->code_body_begin; +#endif /* Resolve local offsets */ for (j = 0; j < func_type->param_count; j++) { @@ -872,6 +875,10 @@ aot_create_comp_data(WASMModule *module, const char *target_arch, comp_data->name_section_buf_end = module->name_section_buf_end; #endif +#if WASM_ENABLE_BRANCH_HINTS != 0 + comp_data->function_hints = module->function_hints; +#endif + aot_init_aux_data(comp_data, module); comp_data->wasm_module = module; diff --git a/core/iwasm/compilation/aot.h b/core/iwasm/compilation/aot.h index 973d198caa..f1ecccfb37 100644 --- a/core/iwasm/compilation/aot.h +++ b/core/iwasm/compilation/aot.h @@ -217,6 +217,9 @@ typedef struct AOTFunc { /* offset of each local, including function parameters and local variables */ uint16 *local_offsets; +#if WASM_ENABLE_BRANCH_HINTS != 0 + uint8 *code_body_begin; +#endif } AOTFunc; typedef struct AOTCompData { @@ -296,6 +299,10 @@ typedef struct AOTCompData { #if WASM_ENABLE_DEBUG_AOT != 0 dwarf_extractor_handle_t extractor; #endif + +#if WASM_ENABLE_BRANCH_HINTS != 0 + struct WASMCompilationHint **function_hints; +#endif } AOTCompData; typedef struct AOTNativeSymbol { diff --git a/core/iwasm/compilation/aot_compiler.c b/core/iwasm/compilation/aot_compiler.c index 82f70ca3dc..60c772570c 100644 --- a/core/iwasm/compilation/aot_compiler.c +++ b/core/iwasm/compilation/aot_compiler.c @@ -1158,9 +1158,7 @@ aot_compile_func(AOTCompContext *comp_ctx, uint32 func_index) case WASM_OP_BR_IF: { - read_leb_uint32(frame_ip, frame_ip_end, br_depth); - if (!aot_compile_op_br_if(comp_ctx, func_ctx, br_depth, - &frame_ip)) + if (!aot_compile_op_br_if(comp_ctx, func_ctx, &frame_ip)) return false; break; } diff --git a/core/iwasm/compilation/aot_emit_control.c b/core/iwasm/compilation/aot_emit_control.c index 80e379513c..6817295f86 100644 --- a/core/iwasm/compilation/aot_emit_control.c +++ b/core/iwasm/compilation/aot_emit_control.c @@ -12,6 +12,7 @@ #endif #include "../aot/aot_runtime.h" #include "../interpreter/wasm_loader.h" +#include "../common/wasm_loader_common.h" #if WASM_ENABLE_DEBUG_AOT != 0 #include "debug/dwarf_extractor.h" @@ -87,6 +88,15 @@ format_block_name(char *name, uint32 name_size, uint32 block_index, } \ } while (0) +#define BUILD_COND_BR_V(value_if, block_then, block_else, instr) \ + do { \ + if (!(instr = LLVMBuildCondBr(comp_ctx->builder, value_if, block_then, \ + block_else))) { \ + aot_set_last_error("llvm build cond br failed."); \ + goto fail; \ + } \ + } while (0) + #define SET_BUILDER_POS(llvm_block) \ LLVMPositionBuilderAtEnd(comp_ctx->builder, llvm_block) @@ -255,6 +265,36 @@ restore_frame_sp_for_op_end(AOTBlock *block, AOTCompFrame *aot_frame) aot_frame->sp = block->frame_sp_begin; } +#if WASM_ENABLE_BRANCH_HINTS != 0 +static void +aot_emit_branch_hint(AOTCompContext *comp_ctx, AOTFuncContext *func_ctx, + uint32 offset, LLVMValueRef br_if_instr) +{ + struct WASMCompilationHint *hint = func_ctx->function_hints; + while (hint != NULL) { + if (hint->type == WASM_COMPILATION_BRANCH_HINT + && ((struct WASMCompilationHintBranchHint *)hint)->offset + == offset) { + break; + } + hint = hint->next; + } + if (hint != NULL) { + // same weight llvm MDBuilder::createLikelyBranchWeights assigns + const uint32_t likely_weight = (1U << 20) - 1; + const uint32_t unlikely_weight = 1; + aot_set_cond_br_weights( + comp_ctx, br_if_instr, + ((struct WASMCompilationHintBranchHint *)hint)->is_likely + ? likely_weight + : unlikely_weight, + ((struct WASMCompilationHintBranchHint *)hint)->is_likely + ? unlikely_weight + : likely_weight); + } +} +#endif + static bool handle_next_reachable_block(AOTCompContext *comp_ctx, AOTFuncContext *func_ctx, uint8 **p_frame_ip) @@ -673,13 +713,31 @@ aot_compile_op_block(AOTCompContext *comp_ctx, AOTFuncContext *func_ctx, MOVE_BLOCK_AFTER(block->llvm_else_block, block->llvm_entry_block); /* Create condition br IR */ +#if WASM_ENABLE_BRANCH_HINTS != 0 + LLVMValueRef br_if_val = NULL; + BUILD_COND_BR_V(value, block->llvm_entry_block, + block->llvm_else_block, br_if_val); + const uint32 off = + *p_frame_ip - func_ctx->aot_func->code_body_begin; + aot_emit_branch_hint(comp_ctx, func_ctx, off, br_if_val); +#else BUILD_COND_BR(value, block->llvm_entry_block, block->llvm_else_block); +#endif } else { /* Create condition br IR */ +#if WASM_ENABLE_BRANCH_HINTS != 0 + LLVMValueRef br_if_val = NULL; + BUILD_COND_BR_V(value, block->llvm_entry_block, + block->llvm_end_block, br_if_val); + const uint32 off = + *p_frame_ip - func_ctx->aot_func->code_body_begin; + aot_emit_branch_hint(comp_ctx, func_ctx, off, br_if_val); +#else BUILD_COND_BR(value, block->llvm_entry_block, block->llvm_end_block); +#endif block->is_reachable = true; } if (!push_aot_block_to_stack_and_pass_params(comp_ctx, func_ctx, @@ -1026,8 +1084,7 @@ aot_compile_op_br(AOTCompContext *comp_ctx, AOTFuncContext *func_ctx, static bool aot_compile_conditional_br(AOTCompContext *comp_ctx, AOTFuncContext *func_ctx, - uint32 br_depth, LLVMValueRef value_cmp, - uint8 **p_frame_ip) + LLVMValueRef value_cmp, uint8 **p_frame_ip) { AOTBlock *block_dst; LLVMValueRef value, *values = NULL; @@ -1036,6 +1093,17 @@ aot_compile_conditional_br(AOTCompContext *comp_ctx, AOTFuncContext *func_ctx, uint32 i, param_index, result_index; uint64 size; + // ip is advanced by one byte for the opcode +#if WASM_ENABLE_BRANCH_HINTS != 0 + uint32 instr_offset = + (*p_frame_ip - 0x1) - (func_ctx->aot_func->code_body_begin); +#else + uint32 instr_offset = 0; +#endif + uint64 br_depth; + if (!read_leb(p_frame_ip, *p_frame_ip + 5, 32, false, &br_depth, NULL, 0)) + return false; + if (!(block_dst = get_target_block(func_ctx, br_depth))) { return false; } @@ -1108,8 +1176,15 @@ aot_compile_conditional_br(AOTCompContext *comp_ctx, AOTFuncContext *func_ctx, values = NULL; } +#if WASM_ENABLE_BRANCH_HINTS != 0 + LLVMValueRef br_if_val = NULL; + BUILD_COND_BR_V(value_cmp, block_dst->llvm_entry_block, + llvm_else_block, br_if_val); + aot_emit_branch_hint(comp_ctx, func_ctx, instr_offset, br_if_val); +#else BUILD_COND_BR(value_cmp, block_dst->llvm_entry_block, llvm_else_block); +#endif /* Move builder to else block */ SET_BUILDER_POS(llvm_else_block); @@ -1152,9 +1227,15 @@ aot_compile_conditional_br(AOTCompContext *comp_ctx, AOTFuncContext *func_ctx, } /* Condition jump to end block */ +#if WASM_ENABLE_BRANCH_HINTS != 0 + LLVMValueRef br_if_val = NULL; + BUILD_COND_BR_V(value_cmp, block_dst->llvm_end_block, + llvm_else_block, br_if_val); + aot_emit_branch_hint(comp_ctx, func_ctx, instr_offset, br_if_val); +#else BUILD_COND_BR(value_cmp, block_dst->llvm_end_block, llvm_else_block); - +#endif /* Move builder to else block */ SET_BUILDER_POS(llvm_else_block); } @@ -1178,13 +1259,13 @@ aot_compile_conditional_br(AOTCompContext *comp_ctx, AOTFuncContext *func_ctx, bool aot_compile_op_br_if(AOTCompContext *comp_ctx, AOTFuncContext *func_ctx, - uint32 br_depth, uint8 **p_frame_ip) + uint8 **p_frame_ip) { LLVMValueRef value_cmp; POP_COND(value_cmp); - return aot_compile_conditional_br(comp_ctx, func_ctx, br_depth, value_cmp, + return aot_compile_conditional_br(comp_ctx, func_ctx, value_cmp, p_frame_ip); fail: return false; diff --git a/core/iwasm/compilation/aot_emit_control.h b/core/iwasm/compilation/aot_emit_control.h index fd538495d6..7ea527a20c 100644 --- a/core/iwasm/compilation/aot_emit_control.h +++ b/core/iwasm/compilation/aot_emit_control.h @@ -32,7 +32,7 @@ aot_compile_op_br(AOTCompContext *comp_ctx, AOTFuncContext *func_ctx, bool aot_compile_op_br_if(AOTCompContext *comp_ctx, AOTFuncContext *func_ctx, - uint32 br_depth, uint8 **p_frame_ip); + uint8 **p_frame_ip); bool aot_compile_op_br_table(AOTCompContext *comp_ctx, AOTFuncContext *func_ctx, diff --git a/core/iwasm/compilation/aot_llvm.c b/core/iwasm/compilation/aot_llvm.c index 5190a39d4b..ed36749be4 100644 --- a/core/iwasm/compilation/aot_llvm.c +++ b/core/iwasm/compilation/aot_llvm.c @@ -1963,6 +1963,13 @@ aot_create_func_context(const AOTCompData *comp_data, AOTCompContext *comp_ctx, goto fail; } +#if WASM_ENABLE_BRANCH_HINTS != 0 + func_ctx->function_hints = + comp_ctx->comp_data->function_hints + ? comp_ctx->comp_data->function_hints[func_index] + : NULL; +#endif + return func_ctx; fail: diff --git a/core/iwasm/compilation/aot_llvm.h b/core/iwasm/compilation/aot_llvm.h index 9f62f66162..a83fddb49a 100644 --- a/core/iwasm/compilation/aot_llvm.h +++ b/core/iwasm/compilation/aot_llvm.h @@ -270,6 +270,9 @@ typedef struct AOTFuncContext { #if WASM_ENABLE_DEBUG_AOT != 0 LLVMMetadataRef debug_func; #endif +#if WASM_ENABLE_BRANCH_HINTS != 0 + struct WASMCompilationHint *function_hints; +#endif unsigned int stack_consumption_for_func_call; diff --git a/core/iwasm/interpreter/wasm.h b/core/iwasm/interpreter/wasm.h index 0dd73958eb..87552455e6 100644 --- a/core/iwasm/interpreter/wasm.h +++ b/core/iwasm/interpreter/wasm.h @@ -751,6 +751,10 @@ struct WASMFunction { void *call_to_fast_jit_from_llvm_jit; #endif #endif + +#if WASM_ENABLE_BRANCH_HINTS != 0 + uint8 *code_body_begin; +#endif }; #if WASM_ENABLE_TAGS != 0 @@ -761,6 +765,23 @@ struct WASMTag { }; #endif +#if WASM_ENABLE_BRANCH_HINTS != 0 +enum WASMCompilationHintType { + DUMMY = 0, + WASM_COMPILATION_BRANCH_HINT = 0, +}; +struct WASMCompilationHint { + struct WASMCompilationHint *next; + enum WASMCompilationHintType type; +}; +struct WASMCompilationHintBranchHint { + struct WASMCompilationHint *next; + enum WASMCompilationHintType type; + uint32 offset; + bool is_likely; +}; +#endif + struct WASMGlobal { WASMGlobalType type; #if WASM_ENABLE_GC != 0 @@ -1049,6 +1070,10 @@ struct WASMModule { const uint8 *name_section_buf_end; #endif +#if WASM_ENABLE_BRANCH_HINTS != 0 + struct WASMCompilationHint **function_hints; +#endif + #if WASM_ENABLE_LOAD_CUSTOM_SECTION != 0 WASMCustomSection *custom_section_list; #endif diff --git a/core/iwasm/interpreter/wasm_loader.c b/core/iwasm/interpreter/wasm_loader.c index 55128795ce..0cf82b6498 100644 --- a/core/iwasm/interpreter/wasm_loader.c +++ b/core/iwasm/interpreter/wasm_loader.c @@ -3908,6 +3908,9 @@ load_function_section(const uint8 *buf, const uint8 *buf_end, /* Resolve local set count */ p_code_end = p_code + code_size; +#if WASM_ENABLE_BRANCH_HINTS != 0 + uint8 *p_body_start = (uint8 *)p_code; +#endif local_count = 0; read_leb_uint32(p_code, buf_code_end, local_set_count); p_code_save = p_code; @@ -3988,6 +3991,9 @@ load_function_section(const uint8 *buf, const uint8 *buf_end, if (local_count > 0) func->local_types = (uint8 *)func + sizeof(WASMFunction); func->code_size = code_size; +#if WASM_ENABLE_BRANCH_HINTS != 0 + func->code_body_begin = p_body_start; +#endif /* * we shall make a copy of code body [p_code, p_code + code_size] * when we are worrying about inappropriate releasing behaviour. @@ -5560,6 +5566,88 @@ handle_name_section(const uint8 *buf, const uint8 *buf_end, WASMModule *module, } #endif +#if WASM_ENABLE_BRANCH_HINTS != 0 +static bool +handle_branch_hint_section(const uint8 *buf, const uint8 *buf_end, + WASMModule *module, char *error_buf, + uint32 error_buf_size) +{ + if (module->function_hints == NULL) { + module->function_hints = loader_malloc( + sizeof(struct WASMCompilationHint) * module->function_count, + error_buf, error_buf_size); + } + uint32 numFunctionHints = 0; + read_leb_uint32(buf, buf_end, numFunctionHints); + for (uint32 i = 0; i < numFunctionHints; ++i) { + uint32 func_idx; + read_leb_uint32(buf, buf_end, func_idx); + if (!check_function_index(module, func_idx, error_buf, + error_buf_size)) { + goto fail; + } + if (func_idx < module->import_function_count) { + set_error_buf(error_buf, error_buf_size, + "branch hint for imported function is not allowed"); + goto fail; + } + + struct WASMCompilationHint *current_hint = + (struct WASMCompilationHint *)&module + ->function_hints[func_idx - module->import_function_count]; + while (current_hint->next != NULL) { + current_hint = current_hint->next; + } + + uint32 num_hints; + read_leb_uint32(buf, buf_end, num_hints); + struct WASMCompilationHintBranchHint *new_hints = loader_malloc( + sizeof(struct WASMCompilationHintBranchHint) * num_hints, error_buf, + error_buf_size); + for (uint32 j = 0; j < num_hints; ++j) { + struct WASMCompilationHintBranchHint *new_hint = &new_hints[j]; + new_hint->next = NULL; + new_hint->type = WASM_COMPILATION_BRANCH_HINT; + read_leb_uint32(buf, buf_end, new_hint->offset); + + uint32 size; + read_leb_uint32(buf, buf_end, size); + if (size != 1) { + set_error_buf_v(error_buf, error_buf_size, + "invalid branch hint size, expected 1, got %d.", + size); + wasm_runtime_free(new_hint); + goto fail; + } + + uint8 data = *buf++; + if (data == 0x00) + new_hint->is_likely = false; + else if (data == 0x01) + new_hint->is_likely = true; + else { + set_error_buf_v(error_buf, error_buf_size, + "invalid branch hint, expected 0 or 1, got %d", + data); + wasm_runtime_free(new_hint); + goto fail; + } + + current_hint->next = (struct WASMCompilationHint *)new_hint; + current_hint = (struct WASMCompilationHint *)new_hint; + } + } + if (buf != buf_end) { + set_error_buf(error_buf, error_buf_size, + "invalid branch hint section, not filled until end"); + goto fail; + } + return true; +fail: + return false; +} +#endif + static bool load_user_section(const uint8 *buf, const uint8 *buf_end, WASMModule *module, bool is_load_from_file_buf, char *error_buf, @@ -5609,6 +5697,24 @@ load_user_section(const uint8 *buf, const uint8 *buf_end, WASMModule *module, } #endif +#if WASM_ENABLE_BRANCH_HINTS != 0 + if (name_len == 25 + && memcmp((const char *)p, "metadata.code.branch_hint", 25) == 0) { + p += name_len; + if (!handle_branch_hint_section(p, p_end, module, error_buf, + error_buf_size)) { + return false; + } + LOG_VERBOSE("Load branch hint section success."); + } +#else + if (name_len == 25 + && memcmp((const char *)p, "metadata.code.branch_hint", 25) == 0) { + LOG_VERBOSE("Found branch hint section, but branch hints are disabled " + "in this build, skipping."); + } +#endif + #if WASM_ENABLE_LOAD_CUSTOM_SECTION != 0 { WASMCustomSection *section = @@ -7388,7 +7494,17 @@ wasm_loader_unload(WASMModule *module) } #endif #endif - +#if WASM_ENABLE_BRANCH_HINTS != 0 + for (size_t i = 0; i < module->function_count; i++) { + // be carefull when adding more hints. This only works as long as + // the hint structs have been allocated all at once as an array. + // With only branch-hints at the moment, this is the case. + if (module->function_hints != NULL && module->function_hints[i] != NULL) + wasm_runtime_free(module->function_hints[i]); + } + if (module->function_hints != NULL) + wasm_runtime_free(module->function_hints); +#endif wasm_runtime_free(module); } diff --git a/doc/stability_wasm_proposals.md b/doc/stability_wasm_proposals.md index fe93d31d1d..c8b90d5e44 100644 --- a/doc/stability_wasm_proposals.md +++ b/doc/stability_wasm_proposals.md @@ -12,16 +12,17 @@ Users can turn those features on or off by using compilation options. If a relev ## On-by-default Wasm Proposals -| Proposal | >= Phase 4 | Compilation Option | -| ------------------------------------- | ---------- | ------------------------ | -| Bulk Memory Operations | Yes | `WAMR_BUILD_BULK_MEMORY` | -| Fixed-width SIMD[^1] | Yes | `WAMR_BUILD_SIMD` | -| Import/Export of Mutable Globals[^2] | Yes | N/A | -| Multi-value | Yes | N/A | -| Non-trapping float-to-int Conversions | Yes | N/A | -| Reference Types | Yes | `WAMR_BUILD_REF_TYPES` | -| Sign-extension Operators | Yes | N/A | -| WebAssembly C and C++ API | No | N/A | +| Proposal | >= Phase 4 | Compilation Option | +| ------------------------------------- | ---------- |----------------------------| +| Bulk Memory Operations | Yes | `WAMR_BUILD_BULK_MEMORY` | +| Fixed-width SIMD[^1] | Yes | `WAMR_BUILD_SIMD` | +| Import/Export of Mutable Globals[^2] | Yes | N/A | +| Multi-value | Yes | N/A | +| Non-trapping float-to-int Conversions | Yes | N/A | +| Reference Types | Yes | `WAMR_BUILD_REF_TYPES` | +| Sign-extension Operators | Yes | N/A | +| WebAssembly C and C++ API | No | N/A | +| Branch Hinting | Yes | `WASM_ENABLE_BRANCH_HINTS` | [^1]: llvm-jit and aot only. @@ -54,7 +55,6 @@ Users can turn those features on or off by using compilation options. If a relev | Proposal | >= Phase 4 | | ------------------------------------------- | ---------- | -| Branch Hinting | Yes | | Custom Annotation Syntax in the Text Format | Yes | | Exception Handling[^6] | Yes | | JS String Builtins | Yes | diff --git a/wamr-compiler/CMakeLists.txt b/wamr-compiler/CMakeLists.txt index 24afdd49dc..c01c4fd0f6 100644 --- a/wamr-compiler/CMakeLists.txt +++ b/wamr-compiler/CMakeLists.txt @@ -46,6 +46,7 @@ add_definitions(-DWASM_ENABLE_SHARED_MEMORY=1) add_definitions(-DWASM_ENABLE_THREAD_MGR=1) add_definitions(-DWASM_ENABLE_TAIL_CALL=1) add_definitions(-DWASM_ENABLE_REF_TYPES=1) +add_definitions(-DWASM_ENABLE_BRANCH_HINTS=1) add_definitions(-DWASM_ENABLE_CUSTOM_NAME_SECTION=1) add_definitions(-DWASM_ENABLE_AOT_STACK_FRAME=1) add_definitions(-DWASM_ENABLE_DUMP_CALL_STACK=1) From d7afa4c0cfe36eba9ce2a5581d5d48e325103564 Mon Sep 17 00:00:00 2001 From: TianlongLiang <111852609+TianlongLiang@users.noreply.github.com> Date: Fri, 12 Sep 2025 08:44:42 +0800 Subject: [PATCH 061/103] Enable -Wdouble-promotion by default and fix related warnings (#4603) - fix float to double implicit conversion - add isnanf and signbitf macros, map them to existing double version when float versions are absent - enable -Wdouble-promotion by default - define isnan as macro for platform use core\sahred\platform\common\math.c --- build-scripts/warnings.cmake | 3 ++ core/iwasm/aot/aot_intrinsic.c | 4 +-- core/iwasm/aot/aot_runtime.c | 12 +++---- core/iwasm/compilation/aot_compiler.h | 2 +- core/iwasm/compilation/simd/simd_common.c | 2 +- core/iwasm/fast-jit/fe/jit_emit_numberic.c | 4 +-- core/iwasm/fast-jit/jit_dump.c | 2 +- core/iwasm/interpreter/wasm_interp_classic.c | 16 ++++++--- core/iwasm/interpreter/wasm_interp_fast.c | 4 +-- core/iwasm/interpreter/wasm_runtime.c | 12 +++---- .../shared/platform/alios/platform_internal.h | 8 +++-- core/shared/platform/common/math/math.c | 33 +++++++++++++++++-- core/shared/platform/riot/platform_internal.h | 8 +++-- .../platform/zephyr/platform_internal.h | 8 +++-- 14 files changed, 84 insertions(+), 34 deletions(-) diff --git a/build-scripts/warnings.cmake b/build-scripts/warnings.cmake index 14abf74a35..5e8df43f1c 100644 --- a/build-scripts/warnings.cmake +++ b/build-scripts/warnings.cmake @@ -20,6 +20,9 @@ else () $<$:-Wincompatible-pointer-types> $<$:-Wimplicit-function-declaration> ) + add_compile_options ( + -Wdouble-promotion + ) # waivers add_compile_options ( -Wno-unused diff --git a/core/iwasm/aot/aot_intrinsic.c b/core/iwasm/aot/aot_intrinsic.c index a0e59e1d21..f296b4a25f 100644 --- a/core/iwasm/aot/aot_intrinsic.c +++ b/core/iwasm/aot/aot_intrinsic.c @@ -152,7 +152,7 @@ float64 aot_intrinsic_fmin_f64(float64 a, float64 b) { if (isnan(a) || isnan(b)) - return NAN; + return (float64)NAN; else if (a == 0 && a == b) return signbit(a) ? a : b; else @@ -174,7 +174,7 @@ float64 aot_intrinsic_fmax_f64(float64 a, float64 b) { if (isnan(a) || isnan(b)) - return NAN; + return (float64)NAN; else if (a == 0 && a == b) return signbit(a) ? b : a; else diff --git a/core/iwasm/aot/aot_runtime.c b/core/iwasm/aot/aot_runtime.c index 876e4b1f09..3bf33e1276 100644 --- a/core/iwasm/aot/aot_runtime.c +++ b/core/iwasm/aot/aot_runtime.c @@ -4607,16 +4607,16 @@ aot_dump_perf_profiling(const AOTModuleInstance *module_inst) os_printf( " func %s, execution time: %.3f ms, execution count: %" PRIu32 " times, children execution time: %.3f ms\n", - func_name, perf_prof->total_exec_time / 1000.0f, + func_name, perf_prof->total_exec_time / 1000.0, perf_prof->total_exec_cnt, - perf_prof->children_exec_time / 1000.0f); + perf_prof->children_exec_time / 1000.0); else os_printf(" func %" PRIu32 ", execution time: %.3f ms, execution count: %" PRIu32 " times, children execution time: %.3f ms\n", - i, perf_prof->total_exec_time / 1000.0f, + i, perf_prof->total_exec_time / 1000.0, perf_prof->total_exec_cnt, - perf_prof->children_exec_time / 1000.0f); + perf_prof->children_exec_time / 1000.0); } } @@ -4632,7 +4632,7 @@ aot_summarize_wasm_execute_time(const AOTModuleInstance *inst) AOTFuncPerfProfInfo *perf_prof = (AOTFuncPerfProfInfo *)inst->func_perf_profilings + i; ret += (perf_prof->total_exec_time - perf_prof->children_exec_time) - / 1000.0f; + / 1000.0; } return ret; @@ -4651,7 +4651,7 @@ aot_get_wasm_func_exec_time(const AOTModuleInstance *inst, AOTFuncPerfProfInfo *perf_prof = (AOTFuncPerfProfInfo *)inst->func_perf_profilings + i; return (perf_prof->total_exec_time - perf_prof->children_exec_time) - / 1000.0f; + / 1000.0; } } diff --git a/core/iwasm/compilation/aot_compiler.h b/core/iwasm/compilation/aot_compiler.h index 889e2304b5..70d01c578d 100644 --- a/core/iwasm/compilation/aot_compiler.h +++ b/core/iwasm/compilation/aot_compiler.h @@ -668,7 +668,7 @@ set_local_gc_ref(AOTCompFrame *frame, int n, LLVMValueRef value, uint8 ref_type) #define I32_CONST(v) LLVMConstInt(I32_TYPE, v, true) #define I64_CONST(v) LLVMConstInt(I64_TYPE, v, true) -#define F32_CONST(v) LLVMConstReal(F32_TYPE, v) +#define F32_CONST(v) LLVMConstReal(F32_TYPE, (double)(v)) #define F64_CONST(v) LLVMConstReal(F64_TYPE, v) #define I8_CONST(v) LLVMConstInt(INT8_TYPE, v, true) diff --git a/core/iwasm/compilation/simd/simd_common.c b/core/iwasm/compilation/simd/simd_common.c index 95bcdfdb04..c495ee4104 100644 --- a/core/iwasm/compilation/simd/simd_common.c +++ b/core/iwasm/compilation/simd/simd_common.c @@ -137,7 +137,7 @@ simd_build_splat_const_float_vector(const AOTCompContext *comp_ctx, return NULL; } - if (!(element = LLVMConstReal(element_type, element_value))) { + if (!(element = LLVMConstReal(element_type, (double)element_value))) { HANDLE_FAILURE("LLVMConstReal"); goto fail; } diff --git a/core/iwasm/fast-jit/fe/jit_emit_numberic.c b/core/iwasm/fast-jit/fe/jit_emit_numberic.c index 00f608f84d..347c21827e 100644 --- a/core/iwasm/fast-jit/fe/jit_emit_numberic.c +++ b/core/iwasm/fast-jit/fe/jit_emit_numberic.c @@ -1564,7 +1564,7 @@ static float64 f64_min(float64 a, float64 b) { if (isnan(a) || isnan(b)) - return NAN; + return (float64)NAN; else if (a == 0 && a == b) return signbit(a) ? a : b; else @@ -1575,7 +1575,7 @@ static float64 f64_max(float64 a, float64 b) { if (isnan(a) || isnan(b)) - return NAN; + return (float64)NAN; else if (a == 0 && a == b) return signbit(a) ? b : a; else diff --git a/core/iwasm/fast-jit/jit_dump.c b/core/iwasm/fast-jit/jit_dump.c index d61ed5dc78..7e45dd83df 100644 --- a/core/iwasm/fast-jit/jit_dump.c +++ b/core/iwasm/fast-jit/jit_dump.c @@ -40,7 +40,7 @@ jit_dump_reg(JitCompContext *cc, JitReg reg) case JIT_REG_KIND_F32: if (jit_reg_is_const(reg)) - os_printf("%f", jit_cc_get_const_F32(cc, reg)); + os_printf("%f", (double)jit_cc_get_const_F32(cc, reg)); else os_printf("f%d", no); break; diff --git a/core/iwasm/interpreter/wasm_interp_classic.c b/core/iwasm/interpreter/wasm_interp_classic.c index edc473f2c2..8f5f1821ae 100644 --- a/core/iwasm/interpreter/wasm_interp_classic.c +++ b/core/iwasm/interpreter/wasm_interp_classic.c @@ -223,7 +223,7 @@ static inline float64 f64_min(float64 a, float64 b) { if (isnan(a) || isnan(b)) - return NAN; + return (float64)NAN; else if (a == 0 && a == b) return signbit(a) ? a : b; else @@ -234,7 +234,7 @@ static inline float64 f64_max(float64 a, float64 b) { if (isnan(a) || isnan(b)) - return NAN; + return (float64)NAN; else if (a == 0 && a == b) return signbit(a) ? b : a; else @@ -1685,7 +1685,10 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module, goto got_exception; } - HANDLE_OP(WASM_OP_NOP) { HANDLE_OP_END(); } + HANDLE_OP(WASM_OP_NOP) + { + HANDLE_OP_END(); + } #if WASM_ENABLE_EXCE_HANDLING != 0 HANDLE_OP(WASM_OP_RETHROW) @@ -5622,7 +5625,10 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module, HANDLE_OP(WASM_OP_I32_REINTERPRET_F32) HANDLE_OP(WASM_OP_I64_REINTERPRET_F64) HANDLE_OP(WASM_OP_F32_REINTERPRET_I32) - HANDLE_OP(WASM_OP_F64_REINTERPRET_I64) { HANDLE_OP_END(); } + HANDLE_OP(WASM_OP_F64_REINTERPRET_I64) + { + HANDLE_OP_END(); + } HANDLE_OP(WASM_OP_I32_EXTEND8_S) { @@ -5697,7 +5703,7 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module, true); break; case WASM_OP_I64_TRUNC_SAT_U_F64: - DEF_OP_TRUNC_SAT_F64(-1.0f, 18446744073709551616.0, + DEF_OP_TRUNC_SAT_F64(-1.0, 18446744073709551616.0, false, false); break; #if WASM_ENABLE_BULK_MEMORY != 0 diff --git a/core/iwasm/interpreter/wasm_interp_fast.c b/core/iwasm/interpreter/wasm_interp_fast.c index 36d4538ffc..5cbb3cbe9a 100644 --- a/core/iwasm/interpreter/wasm_interp_fast.c +++ b/core/iwasm/interpreter/wasm_interp_fast.c @@ -164,7 +164,7 @@ static inline float64 f64_min(float64 a, float64 b) { if (isnan(a) || isnan(b)) - return NAN; + return (float64)NAN; else if (a == 0 && a == b) return signbit(a) ? a : b; else @@ -175,7 +175,7 @@ static inline float64 f64_max(float64 a, float64 b) { if (isnan(a) || isnan(b)) - return NAN; + return (float64)NAN; else if (a == 0 && a == b) return signbit(a) ? b : a; else diff --git a/core/iwasm/interpreter/wasm_runtime.c b/core/iwasm/interpreter/wasm_runtime.c index 55e65142a7..3642adf9b0 100644 --- a/core/iwasm/interpreter/wasm_runtime.c +++ b/core/iwasm/interpreter/wasm_runtime.c @@ -3744,16 +3744,16 @@ wasm_dump_perf_profiling(const WASMModuleInstance *module_inst) os_printf( " func %s, execution time: %.3f ms, execution count: %" PRIu32 " times, children execution time: %.3f ms\n", - func_name, func_inst->total_exec_time / 1000.0f, + func_name, func_inst->total_exec_time / 1000.0, func_inst->total_exec_cnt, - func_inst->children_exec_time / 1000.0f); + func_inst->children_exec_time / 1000.0); else os_printf(" func %" PRIu32 ", execution time: %.3f ms, execution count: %" PRIu32 " times, children execution time: %.3f ms\n", - i, func_inst->total_exec_time / 1000.0f, + i, func_inst->total_exec_time / 1000.0, func_inst->total_exec_cnt, - func_inst->children_exec_time / 1000.0f); + func_inst->children_exec_time / 1000.0); } } @@ -3765,7 +3765,7 @@ wasm_summarize_wasm_execute_time(const WASMModuleInstance *inst) unsigned i; for (i = 0; i < inst->e->function_count; i++) { WASMFunctionInstance *func = inst->e->functions + i; - ret += (func->total_exec_time - func->children_exec_time) / 1000.0f; + ret += (func->total_exec_time - func->children_exec_time) / 1000.0; } return ret; @@ -3780,7 +3780,7 @@ wasm_get_wasm_func_exec_time(const WASMModuleInstance *inst, char *name_in_wasm = get_func_name_from_index(inst, i); if (name_in_wasm && strcmp(name_in_wasm, func_name) == 0) { WASMFunctionInstance *func = inst->e->functions + i; - return (func->total_exec_time - func->children_exec_time) / 1000.0f; + return (func->total_exec_time - func->children_exec_time) / 1000.0; } } diff --git a/core/shared/platform/alios/platform_internal.h b/core/shared/platform/alios/platform_internal.h index 125aa0b63f..c5032f9b2e 100644 --- a/core/shared/platform/alios/platform_internal.h +++ b/core/shared/platform/alios/platform_internal.h @@ -66,8 +66,12 @@ float fmaxf(float x, float y); float rintf(float x); float fabsf(float x); float truncf(float x); -int signbit(double x); -int isnan(double x); +int isnan_double(double x); +int isnan_float(float x); +int signbit_double(double x); +int signbit_float(float x); +#define isnan(x) (sizeof(x) == sizeof(double) ? isnan_double((double)x) : isnan_float(x)) +#define signbit(x) (sizeof(x) == sizeof(double) ? signbit_double((double)x) : signbit_float(x)) /* clang-format on */ /* The below types are used in platform_api_extension.h, diff --git a/core/shared/platform/common/math/math.c b/core/shared/platform/common/math/math.c index 2ba9f4d28b..ac0c402210 100644 --- a/core/shared/platform/common/math/math.c +++ b/core/shared/platform/common/math/math.c @@ -1005,6 +1005,21 @@ freebsd_isnan(double d) } } +static int +freebsd_isnanf(float f) +{ + if (is_little_endian()) { + IEEEf2bits_L u; + u.f = f; + return (u.bits.exp == 0xff && u.bits.man != 0); + } + else { + IEEEf2bits_B u; + u.f = f; + return (u.bits.exp == 0xff && u.bits.man != 0); + } +} + static float freebsd_fabsf(float x) { @@ -1601,7 +1616,13 @@ fabs(double x) } int -isnan(double x) +isnan_float(float x) +{ + return freebsd_isnanf(x); +} + +int +isnan_double(double x) { return freebsd_isnan(x); } @@ -1613,7 +1634,15 @@ trunc(double x) } int -signbit(double x) +signbit_float(float x) +{ + unsigned int i; + GET_FLOAT_WORD(i, x); + return (int)(i >> 31); +} + +int +signbit_double(double x) { return ((__HI(x) & 0x80000000) >> 31); } diff --git a/core/shared/platform/riot/platform_internal.h b/core/shared/platform/riot/platform_internal.h index fd9e40da71..6eaae2caf0 100644 --- a/core/shared/platform/riot/platform_internal.h +++ b/core/shared/platform/riot/platform_internal.h @@ -86,8 +86,12 @@ float fmaxf(float x, float y); float rintf(float x); float fabsf(float x); float truncf(float x); -int signbit(double x); -int isnan(double x); +int isnan_double(double x); +int isnan_float(float x); +int signbit_double(double x); +int signbit_float(float x); +#define isnan(x) (sizeof(x) == sizeof(double) ? isnan_double((double)x) : isnan_float(x)) +#define signbit(x) (sizeof(x) == sizeof(double) ? signbit_double((double)x) : signbit_float(x)) /* clang-format on */ #endif diff --git a/core/shared/platform/zephyr/platform_internal.h b/core/shared/platform/zephyr/platform_internal.h index 7e59faa746..d5f0c80d81 100644 --- a/core/shared/platform/zephyr/platform_internal.h +++ b/core/shared/platform/zephyr/platform_internal.h @@ -189,12 +189,16 @@ float fmaxf(float x, float y); float rintf(float x); float fabsf(float x); float truncf(float x); -int isnan(double x); +int isnan_double(double x); +int isnan_float(float x); +#define isnan(x) (sizeof(x) == sizeof(double) ? isnan_double((double)x) : isnan_float(x)) double pow(double x, double y); double scalbn(double x, int n); #ifndef BH_HAS_SIGNBIT -int signbit(double x); +int signbit_double(double x); +int signbit_float(float x); +#define signbit(x) (sizeof(x) == sizeof(double) ? signbit_double((double)x) : signbit_float(x)) #endif unsigned long long int strtoull(const char *nptr, char **endptr, int base); From ad21524573816f3b71f3b3d946e8de7015817399 Mon Sep 17 00:00:00 2001 From: "liang.he" Date: Fri, 12 Sep 2025 16:00:23 +0800 Subject: [PATCH 062/103] fix: few CI errors caused by recently enabled compilation flags (#4620) - add missing warning for incompatible pointer types in CMake configuration - fix a shadow warning --- build-scripts/warnings.cmake | 17 ++++++++++++++++- core/iwasm/interpreter/wasm_loader.c | 2 +- 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/build-scripts/warnings.cmake b/build-scripts/warnings.cmake index 5e8df43f1c..fbe6966ccc 100644 --- a/build-scripts/warnings.cmake +++ b/build-scripts/warnings.cmake @@ -16,13 +16,28 @@ else () # # -fpermissive causes warnings like "-fpermissive is valid for C++/ObjC++ but not for C" # + # Reference: + # - gcc-4.8 https://gcc.gnu.org/onlinedocs/gcc-4.8.4/gcc/Warning-Options.html + # - gcc-11.5 https://gcc.gnu.org/onlinedocs/gcc-11.5.0/gcc/Warning-Options.html add_compile_options ( - $<$:-Wincompatible-pointer-types> $<$:-Wimplicit-function-declaration> ) + + # https://gcc.gnu.org/gcc-5/changes.html introduces incompatible-pointer-types + # https://releases.llvm.org/7.0.0/tools/clang/docs/DiagnosticsReference.html#wincompatible-pointer-types + # is the earliest version that supports this option I can found. + # Assume AppClang versioning is compatible with Clang. + if ((CMAKE_C_COMPILER_ID STREQUAL "GNU" AND CMAKE_C_COMPILER_VERSION VERSION_GREATER_EQUAL "5.1") + OR (CMAKE_C_COMPILER_ID STREQUAL "Clang" AND CMAKE_C_COMPILER_VERSION VERSION_GREATER_EQUAL "7.0.0") + OR (CMAKE_C_COMPILER_ID STREQUAL "AppClang" AND CMAKE_C_COMPILER_VERSION VERSION_GREATER_EQUAL "7.0.0")) + add_compile_options($<$:-Wincompatible-pointer-types>) + endif() + + # options benefit embedded system. add_compile_options ( -Wdouble-promotion ) + # waivers add_compile_options ( -Wno-unused diff --git a/core/iwasm/interpreter/wasm_loader.c b/core/iwasm/interpreter/wasm_loader.c index 0cf82b6498..2346b29527 100644 --- a/core/iwasm/interpreter/wasm_loader.c +++ b/core/iwasm/interpreter/wasm_loader.c @@ -7495,7 +7495,7 @@ wasm_loader_unload(WASMModule *module) #endif #endif #if WASM_ENABLE_BRANCH_HINTS != 0 - for (size_t i = 0; i < module->function_count; i++) { + for (i = 0; i < module->function_count; i++) { // be carefull when adding more hints. This only works as long as // the hint structs have been allocated all at once as an array. // With only branch-hints at the moment, this is the case. From 4f8646867059d26b6a961bfe61c9ab665d1ce015 Mon Sep 17 00:00:00 2001 From: YAMAMOTO Takashi Date: Sun, 14 Sep 2025 15:01:55 +0900 Subject: [PATCH 063/103] wasi-nn: retire is_model_loaded flag (#4613) this flag doesn't make much sense anymore because: - backends validate given graph/ctx by themselves - some of them support loading multiple models for a context --- core/iwasm/libraries/wasi-nn/src/wasi_nn.c | 26 ------------------- .../libraries/wasi-nn/src/wasi_nn_private.h | 1 - 2 files changed, 27 deletions(-) diff --git a/core/iwasm/libraries/wasi-nn/src/wasi_nn.c b/core/iwasm/libraries/wasi-nn/src/wasi_nn.c index f857835eb3..2282534b0f 100644 --- a/core/iwasm/libraries/wasi-nn/src/wasi_nn.c +++ b/core/iwasm/libraries/wasi-nn/src/wasi_nn.c @@ -66,7 +66,6 @@ wasi_nn_ctx_destroy(WASINNContext *wasi_nn_ctx) } NN_DBG_PRINTF("[WASI NN] DEINIT..."); NN_DBG_PRINTF("Freeing wasi-nn"); - NN_DBG_PRINTF("-> is_model_loaded: %d", wasi_nn_ctx->is_model_loaded); NN_DBG_PRINTF("-> current_encoding: %d", wasi_nn_ctx->backend); bh_assert(!wasi_nn_ctx->busy); @@ -202,15 +201,6 @@ wasi_nn_destroy() } /* Utils */ -static wasi_nn_error -is_model_initialized(WASINNContext *wasi_nn_ctx) -{ - if (!wasi_nn_ctx->is_model_loaded) { - NN_ERR_PRINTF("Model not initialized."); - return runtime_error; - } - return success; -} /* *TODO: choose a proper backend based on @@ -510,8 +500,6 @@ wasi_nn_load(wasm_exec_env_t exec_env, graph_builder_array_wasm *builder, if (res != success) goto fail; - wasi_nn_ctx->is_model_loaded = true; - fail: // XXX: Free intermediate structure pointers if (builder_native.buf) @@ -587,7 +575,6 @@ wasi_nn_load_by_name(wasm_exec_env_t exec_env, char *name, uint32_t name_len, if (res != success) goto fail; - wasi_nn_ctx->is_model_loaded = true; res = success; fail: if (nul_terminated_name != NULL) { @@ -651,7 +638,6 @@ wasi_nn_load_by_name_with_config(wasm_exec_env_t exec_env, char *name, if (res != success) goto fail; - wasi_nn_ctx->is_model_loaded = true; res = success; fail: if (nul_terminated_name != NULL) { @@ -684,9 +670,6 @@ wasi_nn_init_execution_context(wasm_exec_env_t exec_env, graph g, goto fail; } - if (success != (res = is_model_initialized(wasi_nn_ctx))) - goto fail; - if (!wasm_runtime_validate_native_addr( instance, ctx, (uint64)sizeof(graph_execution_context))) { NN_ERR_PRINTF("ctx is invalid"); @@ -719,9 +702,6 @@ wasi_nn_set_input(wasm_exec_env_t exec_env, graph_execution_context ctx, goto fail; } - if (success != (res = is_model_initialized(wasi_nn_ctx))) - goto fail; - tensor input_tensor_native = { 0 }; if (success != (res = tensor_app_native(instance, input_tensor, @@ -756,9 +736,6 @@ wasi_nn_compute(wasm_exec_env_t exec_env, graph_execution_context ctx) goto fail; } - if (success != (res = is_model_initialized(wasi_nn_ctx))) - goto fail; - call_wasi_nn_func(wasi_nn_ctx->backend, compute, res, wasi_nn_ctx->backend_ctx, ctx); fail: @@ -792,9 +769,6 @@ wasi_nn_get_output(wasm_exec_env_t exec_env, graph_execution_context ctx, goto fail; } - if (success != (res = is_model_initialized(wasi_nn_ctx))) - goto fail; - #if WASM_ENABLE_WASI_EPHEMERAL_NN != 0 if (!wasm_runtime_validate_native_addr(instance, output_tensor, output_tensor_len)) { diff --git a/core/iwasm/libraries/wasi-nn/src/wasi_nn_private.h b/core/iwasm/libraries/wasi-nn/src/wasi_nn_private.h index 466f2cef45..1bff2c514d 100644 --- a/core/iwasm/libraries/wasi-nn/src/wasi_nn_private.h +++ b/core/iwasm/libraries/wasi-nn/src/wasi_nn_private.h @@ -15,7 +15,6 @@ typedef struct { korp_mutex lock; bool busy; bool is_backend_ctx_initialized; - bool is_model_loaded; graph_encoding backend; void *backend_ctx; } WASINNContext; From 5e779b3d7b18e5cc8d3c9504dde53994f6fd599d Mon Sep 17 00:00:00 2001 From: YAMAMOTO Takashi Date: Sun, 14 Sep 2025 15:02:48 +0900 Subject: [PATCH 064/103] libc-wasi: add missing pointer validations to socket functions (#4611) cf. https://github.com/bytecodealliance/wasm-micro-runtime/issues/4463 the fix for sock_addr_resolve is incomplete. cf. https://github.com/bytecodealliance/wasm-micro-runtime/issues/4610 --- .../libraries/libc-wasi/libc_wasi_wrapper.c | 35 +++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/core/iwasm/libraries/libc-wasi/libc_wasi_wrapper.c b/core/iwasm/libraries/libc-wasi/libc_wasi_wrapper.c index acd7c31c96..5ab189e71d 100644 --- a/core/iwasm/libraries/libc-wasi/libc_wasi_wrapper.c +++ b/core/iwasm/libraries/libc-wasi/libc_wasi_wrapper.c @@ -1159,6 +1159,9 @@ wasi_sock_accept(wasm_exec_env_t exec_env, wasi_fd_t fd, wasi_fdflags_t flags, if (!wasi_ctx) return __WASI_EACCES; + if (!validate_native_addr(fd_new, sizeof(*fd_new))) + return __WASI_EINVAL; + curfds = wasi_ctx_get_curfds(wasi_ctx); return wasi_ssp_sock_accept(exec_env, curfds, fd, flags, fd_new); @@ -1217,6 +1220,19 @@ wasi_sock_addr_resolve(wasm_exec_env_t exec_env, const char *host, if (!wasi_ctx) return __WASI_EACCES; + if (!validate_native_addr(hints, sizeof(*hints))) + return __WASI_EINVAL; + + uint64_t addr_info_byte_size = sizeof(*addr_info) * addr_info_size; + if (addr_info_byte_size / addr_info_size != sizeof(*addr_info)) + return __WASI_EINVAL; + + if (!validate_native_addr(addr_info, addr_info_byte_size)) + return __WASI_EINVAL; + + if (!validate_native_addr(max_info_size, sizeof(*max_info_size))) + return __WASI_EINVAL; + curfds = wasi_ctx_get_curfds(wasi_ctx); ns_lookup_list = wasi_ctx_get_ns_lookup_list(wasi_ctx); @@ -1236,6 +1252,9 @@ wasi_sock_bind(wasm_exec_env_t exec_env, wasi_fd_t fd, wasi_addr_t *addr) if (!wasi_ctx) return __WASI_EACCES; + if (!validate_native_addr(addr, sizeof(*addr))) + return __WASI_EINVAL; + curfds = wasi_ctx_get_curfds(wasi_ctx); addr_pool = wasi_ctx_get_addr_pool(wasi_ctx); @@ -1262,6 +1281,9 @@ wasi_sock_connect(wasm_exec_env_t exec_env, wasi_fd_t fd, wasi_addr_t *addr) if (!wasi_ctx) return __WASI_EACCES; + if (!validate_native_addr(addr, sizeof(*addr))) + return __WASI_EINVAL; + curfds = wasi_ctx_get_curfds(wasi_ctx); addr_pool = wasi_ctx_get_addr_pool(wasi_ctx); @@ -1641,6 +1663,9 @@ wasi_sock_open(wasm_exec_env_t exec_env, wasi_fd_t poolfd, if (!wasi_ctx) return __WASI_EACCES; + if (!validate_native_addr(sockfd, sizeof(*sockfd))) + return __WASI_EINVAL; + curfds = wasi_ctx_get_curfds(wasi_ctx); return wasi_ssp_sock_open(exec_env, curfds, poolfd, af, socktype, sockfd); @@ -2080,6 +2105,10 @@ wasi_sock_recv_from(wasm_exec_env_t exec_env, wasi_fd_t sock, return __WASI_EINVAL; } + /* note: src_addr is NULL when called by wasi_sock_recv */ + if (src_addr != NULL && !validate_native_addr(src_addr, sizeof(*src_addr))) + return __WASI_EINVAL; + if (!validate_native_addr(ro_data_len, (uint64)sizeof(uint32))) return __WASI_EINVAL; @@ -2118,6 +2147,9 @@ wasi_sock_recv(wasm_exec_env_t exec_env, wasi_fd_t sock, iovec_app_t *ri_data, wasm_module_inst_t module_inst = get_module_inst(exec_env); wasi_errno_t error; + if (!validate_native_addr(ro_data_len, sizeof(*ro_data_len))) + return __WASI_EINVAL; + if (!validate_native_addr(ro_flags, (uint64)sizeof(wasi_roflags_t))) return __WASI_EINVAL; @@ -2227,6 +2259,9 @@ wasi_sock_send_to(wasm_exec_env_t exec_env, wasi_fd_t sock, return __WASI_EINVAL; } + if (!validate_native_addr((void *)dest_addr, sizeof(*dest_addr))) + return __WASI_EINVAL; + if (!validate_native_addr(so_data_len, (uint64)sizeof(uint32))) return __WASI_EINVAL; From 92b065a3ac903feadcc9b98b8cbac776de9d585a Mon Sep 17 00:00:00 2001 From: YAMAMOTO Takashi Date: Sun, 14 Sep 2025 15:07:54 +0900 Subject: [PATCH 065/103] sync iwasm between windows and posix a bit (#4593) this commit includes: * update windows for * WASM_MEM_ALLOC_WITH_USAGE * InstantiationArgs2 * --jit-codecache-size * --disable-bounds-checks * wasm_proposal_print_status * fix WASM_ENABLE_SHARED_HEAP for windows (https://github.com/bytecodealliance/wasm-micro-runtime/issues/4592) * cosmetic changes to reduce the diff --- product-mini/platforms/posix/main.c | 15 +-- product-mini/platforms/windows/main.c | 167 ++++++++++++++++++-------- 2 files changed, 126 insertions(+), 56 deletions(-) diff --git a/product-mini/platforms/posix/main.c b/product-mini/platforms/posix/main.c index 342eef0fd8..f013ec9d0b 100644 --- a/product-mini/platforms/posix/main.c +++ b/product-mini/platforms/posix/main.c @@ -80,7 +80,7 @@ print_help(void) printf(" Use comma to separate, e.g. --enable-segue=i32.load,i64.store\n"); printf(" and --enable-segue means all flags are added.\n"); #endif -#endif /* WASM_ENABLE_JIT != 0*/ +#endif /* WASM_ENABLE_JIT != 0 */ #if WASM_ENABLE_LINUX_PERF != 0 printf(" --enable-linux-perf Enable linux perf support. It works in aot and llvm-jit.\n"); #endif @@ -404,7 +404,7 @@ unregister_and_unload_native_libs(uint32 native_lib_count, static char * handle_module_path(const char *module_path) { - /* next character after = */ + /* next character after '=' */ return (strchr(module_path, '=')) + 1; } @@ -583,7 +583,7 @@ main(int argc, char *argv[]) uint32 heap_size = 16 * 1024; #endif #if WASM_ENABLE_SHARED_HEAP != 0 - SharedHeapInitArgs heap_init_args; + SharedHeapInitArgs shared_heap_init_args; uint32 shared_heap_size = 0; void *shared_heap = NULL; #endif @@ -1025,15 +1025,16 @@ main(int argc, char *argv[]) #if WASM_ENABLE_SHARED_HEAP != 0 if (shared_heap_size > 0) { - memset(&heap_init_args, 0, sizeof(heap_init_args)); - heap_init_args.size = shared_heap_size; - shared_heap = wasm_runtime_create_shared_heap(&heap_init_args); + memset(&shared_heap_init_args, 0, sizeof(shared_heap_init_args)); + shared_heap_init_args.size = shared_heap_size; + shared_heap = wasm_runtime_create_shared_heap(&shared_heap_init_args); + if (!shared_heap) { printf("Create preallocated shared heap failed\n"); goto fail6; } - /* attach module instance 2 to the shared heap */ + /* attach module instance to the shared heap */ if (!wasm_runtime_attach_shared_heap(wasm_module_inst, shared_heap)) { printf("Attach shared heap failed.\n"); goto fail6; diff --git a/product-mini/platforms/windows/main.c b/product-mini/platforms/windows/main.c index 31680da8a8..4be3a76cbe 100644 --- a/product-mini/platforms/windows/main.c +++ b/product-mini/platforms/windows/main.c @@ -14,70 +14,77 @@ #include "../common/libc_wasi.c" #endif +#include "../common/wasm_proposal.c" + static int app_argc; static char **app_argv; -#define MODULE_PATH ("--module-path=") - /* clang-format off */ static int -print_help() +print_help(void) { printf("Usage: iwasm [-options] wasm_file [args...]\n"); printf("options:\n"); - printf(" -f|--function name Specify a function name of the module to run rather\n" - " than main\n"); + printf(" -f|--function name Specify a function name of the module to run rather\n" + " than main\n"); #if WASM_ENABLE_LOG != 0 - printf(" -v=n Set log verbose level (0 to 5, default is 2) larger\n" - " level with more log\n"); + printf(" -v=n Set log verbose level (0 to 5, default is 2) larger\n" + " level with more log\n"); #endif #if WASM_ENABLE_INTERP != 0 - printf(" --interp Run the wasm app with interpreter mode\n"); + printf(" --interp Run the wasm app with interpreter mode\n"); #endif #if WASM_ENABLE_FAST_JIT != 0 - printf(" --fast-jit Run the wasm app with fast jit mode\n"); + printf(" --fast-jit Run the wasm app with fast jit mode\n"); #endif #if WASM_ENABLE_JIT != 0 - printf(" --llvm-jit Run the wasm app with llvm jit mode\n"); + printf(" --llvm-jit Run the wasm app with llvm jit mode\n"); #endif #if WASM_ENABLE_JIT != 0 && WASM_ENABLE_FAST_JIT != 0 && WASM_ENABLE_LAZY_JIT != 0 - printf(" --multi-tier-jit Run the wasm app with multi-tier jit mode\n"); + printf(" --multi-tier-jit Run the wasm app with multi-tier jit mode\n"); #endif - printf(" --stack-size=n Set maximum stack size in bytes, default is 64 KB\n"); + printf(" --stack-size=n Set maximum stack size in bytes, default is 64 KB\n"); #if WASM_ENABLE_LIBC_WASI !=0 printf(" --heap-size=n Set maximum heap size in bytes, default is 0 KB when libc wasi is enabled\n"); #else printf(" --heap-size=n Set maximum heap size in bytes, default is 16 KB when libc wasi is diabled\n"); #endif -#if WASM_ENABLE_GC != 0 - printf(" --gc-heap-size=n Set maximum gc heap size in bytes,\n"); - printf(" default is %u KB\n", GC_HEAP_SIZE_DEFAULT / 1024); -#endif #if WASM_ENABLE_SHARED_HEAP != 0 printf(" --shared-heap-size=n Create shared heap of n bytes and attach to the wasm app.\n"); printf(" The size n will be adjusted to a minumum number aligned to page size\n"); #endif +#if WASM_ENABLE_FAST_JIT != 0 + printf(" --jit-codecache-size=n Set fast jit maximum code cache size in bytes,\n"); + printf(" default is %u KB\n", FAST_JIT_DEFAULT_CODE_CACHE_SIZE / 1024); +#endif +#if WASM_ENABLE_GC != 0 + printf(" --gc-heap-size=n Set maximum gc heap size in bytes,\n"); + printf(" default is %u KB\n", GC_HEAP_SIZE_DEFAULT / 1024); +#endif #if WASM_ENABLE_JIT != 0 printf(" --llvm-jit-size-level=n Set LLVM JIT size level, default is 3\n"); printf(" --llvm-jit-opt-level=n Set LLVM JIT optimization level, default is 3\n"); +#endif /* WASM_ENABLE_JIT != 0 */ + printf(" --repl Start a very simple REPL (read-eval-print-loop) mode\n" + " that runs commands in the form of `FUNC ARG...`\n"); +#if WASM_CONFIGURABLE_BOUNDS_CHECKS != 0 + printf(" --disable-bounds-checks Disable bounds checks for memory accesses\n"); #endif - printf(" --repl Start a very simple REPL (read-eval-print-loop) mode\n" - " that runs commands in the form of `FUNC ARG...`\n"); #if WASM_ENABLE_LIBC_WASI != 0 libc_wasi_print_help(); #endif #if WASM_ENABLE_MULTI_MODULE != 0 - printf(" --module-path= Indicate a module search path. default is current\n" - " directory('./')\n"); + printf(" --module-path= Indicate a module search path. default is current\n" + " directory('./')\n"); #endif #if WASM_ENABLE_LIB_PTHREAD != 0 || WASM_ENABLE_LIB_WASI_THREADS != 0 - printf(" --max-threads=n Set maximum thread number per cluster, default is 4\n"); + printf(" --max-threads=n Set maximum thread number per cluster, default is 4\n"); #endif #if WASM_ENABLE_DEBUG_INTERP != 0 - printf(" -g=ip:port Set the debug sever address, default is debug disabled\n"); + printf(" -g=ip:port Set the debug sever address, default is debug disabled\n"); printf(" if port is 0, then a random port will be used\n"); #endif - printf(" --version Show version information\n"); + printf(" --version Show version information\n"); return 1; } /* clang-format on */ @@ -190,6 +197,9 @@ static char global_heap_buf[WASM_GLOBAL_HEAP_SIZE] = { 0 }; #else static void * malloc_func( +#if WASM_MEM_ALLOC_WITH_USAGE != 0 + mem_alloc_usage_t usage, +#endif #if WASM_MEM_ALLOC_WITH_USER_DATA != 0 void *user_data, #endif @@ -200,6 +210,9 @@ malloc_func( static void * realloc_func( +#if WASM_MEM_ALLOC_WITH_USAGE != 0 + mem_alloc_usage_t usage, bool full_size_mmaped, +#endif #if WASM_MEM_ALLOC_WITH_USER_DATA != 0 void *user_data, #endif @@ -210,6 +223,9 @@ realloc_func( static void free_func( +#if WASM_MEM_ALLOC_WITH_USAGE != 0 + mem_alloc_usage_t usage, +#endif #if WASM_MEM_ALLOC_WITH_USER_DATA != 0 void *user_data, #endif @@ -228,6 +244,7 @@ handle_module_path(const char *module_path) } static char *module_search_path = "."; + static bool module_reader_callback(package_type_t module_type, const char *module_name, uint8 **p_buffer, uint32 *p_size) @@ -283,6 +300,14 @@ main(int argc, char *argv[]) #else uint32 heap_size = 16 * 1024; #endif +#if WASM_ENABLE_SHARED_HEAP != 0 + SharedHeapInitArgs shared_heap_init_args; + uint32 shared_heap_size = 0; + void *shared_heap = NULL; +#endif +#if WASM_ENABLE_FAST_JIT != 0 + uint32 jit_code_cache_size = FAST_JIT_DEFAULT_CODE_CACHE_SIZE; +#endif #if WASM_ENABLE_GC != 0 uint32 gc_heap_size = GC_HEAP_SIZE_DEFAULT; #endif @@ -294,12 +319,16 @@ main(int argc, char *argv[]) wasm_module_inst_t wasm_module_inst = NULL; RunningMode running_mode = 0; RuntimeInitArgs init_args; + struct InstantiationArgs2 *inst_args; char error_buf[128] = { 0 }; #if WASM_ENABLE_LOG != 0 int log_verbose_level = 2; #endif bool is_repl_mode = false; bool is_xip_file = false; +#if WASM_CONFIGURABLE_BOUNDS_CHECKS != 0 + bool disable_bounds_checks = false; +#endif #if WASM_ENABLE_LIBC_WASI != 0 libc_wasi_parse_context_t wasi_parse_ctx; #endif @@ -351,6 +380,11 @@ main(int argc, char *argv[]) else if (!strcmp(argv[0], "--repl")) { is_repl_mode = true; } +#if WASM_CONFIGURABLE_BOUNDS_CHECKS != 0 + else if (!strcmp(argv[0], "--disable-bounds-checks")) { + disable_bounds_checks = true; + } +#endif else if (!strncmp(argv[0], "--stack-size=", 13)) { if (argv[0][13] == '\0') return print_help(); @@ -361,13 +395,6 @@ main(int argc, char *argv[]) return print_help(); heap_size = atoi(argv[0] + 12); } -#if WASM_ENABLE_GC != 0 - else if (!strncmp(argv[0], "--gc-heap-size=", 15)) { - if (argv[0][15] == '\0') - return print_help(); - gc_heap_size = atoi(argv[0] + 15); - } -#endif #if WASM_ENABLE_SHARED_HEAP != 0 else if (!strncmp(argv[0], "--shared-heap-size=", 19)) { if (argv[0][19] == '\0') @@ -375,6 +402,20 @@ main(int argc, char *argv[]) shared_heap_size = atoi(argv[0] + 19); } #endif +#if WASM_ENABLE_FAST_JIT != 0 + else if (!strncmp(argv[0], "--jit-codecache-size=", 21)) { + if (argv[0][21] == '\0') + return print_help(); + jit_code_cache_size = atoi(argv[0] + 21); + } +#endif +#if WASM_ENABLE_GC != 0 + else if (!strncmp(argv[0], "--gc-heap-size=", 15)) { + if (argv[0][15] == '\0') + return print_help(); + gc_heap_size = atoi(argv[0] + 15); + } +#endif #if WASM_ENABLE_JIT != 0 else if (!strncmp(argv[0], "--llvm-jit-size-level=", 22)) { if (argv[0][22] == '\0') @@ -408,7 +449,8 @@ main(int argc, char *argv[]) } #endif #if WASM_ENABLE_MULTI_MODULE != 0 - else if (!strncmp(argv[0], MODULE_PATH, strlen(MODULE_PATH))) { + else if (!strncmp(argv[0], + "--module-path=", strlen("--module-path="))) { module_search_path = handle_module_path(argv[0]); if (!strlen(module_search_path)) { return print_help(); @@ -440,6 +482,8 @@ main(int argc, char *argv[]) wasm_runtime_get_version(&major, &minor, &patch); printf("iwasm %" PRIu32 ".%" PRIu32 ".%" PRIu32 "\n", major, minor, patch); + printf("\n"); + wasm_proposal_print_status(); return 0; } else { @@ -485,6 +529,10 @@ main(int argc, char *argv[]) init_args.mem_alloc_option.allocator.free_func = free_func; #endif +#if WASM_ENABLE_FAST_JIT != 0 + init_args.fast_jit_code_cache_size = jit_code_cache_size; +#endif + #if WASM_ENABLE_GC != 0 init_args.gc_heap_size = gc_heap_size; #endif @@ -554,28 +602,27 @@ main(int argc, char *argv[]) libc_wasi_init(wasm_module, argc, argv, &wasi_parse_ctx); #endif + if (!wasm_runtime_instantiation_args_create(&inst_args)) { + printf("failed to create instantiate args\n"); + goto fail3; + } + wasm_runtime_instantiation_args_set_default_stack_size(inst_args, + stack_size); + wasm_runtime_instantiation_args_set_host_managed_heap_size(inst_args, + heap_size); + /* instantiate the module */ - if (!(wasm_module_inst = - wasm_runtime_instantiate(wasm_module, stack_size, heap_size, - error_buf, sizeof(error_buf)))) { + wasm_module_inst = wasm_runtime_instantiate_ex2( + wasm_module, inst_args, error_buf, sizeof(error_buf)); + wasm_runtime_instantiation_args_destroy(inst_args); + if (!wasm_module_inst) { printf("%s\n", error_buf); goto fail3; } -#if WASM_ENABLE_SHARED_HEAP != 0 - if (shared_heap_size > 0) { - memset(&shared_heap_init_args, 0, sizeof(shared_heap_init_args)); - shared_heap_init_args.size = shared_heap_size; - shared_heap = wasm_runtime_create_shared_heap(&shared_heap_init_args); - - if (!shared_heap) { - printf("Create shared heap failed.\n"); - goto fail5; - } - if (!wasm_runtime_attach_shared_heap(wasm_module_inst, shared_heap)) { - printf("Attach shared heap failed.\n"); - goto fail5; - } +#if WASM_CONFIGURABLE_BOUNDS_CHECKS != 0 + if (disable_bounds_checks) { + wasm_runtime_set_bounds_checks(wasm_module_inst, false); } #endif @@ -596,6 +643,25 @@ main(int argc, char *argv[]) } #endif +#if WASM_ENABLE_SHARED_HEAP != 0 + if (shared_heap_size > 0) { + memset(&shared_heap_init_args, 0, sizeof(shared_heap_init_args)); + shared_heap_init_args.size = shared_heap_size; + shared_heap = wasm_runtime_create_shared_heap(&shared_heap_init_args); + + if (!shared_heap) { + printf("Create preallocated shared heap failed\n"); + goto fail6; + } + + /* attach module instance to the shared heap */ + if (!wasm_runtime_attach_shared_heap(wasm_module_inst, shared_heap)) { + printf("Attach shared heap failed.\n"); + goto fail6; + } + } +#endif + ret = 0; const char *exception = NULL; if (is_repl_mode) { @@ -627,8 +693,11 @@ main(int argc, char *argv[]) printf("%s\n", exception); #if WASM_ENABLE_SHARED_HEAP != 0 -fail5: +fail6: #endif + + /* fail5: label is used by posix/main.c */ + #if WASM_ENABLE_DEBUG_INTERP != 0 fail4: #endif From e6fe6060e40b9e53ba98f1ad95432cd4730c4dbc Mon Sep 17 00:00:00 2001 From: Zhenwei Jin <109658203+kylo5aby@users.noreply.github.com> Date: Sun, 14 Sep 2025 14:08:27 +0800 Subject: [PATCH 066/103] add micro AMR_BUILD_LIME1 to enable minimal lime1 feature set (#4571) Signed-off-by: zhenweijin --- .../compilation_on_android_ubuntu.yml | 1 + build-scripts/config_common.cmake | 40 +++++++++++++++ core/config.h | 8 +++ core/iwasm/compilation/aot_compiler.c | 23 +++++++-- core/iwasm/compilation/aot_emit_memory.c | 6 ++- core/iwasm/compilation/aot_emit_memory.h | 2 + core/iwasm/compilation/aot_llvm.c | 12 ++++- core/iwasm/compilation/aot_llvm.h | 7 +++ core/iwasm/fast-jit/fe/jit_emit_memory.c | 2 + core/iwasm/fast-jit/fe/jit_emit_memory.h | 2 + core/iwasm/fast-jit/jit_frontend.c | 6 ++- core/iwasm/include/aot_comp_option.h | 3 ++ core/iwasm/interpreter/wasm_interp_classic.c | 10 ++-- core/iwasm/interpreter/wasm_interp_fast.c | 8 +-- core/iwasm/interpreter/wasm_loader.c | 49 ++++++++++++------- core/iwasm/interpreter/wasm_mini_loader.c | 18 +++++-- doc/build_wamr.md | 19 +++++++ doc/build_wasm_app.md | 5 ++ wamr-compiler/CMakeLists.txt | 2 + wamr-compiler/main.c | 31 ++++++++++++ 20 files changed, 217 insertions(+), 37 deletions(-) diff --git a/.github/workflows/compilation_on_android_ubuntu.yml b/.github/workflows/compilation_on_android_ubuntu.yml index 8a4a6aefef..01356dc66e 100644 --- a/.github/workflows/compilation_on_android_ubuntu.yml +++ b/.github/workflows/compilation_on_android_ubuntu.yml @@ -166,6 +166,7 @@ jobs: "-DWAMR_BUILD_MULTI_MEMORY=1", "-DWAMR_BUILD_SHARED=1", "-DWAMR_BUILD_EXTENDED_CONST_EXPR=1", + "-DWAMR_BUILD_LIME1=1 -DWAMR_BUILD_BULK_MEMORY=0 -DWAMR_BUILD_REF_TYPES=0 -DWAMR_BUILD_SIMD=0", ] os: [ubuntu-22.04] platform: [android, linux] diff --git a/build-scripts/config_common.cmake b/build-scripts/config_common.cmake index 838baab9da..52c6d94afa 100644 --- a/build-scripts/config_common.cmake +++ b/build-scripts/config_common.cmake @@ -221,6 +221,14 @@ if (NOT DEFINED WAMR_BUILD_BULK_MEMORY) set (WAMR_BUILD_BULK_MEMORY 1) endif () +if (NOT DEFINED WAMR_BUILD_BULK_MEMORY_OPT) + set (WAMR_BUILD_BULK_MEMORY_OPT 0) +endif () + +if (NOT DEFINED WAMR_BUILD_CALL_INDIRECT_OVERLONG) + set (WAMR_BUILD_CALL_INDIRECT_OVERLONG 0) +endif () + if (NOT DEFINED WAMR_BUILD_EXCE_HANDLING) set (WAMR_BUILD_EXCE_HANDLING 0) endif () @@ -253,10 +261,27 @@ if (NOT DEFINED WAMR_BUILD_EXTENDED_CONST_EXPR) set (WAMR_BUILD_EXTENDED_CONST_EXPR 0) endif () +if (NOT DEFINED WAMR_BUILD_LIME1) + set (WAMR_BUILD_LIME1 0) +endif () + ######################################## # Compilation options to marco ######################################## +if (WAMR_BUILD_LIME1 EQUAL 1) + set (WAMR_BUILD_BULK_MEMORY_OPT 1) + set (WAMR_BUILD_CALL_INDIRECT_OVERLONG 1) + set (WAMR_BUILD_EXTENDED_CONST_EXPR 1) +endif () + +if (WAMR_BUILD_BULK_MEMORY EQUAL 1) + set (WAMR_BUILD_BULK_MEMORY_OPT 1) +endif () +if (WAMR_BUILD_REF_TYPES EQUAL 1) + set (WAMR_BUILD_CALL_INDIRECT_OVERLONG 1) +endif () + message ("-- Build Configurations:") message (" Build as target ${WAMR_BUILD_TARGET}") message (" Build for platform ${WAMR_BUILD_PLATFORM}") @@ -366,6 +391,11 @@ if (WAMR_BUILD_BULK_MEMORY EQUAL 1) else () add_definitions (-DWASM_ENABLE_BULK_MEMORY=0) endif () +if (WAMR_BUILD_BULK_MEMORY_OPT EQUAL 1) + add_definitions (-DWASM_ENABLE_BULK_MEMORY_OPT=1) +else() + add_definitions (-DWASM_ENABLE_BULK_MEMORY_OPT=0) +endif () if (WAMR_BUILD_SHARED_MEMORY EQUAL 1) add_definitions (-DWASM_ENABLE_SHARED_MEMORY=1) message (" Shared memory enabled") @@ -457,6 +487,11 @@ endif () if (WAMR_BUILD_REF_TYPES EQUAL 1) add_definitions (-DWASM_ENABLE_REF_TYPES=1) endif () +if (WAMR_BUILD_CALL_INDIRECT_OVERLONG EQUAL 1) + add_definitions (-DWASM_ENABLE_CALL_INDIRECT_OVERLONG=1) +else () + add_definitions(-DWASM_ENABLE_CALL_INDIRECT_OVERLONG=0) +endif () if (WAMR_BUILD_GC EQUAL 1) if (WAMR_TEST_GC EQUAL 1) message(" GC testing enabled") @@ -727,6 +762,9 @@ else() message (" Extended constant expression disabled") add_definitions(-DWASM_ENABLE_EXTENDED_CONST_EXPR=0) endif () +if (WAMR_BUILD_LIME1 EQUAL 1) + message (" Lime1 enabled") +endif () ######################################## # Show Phase4 Wasm proposals status. ######################################## @@ -742,6 +780,8 @@ message ( " \"Branch Hinting\"\n" " Configurable. 0 is OFF. 1 is ON:\n" " \"Bulk Memory Operation\" via WAMR_BUILD_BULK_MEMORY: ${WAMR_BUILD_BULK_MEMORY}\n" +" \"Bulk-memory-opt\" via WAMR_BUILD_BULK_MEMORY_OPT: ${WAMR_BUILD_BULK_MEMORY_OPT}\n" +" \"Call-indirect-overlong\" via WAMR_BUILD_CALL_INDIRECT_OVERLONG: ${WAMR_BUILD_CALL_INDIRECT_OVERLONG}\n" " \"Extended Constant Expressions\" via WAMR_BUILD_EXTENDED_CONST_EXPR: ${WAMR_BUILD_EXTENDED_CONST_EXPR}\n" " \"Fixed-width SIMD\" via WAMR_BUILD_SIMD: ${WAMR_BUILD_SIMD}\n" " \"Garbage Collection\" via WAMR_BUILD_GC: ${WAMR_BUILD_GC}\n" diff --git a/core/config.h b/core/config.h index 060bb32594..cb5db1d0cf 100644 --- a/core/config.h +++ b/core/config.h @@ -214,6 +214,10 @@ #define WASM_ENABLE_BULK_MEMORY 0 #endif +#ifndef WASM_ENABLE_BULK_MEMORY_OPT +#define WASM_ENABLE_BULK_MEMORY_OPT 0 +#endif + /* Shared memory */ #ifndef WASM_ENABLE_SHARED_MEMORY #define WASM_ENABLE_SHARED_MEMORY 0 @@ -579,6 +583,10 @@ unless used elsewhere */ #define WASM_ENABLE_REF_TYPES 0 #endif +#ifndef WASM_ENABLE_CALL_INDIRECT_OVERLONG +#define WASM_ENABLE_CALL_INDIRECT_OVERLONG 0 +#endif + #ifndef WASM_ENABLE_BRANCH_HINTS #define WASM_ENABLE_BRANCH_HINTS 0 #endif diff --git a/core/iwasm/compilation/aot_compiler.c b/core/iwasm/compilation/aot_compiler.c index 60c772570c..29026e8008 100644 --- a/core/iwasm/compilation/aot_compiler.c +++ b/core/iwasm/compilation/aot_compiler.c @@ -1236,8 +1236,8 @@ aot_compile_func(AOTCompContext *comp_ctx, uint32 func_index) uint32 tbl_idx; read_leb_uint32(frame_ip, frame_ip_end, type_idx); - - if (comp_ctx->enable_gc || comp_ctx->enable_ref_types) { + if (comp_ctx->enable_gc + || comp_ctx->enable_call_indirect_overlong) { read_leb_uint32(frame_ip, frame_ip_end, tbl_idx); } else { @@ -2462,6 +2462,14 @@ aot_compile_func(AOTCompContext *comp_ctx, uint32 func_index) UINT8_MAX */ opcode = (uint8)opcode1; +#if WASM_ENABLE_BULK_MEMORY_OPT != 0 + if (WASM_OP_MEMORY_COPY <= opcode + && opcode <= WASM_OP_MEMORY_FILL + && !comp_ctx->enable_bulk_memory_opt) { + goto unsupport_bulk_memory_opt; + } +#endif + #if WASM_ENABLE_BULK_MEMORY != 0 if (WASM_OP_MEMORY_INIT <= opcode && opcode <= WASM_OP_MEMORY_FILL @@ -2530,6 +2538,8 @@ aot_compile_func(AOTCompContext *comp_ctx, uint32 func_index) return false; break; } +#endif /* WASM_ENABLE_BULK_MEMORY */ +#if WASM_ENABLE_BULK_MEMORY_OPT != 0 case WASM_OP_MEMORY_COPY: { frame_ip += 2; @@ -2544,7 +2554,7 @@ aot_compile_func(AOTCompContext *comp_ctx, uint32 func_index) return false; break; } -#endif /* WASM_ENABLE_BULK_MEMORY */ +#endif /* WASM_ENABLE_BULK_MEMORY_OPT */ #if WASM_ENABLE_REF_TYPES != 0 || WASM_ENABLE_GC != 0 case WASM_OP_TABLE_INIT: { @@ -3971,6 +3981,13 @@ aot_compile_func(AOTCompContext *comp_ctx, uint32 func_index) return false; #endif +#if WASM_ENABLE_BULK_MEMORY_OPT != 0 +unsupport_bulk_memory_opt: + aot_set_last_error("bulk memory opt instruction was found, " + "try enabling bulk-memory-opt or bulk-memory option"); + return false; +#endif + #if WASM_ENABLE_BULK_MEMORY != 0 unsupport_bulk_memory: aot_set_last_error("bulk memory instruction was found, " diff --git a/core/iwasm/compilation/aot_emit_memory.c b/core/iwasm/compilation/aot_emit_memory.c index 0659c2b408..0dec2ed365 100644 --- a/core/iwasm/compilation/aot_emit_memory.c +++ b/core/iwasm/compilation/aot_emit_memory.c @@ -1481,7 +1481,7 @@ aot_compile_op_memory_grow(AOTCompContext *comp_ctx, AOTFuncContext *func_ctx) return false; } -#if WASM_ENABLE_BULK_MEMORY != 0 || WASM_ENABLE_STRINGREF != 0 +#if WASM_ENABLE_BULK_MEMORY_OPT != 0 || WASM_ENABLE_STRINGREF != 0 LLVMValueRef check_bulk_memory_overflow(AOTCompContext *comp_ctx, AOTFuncContext *func_ctx, LLVMValueRef offset, LLVMValueRef bytes) @@ -1769,7 +1769,9 @@ aot_compile_op_data_drop(AOTCompContext *comp_ctx, AOTFuncContext *func_ctx, fail: return false; } +#endif /* end of WASM_ENABLE_BULK_MEMORY */ +#if WASM_ENABLE_BULK_MEMORY_OPT != 0 bool aot_compile_op_memory_copy(AOTCompContext *comp_ctx, AOTFuncContext *func_ctx) { @@ -1931,7 +1933,7 @@ aot_compile_op_memory_fill(AOTCompContext *comp_ctx, AOTFuncContext *func_ctx) fail: return false; } -#endif /* end of WASM_ENABLE_BULK_MEMORY */ +#endif /* end of WASM_ENABLE_BULK_MEMORY_OPT */ #if WASM_ENABLE_SHARED_MEMORY != 0 bool diff --git a/core/iwasm/compilation/aot_emit_memory.h b/core/iwasm/compilation/aot_emit_memory.h index 1eb95993cb..5b87377beb 100644 --- a/core/iwasm/compilation/aot_emit_memory.h +++ b/core/iwasm/compilation/aot_emit_memory.h @@ -78,7 +78,9 @@ aot_compile_op_memory_init(AOTCompContext *comp_ctx, AOTFuncContext *func_ctx, bool aot_compile_op_data_drop(AOTCompContext *comp_ctx, AOTFuncContext *func_ctx, uint32 seg_index); +#endif +#if WASM_ENABLE_BULK_MEMORY_OPT != 0 bool aot_compile_op_memory_copy(AOTCompContext *comp_ctx, AOTFuncContext *func_ctx); diff --git a/core/iwasm/compilation/aot_llvm.c b/core/iwasm/compilation/aot_llvm.c index ed36749be4..ab351e6d44 100644 --- a/core/iwasm/compilation/aot_llvm.c +++ b/core/iwasm/compilation/aot_llvm.c @@ -2731,6 +2731,9 @@ aot_create_comp_context(const AOTCompData *comp_data, aot_comp_option_t option) if (option->enable_bulk_memory) comp_ctx->enable_bulk_memory = true; + if (option->enable_bulk_memory_opt) + comp_ctx->enable_bulk_memory_opt = true; + if (option->enable_thread_mgr) comp_ctx->enable_thread_mgr = true; @@ -2740,6 +2743,9 @@ aot_create_comp_context(const AOTCompData *comp_data, aot_comp_option_t option) if (option->enable_ref_types) comp_ctx->enable_ref_types = true; + if (option->enable_call_indirect_overlong) + comp_ctx->enable_call_indirect_overlong = true; + comp_ctx->aux_stack_frame_type = option->aux_stack_frame_type; comp_ctx->call_stack_features = option->call_stack_features; @@ -3324,7 +3330,7 @@ aot_create_comp_context(const AOTCompData *comp_data, aot_comp_option_t option) /* Return error if ref-types and GC are disabled by command line but ref-types instructions are used */ - if (!option->enable_ref_types && !option->enable_gc + if (!option->enable_call_indirect_overlong && !option->enable_gc && wasm_module->is_ref_types_used) { aot_set_last_error("ref-types instruction was found, " "try removing --disable-ref-types option " @@ -3338,9 +3344,13 @@ aot_create_comp_context(const AOTCompData *comp_data, aot_comp_option_t option) } if (!wasm_module->is_ref_types_used) { option->enable_ref_types = comp_ctx->enable_ref_types = false; + option->enable_call_indirect_overlong = + comp_ctx->enable_call_indirect_overlong = false; } if (!wasm_module->is_bulk_memory_used) { option->enable_bulk_memory = comp_ctx->enable_bulk_memory = false; + option->enable_bulk_memory_opt = comp_ctx->enable_bulk_memory_opt = + false; } #endif diff --git a/core/iwasm/compilation/aot_llvm.h b/core/iwasm/compilation/aot_llvm.h index a83fddb49a..5bd75a38ce 100644 --- a/core/iwasm/compilation/aot_llvm.h +++ b/core/iwasm/compilation/aot_llvm.h @@ -416,6 +416,10 @@ typedef struct AOTCompContext { /* Bulk memory feature */ bool enable_bulk_memory; + /* Bulk memory opt feature. will be enabled alongside the + * enable_bulk_memory */ + bool enable_bulk_memory_opt; + /* Boundary Check */ bool enable_bound_check; @@ -452,6 +456,9 @@ typedef struct AOTCompContext { /* Reference Types */ bool enable_ref_types; + /* Call Indirect Overlong. will be enabled alongside the enable_ref_types */ + bool enable_call_indirect_overlong; + /* Disable LLVM built-in intrinsics */ bool disable_llvm_intrinsics; diff --git a/core/iwasm/fast-jit/fe/jit_emit_memory.c b/core/iwasm/fast-jit/fe/jit_emit_memory.c index bbe82cf674..07269a6551 100644 --- a/core/iwasm/fast-jit/fe/jit_emit_memory.c +++ b/core/iwasm/fast-jit/fe/jit_emit_memory.c @@ -713,7 +713,9 @@ jit_compile_op_data_drop(JitCompContext *cc, uint32 seg_idx) return jit_emit_callnative(cc, wasm_data_drop, 0, args, sizeof(args) / sizeof(args[0])); } +#endif +#if WASM_ENABLE_BULK_MEMORY_OPT != 0 static int wasm_copy_memory(WASMModuleInstance *inst, uint32 src_mem_idx, uint32 dst_mem_idx, uint32 len, uint32 src_offset, diff --git a/core/iwasm/fast-jit/fe/jit_emit_memory.h b/core/iwasm/fast-jit/fe/jit_emit_memory.h index 6565cdc11b..2fdacccf52 100644 --- a/core/iwasm/fast-jit/fe/jit_emit_memory.h +++ b/core/iwasm/fast-jit/fe/jit_emit_memory.h @@ -55,7 +55,9 @@ jit_compile_op_memory_init(JitCompContext *cc, uint32 mem_idx, uint32 seg_idx); bool jit_compile_op_data_drop(JitCompContext *cc, uint32 seg_idx); +#endif +#if WASM_ENABLE_BULK_MEMORY_OPT != 0 bool jit_compile_op_memory_copy(JitCompContext *cc, uint32 src_mem_idx, uint32 dst_mem_idx); diff --git a/core/iwasm/fast-jit/jit_frontend.c b/core/iwasm/fast-jit/jit_frontend.c index 566783b6f6..c96b5410ba 100644 --- a/core/iwasm/fast-jit/jit_frontend.c +++ b/core/iwasm/fast-jit/jit_frontend.c @@ -1627,7 +1627,7 @@ jit_compile_func(JitCompContext *cc) read_leb_uint32(frame_ip, frame_ip_end, type_idx); -#if WASM_ENABLE_REF_TYPES != 0 +#if WASM_ENABLE_CALL_INDIRECT_OVERLONG != 0 read_leb_uint32(frame_ip, frame_ip_end, tbl_idx); #else frame_ip++; @@ -2336,6 +2336,8 @@ jit_compile_func(JitCompContext *cc) return false; break; } +#endif /* WASM_ENABLE_BULK_MEMORY */ +#if WASM_ENABLE_BULK_MEMORY_OPT != 0 case WASM_OP_MEMORY_COPY: { uint32 src_mem_idx, dst_mem_idx; @@ -2353,7 +2355,7 @@ jit_compile_func(JitCompContext *cc) return false; break; } -#endif /* WASM_ENABLE_BULK_MEMORY */ +#endif /* WASM_ENABLE_BULK_MEMORY_OPT */ #if WASM_ENABLE_REF_TYPES != 0 case WASM_OP_TABLE_INIT: { diff --git a/core/iwasm/include/aot_comp_option.h b/core/iwasm/include/aot_comp_option.h index 069ceab319..9a9023ee2e 100644 --- a/core/iwasm/include/aot_comp_option.h +++ b/core/iwasm/include/aot_comp_option.h @@ -62,13 +62,16 @@ typedef struct AOTCompOption { char *cpu_features; bool is_sgx_platform; bool enable_bulk_memory; + bool enable_bulk_memory_opt; bool enable_thread_mgr; bool enable_tail_call; bool enable_simd; bool enable_ref_types; + bool enable_call_indirect_overlong; bool enable_gc; bool enable_aux_stack_check; bool enable_extended_const; + bool enable_lime1; AOTStackFrameType aux_stack_frame_type; AOTCallStackFeatures call_stack_features; bool enable_perf_profiling; diff --git a/core/iwasm/interpreter/wasm_interp_classic.c b/core/iwasm/interpreter/wasm_interp_classic.c index 8f5f1821ae..9ba3a5f4f0 100644 --- a/core/iwasm/interpreter/wasm_interp_classic.c +++ b/core/iwasm/interpreter/wasm_interp_classic.c @@ -1567,7 +1567,7 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module, WASMMemoryInstance *memory = wasm_get_default_memory(module); #if !defined(OS_ENABLE_HW_BOUND_CHECK) \ || WASM_CPU_SUPPORTS_UNALIGNED_ADDR_ACCESS == 0 \ - || WASM_ENABLE_BULK_MEMORY != 0 + || WASM_ENABLE_BULK_MEMORY_OPT != 0 uint64 linear_mem_size = 0; if (memory) #if WASM_ENABLE_THREAD_MGR == 0 @@ -2370,7 +2370,7 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module, cur_type = wasm_types[tidx]; /* clang-format off */ -#if WASM_ENABLE_REF_TYPES != 0 || WASM_ENABLE_GC != 0 +#if WASM_ENABLE_CALL_INDIRECT_OVERLONG != 0 || WASM_ENABLE_GC != 0 read_leb_uint32(frame_ip, frame_ip_end, tbl_idx); #else frame_ip++; @@ -5774,6 +5774,8 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module, segment); break; } +#endif /* WASM_ENABLE_BULK_MEMORY */ +#if WASM_ENABLE_BULK_MEMORY_OPT != 0 case WASM_OP_MEMORY_COPY: { mem_offset_t dst, src, len; @@ -5894,7 +5896,7 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module, memset(mdst, fill_val, len); break; } -#endif /* WASM_ENABLE_BULK_MEMORY */ +#endif /* WASM_ENABLE_BULK_MEMORY_OPT */ #if WASM_ENABLE_REF_TYPES != 0 || WASM_ENABLE_GC != 0 case WASM_OP_TABLE_INIT: { @@ -6879,7 +6881,7 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module, #if !defined(OS_ENABLE_HW_BOUND_CHECK) \ || WASM_CPU_SUPPORTS_UNALIGNED_ADDR_ACCESS == 0 \ - || WASM_ENABLE_BULK_MEMORY != 0 + || WASM_ENABLE_BULK_MEMORY_OPT != 0 out_of_bounds: wasm_set_exception(module, "out of bounds memory access"); #endif diff --git a/core/iwasm/interpreter/wasm_interp_fast.c b/core/iwasm/interpreter/wasm_interp_fast.c index 5cbb3cbe9a..a326018efc 100644 --- a/core/iwasm/interpreter/wasm_interp_fast.c +++ b/core/iwasm/interpreter/wasm_interp_fast.c @@ -1501,7 +1501,7 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module, WASMMemoryInstance *memory = wasm_get_default_memory(module); #if !defined(OS_ENABLE_HW_BOUND_CHECK) \ || WASM_CPU_SUPPORTS_UNALIGNED_ADDR_ACCESS == 0 \ - || WASM_ENABLE_BULK_MEMORY != 0 + || WASM_ENABLE_BULK_MEMORY_OPT != 0 uint64 linear_mem_size = 0; if (memory) #if WASM_ENABLE_THREAD_MGR == 0 @@ -5200,6 +5200,8 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module, segment); break; } +#endif /* WASM_ENABLE_BULK_MEMORY */ +#if WASM_ENABLE_BULK_MEMORY_OPT != 0 case WASM_OP_MEMORY_COPY: { uint32 dst, src, len; @@ -5290,7 +5292,7 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module, memset(mdst, fill_val, len); break; } -#endif /* WASM_ENABLE_BULK_MEMORY */ +#endif /* WASM_ENABLE_BULK_MEMORY_OPT */ #if WASM_ENABLE_REF_TYPES != 0 || WASM_ENABLE_GC != 0 case WASM_OP_TABLE_INIT: { @@ -7805,7 +7807,7 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module, #if !defined(OS_ENABLE_HW_BOUND_CHECK) \ || WASM_CPU_SUPPORTS_UNALIGNED_ADDR_ACCESS == 0 \ - || WASM_ENABLE_BULK_MEMORY != 0 + || WASM_ENABLE_BULK_MEMORY_OPT != 0 out_of_bounds: wasm_set_exception(module, "out of bounds memory access"); #endif diff --git a/core/iwasm/interpreter/wasm_loader.c b/core/iwasm/interpreter/wasm_loader.c index 2346b29527..19ca249496 100644 --- a/core/iwasm/interpreter/wasm_loader.c +++ b/core/iwasm/interpreter/wasm_loader.c @@ -5869,6 +5869,9 @@ init_llvm_jit_functions_stage1(WASMModule *module, char *error_buf, #if WASM_ENABLE_BULK_MEMORY != 0 option.enable_bulk_memory = true; #endif +#if WASM_ENABLE_BULK_MEMORY_OPT != 0 + option.enable_bulk_memory_opt = true; +#endif #if WASM_ENABLE_THREAD_MGR != 0 option.enable_thread_mgr = true; #endif @@ -5882,6 +5885,9 @@ init_llvm_jit_functions_stage1(WASMModule *module, char *error_buf, option.enable_ref_types = true; #elif WASM_ENABLE_GC != 0 option.enable_gc = true; +#endif +#if WASM_ENABLE_CALL_INDIRECT_OVERLONG != 0 + option.enable_call_indirect_overlong = true; #endif option.enable_aux_stack_check = true; #if WASM_ENABLE_PERF_PROFILING != 0 || WASM_ENABLE_DUMP_CALL_STACK != 0 \ @@ -7739,7 +7745,7 @@ wasm_loader_find_block_addr(WASMExecEnv *exec_env, BlockAddr *block_addr_cache, case WASM_OP_RETURN_CALL_INDIRECT: #endif skip_leb_uint32(p, p_end); /* typeidx */ -#if WASM_ENABLE_REF_TYPES != 0 || WASM_ENABLE_GC != 0 +#if WASM_ENABLE_CALL_INDIRECT_OVERLONG != 0 || WASM_ENABLE_GC != 0 skip_leb_uint32(p, p_end); /* tableidx */ #else u8 = read_uint8(p); /* 0x00 */ @@ -8164,6 +8170,8 @@ wasm_loader_find_block_addr(WASMExecEnv *exec_env, BlockAddr *block_addr_cache, case WASM_OP_DATA_DROP: skip_leb_uint32(p, p_end); break; +#endif /* WASM_ENABLE_BULK_MEMORY */ +#if WASM_ENABLE_BULK_MEMORY_OPT != 0 case WASM_OP_MEMORY_COPY: skip_leb_memidx(p, p_end); skip_leb_memidx(p, p_end); @@ -8171,7 +8179,7 @@ wasm_loader_find_block_addr(WASMExecEnv *exec_env, BlockAddr *block_addr_cache, case WASM_OP_MEMORY_FILL: skip_leb_memidx(p, p_end); break; -#endif /* WASM_ENABLE_BULK_MEMORY */ +#endif /* WASM_ENABLE_BULK_MEMORY_OPT */ #if WASM_ENABLE_REF_TYPES != 0 case WASM_OP_TABLE_INIT: case WASM_OP_TABLE_COPY: @@ -12987,7 +12995,7 @@ wasm_loader_prepare_bytecode(WASMModule *module, WASMFunction *func, #endif pb_read_leb_uint32(p, p_end, type_idx); -#if WASM_ENABLE_REF_TYPES != 0 || WASM_ENABLE_GC != 0 +#if WASM_ENABLE_CALL_INDIRECT_OVERLONG != 0 || WASM_ENABLE_GC != 0 #if WASM_ENABLE_WAMR_COMPILER != 0 if (p + 1 < p_end && *p != 0x00) { /* @@ -15673,8 +15681,11 @@ wasm_loader_prepare_bytecode(WASMModule *module, WASMFunction *func, emit_uint32(loader_ctx, data_seg_idx); #endif if (module->import_memory_count == 0 - && module->memory_count == 0) - goto fail_unknown_memory; + && module->memory_count == 0) { + set_error_buf(error_buf, error_buf_size, + "unknown memory 0"); + goto fail; + } pb_read_leb_uint32(p, p_end, memidx); check_memidx(module, memidx); @@ -15723,6 +15734,12 @@ wasm_loader_prepare_bytecode(WASMModule *module, WASMFunction *func, #endif break; } + fail_data_cnt_sec_require: + set_error_buf(error_buf, error_buf_size, + "data count section required"); + goto fail; +#endif /* WASM_ENABLE_BULK_MEMORY */ +#if WASM_ENABLE_BULK_MEMORY_OPT != 0 case WASM_OP_MEMORY_COPY: { CHECK_BUF(p, p_end, sizeof(int16)); @@ -15733,8 +15750,11 @@ wasm_loader_prepare_bytecode(WASMModule *module, WASMFunction *func, check_memidx(module, memidx); if (module->import_memory_count == 0 - && module->memory_count == 0) - goto fail_unknown_memory; + && module->memory_count == 0) { + set_error_buf(error_buf, error_buf_size, + "unknown memory 0"); + goto fail; + } POP_MEM_OFFSET(); POP_MEM_OFFSET(); @@ -15753,7 +15773,9 @@ wasm_loader_prepare_bytecode(WASMModule *module, WASMFunction *func, check_memidx(module, memidx); if (module->import_memory_count == 0 && module->memory_count == 0) { - goto fail_unknown_memory; + set_error_buf(error_buf, error_buf_size, + "unknown memory 0"); + goto fail; } POP_MEM_OFFSET(); POP_I32(); @@ -15766,16 +15788,7 @@ wasm_loader_prepare_bytecode(WASMModule *module, WASMFunction *func, #endif break; } - - fail_unknown_memory: - set_error_buf(error_buf, error_buf_size, - "unknown memory 0"); - goto fail; - fail_data_cnt_sec_require: - set_error_buf(error_buf, error_buf_size, - "data count section required"); - goto fail; -#endif /* WASM_ENABLE_BULK_MEMORY */ +#endif /* WASM_ENABLE_BULK_MEMORY_OPT */ #if WASM_ENABLE_REF_TYPES != 0 || WASM_ENABLE_GC != 0 case WASM_OP_TABLE_INIT: { diff --git a/core/iwasm/interpreter/wasm_mini_loader.c b/core/iwasm/interpreter/wasm_mini_loader.c index 6fff2fa17f..b9dcc9877a 100644 --- a/core/iwasm/interpreter/wasm_mini_loader.c +++ b/core/iwasm/interpreter/wasm_mini_loader.c @@ -2388,6 +2388,9 @@ init_llvm_jit_functions_stage1(WASMModule *module, char *error_buf, #if WASM_ENABLE_BULK_MEMORY != 0 option.enable_bulk_memory = true; #endif +#if WASM_ENABLE_BULK_MEMORY_OPT != 0 + option.enable_bulk_memory_opt = true; +#endif #if WASM_ENABLE_THREAD_MGR != 0 option.enable_thread_mgr = true; #endif @@ -2399,6 +2402,9 @@ init_llvm_jit_functions_stage1(WASMModule *module, char *error_buf, #endif #if WASM_ENABLE_REF_TYPES != 0 option.enable_ref_types = true; +#endif +#if WASM_ENABLE_CALL_INDIRECT_OVERLONG != 0 + option.enable_call_indirect_overlong = true; #endif option.enable_aux_stack_check = true; #if WASM_ENABLE_PERF_PROFILING != 0 || WASM_ENABLE_DUMP_CALL_STACK != 0 \ @@ -3849,7 +3855,7 @@ wasm_loader_find_block_addr(WASMExecEnv *exec_env, BlockAddr *block_addr_cache, case WASM_OP_RETURN_CALL_INDIRECT: #endif skip_leb_uint32(p, p_end); /* typeidx */ -#if WASM_ENABLE_REF_TYPES != 0 +#if WASM_ENABLE_CALL_INDIRECT_OVERLONG != 0 skip_leb_uint32(p, p_end); /* tableidx */ #else u8 = read_uint8(p); /* 0x00 */ @@ -4111,6 +4117,8 @@ wasm_loader_find_block_addr(WASMExecEnv *exec_env, BlockAddr *block_addr_cache, case WASM_OP_DATA_DROP: skip_leb_uint32(p, p_end); break; +#endif +#if WASM_ENABLE_BULK_MEMORY_OPT != 0 case WASM_OP_MEMORY_COPY: skip_leb_memidx(p, p_end); skip_leb_memidx(p, p_end); @@ -4118,7 +4126,7 @@ wasm_loader_find_block_addr(WASMExecEnv *exec_env, BlockAddr *block_addr_cache, case WASM_OP_MEMORY_FILL: skip_leb_memidx(p, p_end); break; -#endif +#endif /* WASM_ENABLE_BULK_MEMORY_OPT */ #if WASM_ENABLE_REF_TYPES != 0 case WASM_OP_TABLE_INIT: case WASM_OP_TABLE_COPY: @@ -7069,7 +7077,7 @@ wasm_loader_prepare_bytecode(WASMModule *module, WASMFunction *func, pb_read_leb_uint32(p, p_end, type_idx); -#if WASM_ENABLE_REF_TYPES != 0 +#if WASM_ENABLE_CALL_INDIRECT_OVERLONG != 0 pb_read_leb_uint32(p, p_end, table_idx); #else CHECK_BUF(p, p_end, 1); @@ -8274,6 +8282,8 @@ wasm_loader_prepare_bytecode(WASMModule *module, WASMFunction *func, #endif break; } +#endif /* WASM_ENABLE_BULK_MEMORY */ +#if WASM_ENABLE_BULK_MEMORY_OPT != 0 case WASM_OP_MEMORY_COPY: { CHECK_MEMORY(); @@ -8306,7 +8316,7 @@ wasm_loader_prepare_bytecode(WASMModule *module, WASMFunction *func, #endif break; } -#endif /* WASM_ENABLE_BULK_MEMORY */ +#endif /* WASM_ENABLE_BULK_MEMORY_OPT */ #if WASM_ENABLE_REF_TYPES != 0 case WASM_OP_TABLE_INIT: { diff --git a/doc/build_wamr.md b/doc/build_wamr.md index 6d4e60741a..798c792643 100644 --- a/doc/build_wamr.md +++ b/doc/build_wamr.md @@ -297,6 +297,18 @@ Currently we only profile the memory consumption of module, module_instance and - **WAMR_BUILD_EXTENDED_CONST_EXPR**=1/0, default to disable if not set. > Note: See [Extended Constant Expressions](https://github.com/WebAssembly/extended-const/blob/main/proposals/extended-const/Overview.md) for more details. +### **Enable bulk-memory-opt** +- **WAMR_BUILD_BULK_MEMORY_OPT**=1/0, default to disable if not set. +> Note: See [bulk-memory-opt](https://github.com/WebAssembly/tool-conventions/blob/main/Lime.md#bulk-memory-opt) for more details. + +### **Enable call-indirect-overlong** +- **WAMR_BUILD_CALL_INDIRECT_OVERLONG**=1/0, default to disable if not set. +> Note: See [call-indirect-overlong](https://github.com/WebAssembly/tool-conventions/blob/main/Lime.md#call-indirect-overlong) for more details. + +### **Enable Lime1 target** +- **WAMR_BUILD_LIME1**=1/0, default to disable if not set. +> Note: See [Lime1](https://github.com/WebAssembly/tool-conventions/blob/main/Lime.md#lime1) for more details. + ### **Configurable memory access boundary check** - **WAMR_CONFIGURABLE_BOUNDS_CHECKS**=1/0, default to disable if not set > Note: If it is enabled, allow to run `iwasm --disable-bounds-checks` to disable the memory access boundary checks for interpreter mode. @@ -366,3 +378,10 @@ For Valgrind, begin with the following configurations and add additional ones as -DWAMR_DISABLE_WRITE_GS_BASE=0 #... ``` + +To enable the minimal Lime1 feature set, we need to disable some features that are on by default, such as +bulk memory and reference types: + +```Bash +cmake .. -DWAMR_BUILD_LIME1=1 -DWAMR_BUILD_BULK_MEMORY=0 -DWAMR_BUILD_REF_TYPES=0 -DDWAMR_BUILD_SIMD=0 +``` diff --git a/doc/build_wasm_app.md b/doc/build_wasm_app.md index 3c4b519b64..648d21534a 100644 --- a/doc/build_wasm_app.md +++ b/doc/build_wasm_app.md @@ -355,6 +355,8 @@ Usage: wamrc [options] -o output_file wasm_file llvmir-unopt Unoptimized LLVM IR llvmir-opt Optimized LLVM IR --disable-bulk-memory Disable the MVP bulk memory feature + --enable-bulk-memory-opt Enable bulk memory opt feature + --enable-extended-const Enable extended const expr feature --enable-multi-thread Enable multi-thread feature, the dependent features bulk-memory and thread-mgr will be enabled automatically --enable-tail-call Enable the post-MVP tail call feature @@ -363,6 +365,9 @@ Usage: wamrc [options] -o output_file wasm_file and by default it is enabled in x86-64 target and disabled in other targets --disable-ref-types Disable the MVP reference types feature + --enable-call-indirect-overlong + Enable call indirect overlong feature + --enable-lime1 Enable Lime1 --disable-aux-stack-check Disable auxiliary stack overflow/underflow check --enable-dump-call-stack Enable stack trace feature --enable-perf-profiling Enable function performance profiling diff --git a/wamr-compiler/CMakeLists.txt b/wamr-compiler/CMakeLists.txt index c01c4fd0f6..513fd0049c 100644 --- a/wamr-compiler/CMakeLists.txt +++ b/wamr-compiler/CMakeLists.txt @@ -41,11 +41,13 @@ endif() add_definitions(-DWASM_ENABLE_INTERP=1) add_definitions(-DWASM_ENABLE_WAMR_COMPILER=1) add_definitions(-DWASM_ENABLE_BULK_MEMORY=1) +add_definitions(-DWASM_ENABLE_BULK_MEMORY_OPT=1) add_definitions(-DWASM_DISABLE_HW_BOUND_CHECK=1) add_definitions(-DWASM_ENABLE_SHARED_MEMORY=1) add_definitions(-DWASM_ENABLE_THREAD_MGR=1) add_definitions(-DWASM_ENABLE_TAIL_CALL=1) add_definitions(-DWASM_ENABLE_REF_TYPES=1) +add_definitions(-DWASM_ENABLE_CALL_INDIRECT_OVERLONG=1) add_definitions(-DWASM_ENABLE_BRANCH_HINTS=1) add_definitions(-DWASM_ENABLE_CUSTOM_NAME_SECTION=1) add_definitions(-DWASM_ENABLE_AOT_STACK_FRAME=1) diff --git a/wamr-compiler/main.c b/wamr-compiler/main.c index 2ca9a175db..f0675a3511 100644 --- a/wamr-compiler/main.c +++ b/wamr-compiler/main.c @@ -159,6 +159,8 @@ print_help() printf(" llvmir-unopt Unoptimized LLVM IR\n"); printf(" llvmir-opt Optimized LLVM IR\n"); printf(" --disable-bulk-memory Disable the MVP bulk memory feature\n"); + printf(" --enable-bulk-memory-opt Enable bulk memory opt feature\n"); + printf(" --enable-extended-const Enable extended const expr feature\n"); printf(" --enable-multi-thread Enable multi-thread feature, the dependent features bulk-memory and\n"); printf(" thread-mgr will be enabled automatically\n"); printf(" --enable-tail-call Enable the post-MVP tail call feature\n"); @@ -167,6 +169,9 @@ print_help() printf(" and by default it is enabled in them and disabled in other targets\n"); printf(" --disable-ref-types Disable the MVP reference types feature, it will be disabled forcibly if\n"); printf(" GC is enabled\n"); + printf(" --enable-call-indirect-overlong\n"); + printf(" Enable call indirect overlong feature\n"); + printf(" --enable-lime1 Enable Lime1\n"); printf(" --disable-aux-stack-check Disable auxiliary stack overflow/underflow check\n"); printf(" --enable-dump-call-stack Enable stack trace feature\n"); printf(" --call-stack-features=\n"); @@ -423,9 +428,12 @@ main(int argc, char *argv[]) option.enable_simd = true; option.enable_aux_stack_check = true; option.enable_bulk_memory = true; + option.enable_bulk_memory_opt = false; option.enable_ref_types = true; + option.enable_call_indirect_overlong = false; option.enable_gc = false; option.enable_extended_const = false; + option.enable_lime1 = false; aot_call_stack_features_init_default(&option.call_stack_features); /* Process options */ @@ -519,6 +527,9 @@ main(int argc, char *argv[]) else if (!strcmp(argv[0], "--disable-bulk-memory")) { option.enable_bulk_memory = false; } + else if (!strcmp(argv[0], "--enable-bulk-memory-opt")) { + option.enable_bulk_memory_opt = true; + } else if (!strcmp(argv[0], "--enable-multi-thread")) { option.enable_bulk_memory = true; option.enable_thread_mgr = true; @@ -536,12 +547,18 @@ main(int argc, char *argv[]) else if (!strcmp(argv[0], "--disable-ref-types")) { option.enable_ref_types = false; } + else if (!strcmp(argv[0], "--enable-call-indirect-overlong")) { + option.enable_call_indirect_overlong = true; + } else if (!strcmp(argv[0], "--disable-aux-stack-check")) { option.enable_aux_stack_check = false; } else if (!strcmp(argv[0], "--enable-extended-const")) { option.enable_extended_const = true; } + else if (!strcmp(argv[0], "--enable-lime1")) { + option.enable_lime1 = true; + } else if (!strcmp(argv[0], "--enable-dump-call-stack")) { option.aux_stack_frame_type = AOT_STACK_FRAME_TYPE_STANDARD; } @@ -747,6 +764,20 @@ main(int argc, char *argv[]) option.bounds_checks = true; } + if (option.enable_bulk_memory) { + option.enable_bulk_memory_opt = true; + } + + if (option.enable_ref_types) { + option.enable_call_indirect_overlong = true; + } + + if (option.enable_lime1) { + option.enable_call_indirect_overlong = true; + option.enable_bulk_memory_opt = true; + option.enable_extended_const = true; + } + if (!use_dummy_wasm) { wasm_file_name = argv[0]; From 95f506a6e77d3ac7588eac7263f95558edfa7f3b Mon Sep 17 00:00:00 2001 From: Liu Jia Date: Mon, 15 Sep 2025 15:19:51 +0800 Subject: [PATCH 067/103] Merge commit from fork * fix overflow in check_bulk_memory_overflow * add comment --- core/iwasm/compilation/aot_emit_memory.c | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/core/iwasm/compilation/aot_emit_memory.c b/core/iwasm/compilation/aot_emit_memory.c index 0dec2ed365..f5bd859df1 100644 --- a/core/iwasm/compilation/aot_emit_memory.c +++ b/core/iwasm/compilation/aot_emit_memory.c @@ -1486,7 +1486,7 @@ LLVMValueRef check_bulk_memory_overflow(AOTCompContext *comp_ctx, AOTFuncContext *func_ctx, LLVMValueRef offset, LLVMValueRef bytes) { - LLVMValueRef maddr, max_addr, cmp, cmp1; + LLVMValueRef maddr, max_addr, cmp, cmp1, offset1; LLVMValueRef mem_base_addr; LLVMBasicBlockRef block_curr = LLVMGetInsertBlock(comp_ctx->builder); LLVMBasicBlockRef check_succ; @@ -1539,8 +1539,18 @@ check_bulk_memory_overflow(AOTCompContext *comp_ctx, AOTFuncContext *func_ctx, if (mem_data_size > 0 && mem_offset + mem_len <= mem_data_size) { /* inside memory space */ /* maddr = mem_base_addr + moffset */ + /* Perform zero extension in advance to avoid LLVMBuildInBoundsGEP2 + * interpreting a negative address due to sign extension when + * mem_offset >= 2GiB */ + if (comp_ctx->pointer_size == sizeof(uint64)) { + offset1 = I64_CONST(mem_offset); + } + else { + offset1 = I32_CONST((uint32)mem_offset); + } + CHECK_LLVM_CONST(offset1); if (!(maddr = LLVMBuildInBoundsGEP2(comp_ctx->builder, INT8_TYPE, - mem_base_addr, &offset, 1, + mem_base_addr, &offset1, 1, "maddr"))) { aot_set_last_error("llvm build add failed."); goto fail; From a6a9f1f45d9f7ebf044ceac71bcf7a9ea2f90f23 Mon Sep 17 00:00:00 2001 From: YAMAMOTO Takashi Date: Thu, 18 Sep 2025 08:30:34 +0900 Subject: [PATCH 068/103] CI: use windows-2022 image for now (#4633) github is currently rolling out windows-2025 image. for some reasons, the "path_symlink_trailing_slashes" test case in wasi testsuite fails on windows-2025 image. someone familar with windows need to investigate what was the key difference between 2022 and 2025. until that happens, this commit makes our CI use windows-2022 image. cf. https://github.com/bytecodealliance/wasm-micro-runtime/issues/4632 https://github.com/actions/runner-images/issues/12677 --- .github/workflows/build_iwasm_release.yml | 4 ++-- .github/workflows/build_llvm_libraries.yml | 4 ++-- .github/workflows/build_wamrc.yml | 4 ++-- .github/workflows/compilation_on_windows.yml | 10 +++++----- .github/workflows/release_process.yml | 6 +++--- 5 files changed, 14 insertions(+), 14 deletions(-) diff --git a/.github/workflows/build_iwasm_release.yml b/.github/workflows/build_iwasm_release.yml index 7be7db524f..0ecd48bf1c 100644 --- a/.github/workflows/build_iwasm_release.yml +++ b/.github/workflows/build_iwasm_release.yml @@ -151,7 +151,7 @@ jobs: working-directory: ${{ inputs.cwd }} - name: Compress the binary on Windows - if: inputs.runner == 'windows-latest' + if: inputs.runner == 'windows-2022' run: | tar -czf iwasm${{ matrix.suffix }}-${{ inputs.ver_num }}-${{ inputs.runner }}.tar.gz iwasm.exe Compress-Archive -Path iwasm.exe -DestinationPath iwasm${{ matrix.suffix }}-${{ inputs.ver_num }}-${{ inputs.runner }}.zip @@ -159,7 +159,7 @@ jobs: working-directory: ${{ inputs.cwd }}/build/Release - name: compress the binary on non-Windows - if: inputs.runner != 'windows-latest' + if: inputs.runner != 'windows-2022' run: | # Follow the symlink to the actual binary file tar --dereference -czf iwasm${{ matrix.suffix }}-${{ inputs.ver_num }}-${{ inputs.runner }}.tar.gz iwasm diff --git a/.github/workflows/build_llvm_libraries.yml b/.github/workflows/build_llvm_libraries.yml index 2f07d617a3..54f8781a44 100644 --- a/.github/workflows/build_llvm_libraries.yml +++ b/.github/workflows/build_llvm_libraries.yml @@ -118,11 +118,11 @@ jobs: key: 0-ccache-${{ inputs.os }}-${{ steps.get_last_commit.outputs.last_commit }} restore-keys: | 0-ccache-${{ inputs.os }} - if: steps.retrieve_llvm_libs.outputs.cache-hit != 'true' && inputs.os == 'windows-latest' + if: steps.retrieve_llvm_libs.outputs.cache-hit != 'true' && inputs.os == 'windows-2022' # Install tools on Windows - run: choco install -y ccache ninja - if: steps.retrieve_llvm_libs.outputs.cache-hit != 'true' && inputs.os == 'windows-latest' + if: steps.retrieve_llvm_libs.outputs.cache-hit != 'true' && inputs.os == 'windows-2022' - name: Build LLVM libraries if: steps.retrieve_llvm_libs.outputs.cache-hit != 'true' diff --git a/.github/workflows/build_wamrc.yml b/.github/workflows/build_wamrc.yml index 419edec384..d74805c3cd 100644 --- a/.github/workflows/build_wamrc.yml +++ b/.github/workflows/build_wamrc.yml @@ -87,7 +87,7 @@ jobs: working-directory: wamr-compiler - name: Compress the binary on Windows - if: inputs.runner == 'windows-latest' && inputs.release + if: inputs.runner == 'windows-2022' && inputs.release run: | tar -czf wamrc-${{ inputs.ver_num }}-${{ inputs.runner }}.tar.gz wamrc.exe Compress-Archive -Path wamrc.exe -DestinationPath wamrc-${{ inputs.ver_num }}-${{ inputs.runner }}.zip @@ -95,7 +95,7 @@ jobs: working-directory: wamr-compiler/build/Release - name: compress the binary on non-Windows - if: inputs.runner != 'windows-latest' && inputs.release + if: inputs.runner != 'windows-2022' && inputs.release run: | # Follow the symlink to the actual binary file tar --dereference -czf wamrc-${{ inputs.ver_num }}-${{ inputs.runner }}.tar.gz wamrc diff --git a/.github/workflows/compilation_on_windows.yml b/.github/workflows/compilation_on_windows.yml index 543880048d..003a6ba988 100644 --- a/.github/workflows/compilation_on_windows.yml +++ b/.github/workflows/compilation_on_windows.yml @@ -1,7 +1,7 @@ # Copyright (C) 2019 Intel Corporation. All rights reserved. # SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -name: compilation on windows-latest +name: compilation on windows-2022 on: # will be triggered on PR events @@ -63,11 +63,11 @@ jobs: actions: write uses: ./.github/workflows/build_llvm_libraries.yml with: - os: "windows-latest" + os: "windows-2022" arch: "AArch64 ARM Mips RISCV X86" build_iwasm: - runs-on: windows-latest + runs-on: windows-2022 strategy: matrix: build_options: @@ -105,7 +105,7 @@ jobs: strategy: matrix: include: - - os: windows-latest + - os: windows-2022 llvm_cache_key: ${{ needs.build_llvm_libraries_on_windows.outputs.cache_key }} steps: - name: checkout @@ -136,7 +136,7 @@ jobs: working-directory: wamr-compiler test: - runs-on: windows-latest + runs-on: windows-2022 needs: [build_iwasm, build_wamrc] strategy: fail-fast: false diff --git a/.github/workflows/release_process.yml b/.github/workflows/release_process.yml index 857036662d..621f8c2f89 100644 --- a/.github/workflows/release_process.yml +++ b/.github/workflows/release_process.yml @@ -105,7 +105,7 @@ jobs: needs: [create_tag, create_release] uses: ./.github/workflows/build_llvm_libraries.yml with: - os: "windows-latest" + os: "windows-2022" arch: "AArch64 ARM Mips RISCV X86" # @@ -142,7 +142,7 @@ jobs: with: llvm_cache_key: ${{ needs.build_llvm_libraries_on_windows.outputs.cache_key }} release: true - runner: windows-latest + runner: windows-2022 upload_url: ${{ needs.create_release.outputs.upload_url }} ver_num: ${{ needs.create_tag.outputs.new_ver }} @@ -180,7 +180,7 @@ jobs: with: cwd: product-mini/platforms/windows llvm_cache_key: ${{ needs.build_llvm_libraries_on_windows.outputs.cache_key }} - runner: windows-latest + runner: windows-2022 upload_url: ${{ needs.create_release.outputs.upload_url }} ver_num: ${{ needs.create_tag.outputs.new_ver}} From 5ba1b331c3cbed17d0d922d9f8e9488ef4165835 Mon Sep 17 00:00:00 2001 From: James Marsh Date: Mon, 22 Sep 2025 22:58:05 +0100 Subject: [PATCH 069/103] Add missing condition for V128 in WASM_OP_TEE_LOCAL --- core/iwasm/interpreter/wasm_interp_fast.c | 4 ++ .../ba-issues/issues/issue-4643/test.wasm | Bin 0 -> 77 bytes .../ba-issues/issues/issue-4643/test.wat | 43 ++++++++++++++++++ .../regression/ba-issues/running_config.json | 16 +++++++ 4 files changed, 63 insertions(+) create mode 100644 tests/regression/ba-issues/issues/issue-4643/test.wasm create mode 100644 tests/regression/ba-issues/issues/issue-4643/test.wat diff --git a/core/iwasm/interpreter/wasm_interp_fast.c b/core/iwasm/interpreter/wasm_interp_fast.c index a326018efc..90bdb8f17d 100644 --- a/core/iwasm/interpreter/wasm_interp_fast.c +++ b/core/iwasm/interpreter/wasm_interp_fast.c @@ -5057,6 +5057,10 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module, PUT_I64_TO_ADDR((uint32 *)(frame_lp + local_offset), GET_I64_FROM_ADDR(frame_lp + addr1)); } + else if (local_type == VALUE_TYPE_V128) { + PUT_V128_TO_ADDR((frame_lp + local_offset), + GET_V128_FROM_ADDR(frame_lp + addr1)); + } #if WASM_ENABLE_GC != 0 else if (wasm_is_type_reftype(local_type)) { PUT_REF_TO_ADDR((uint32 *)(frame_lp + local_offset), diff --git a/tests/regression/ba-issues/issues/issue-4643/test.wasm b/tests/regression/ba-issues/issues/issue-4643/test.wasm new file mode 100644 index 0000000000000000000000000000000000000000..0b6d62b5a95914dfb9e18b87fc95b12676d9d425 GIT binary patch literal 77 zcmZQbEY4+QU|?WmVN76PU}j=uU}a`xU}P6&V#`g<%`d8CVql9eE=epZVPN2rXOv}X ZVyt7V{>uZ>!vw_4K+FQfN==MX+yJdC3akJC literal 0 HcmV?d00001 diff --git a/tests/regression/ba-issues/issues/issue-4643/test.wat b/tests/regression/ba-issues/issues/issue-4643/test.wat new file mode 100644 index 0000000000..1fecee5944 --- /dev/null +++ b/tests/regression/ba-issues/issues/issue-4643/test.wat @@ -0,0 +1,43 @@ +(module + (memory 1) + (export "memory" (memory 0)) + + (func $test + ;; Add 130 i64 locals (260 slots) to push v128 past offset 256 + (local $d0 i64) (local $d1 i64) (local $d2 i64) (local $d3 i64) (local $d4 i64) + (local $d5 i64) (local $d6 i64) (local $d7 i64) (local $d8 i64) (local $d9 i64) + (local $d10 i64) (local $d11 i64) (local $d12 i64) (local $d13 i64) (local $d14 i64) + (local $d15 i64) (local $d16 i64) (local $d17 i64) (local $d18 i64) (local $d19 i64) + (local $d20 i64) (local $d21 i64) (local $d22 i64) (local $d23 i64) (local $d24 i64) + (local $d25 i64) (local $d26 i64) (local $d27 i64) (local $d28 i64) (local $d29 i64) + (local $d30 i64) (local $d31 i64) (local $d32 i64) (local $d33 i64) (local $d34 i64) + (local $d35 i64) (local $d36 i64) (local $d37 i64) (local $d38 i64) (local $d39 i64) + (local $d40 i64) (local $d41 i64) (local $d42 i64) (local $d43 i64) (local $d44 i64) + (local $d45 i64) (local $d46 i64) (local $d47 i64) (local $d48 i64) (local $d49 i64) + (local $d50 i64) (local $d51 i64) (local $d52 i64) (local $d53 i64) (local $d54 i64) + (local $d55 i64) (local $d56 i64) (local $d57 i64) (local $d58 i64) (local $d59 i64) + (local $d60 i64) (local $d61 i64) (local $d62 i64) (local $d63 i64) (local $d64 i64) + (local $d65 i64) (local $d66 i64) (local $d67 i64) (local $d68 i64) (local $d69 i64) + (local $d70 i64) (local $d71 i64) (local $d72 i64) (local $d73 i64) (local $d74 i64) + (local $d75 i64) (local $d76 i64) (local $d77 i64) (local $d78 i64) (local $d79 i64) + (local $d80 i64) (local $d81 i64) (local $d82 i64) (local $d83 i64) (local $d84 i64) + (local $d85 i64) (local $d86 i64) (local $d87 i64) (local $d88 i64) (local $d89 i64) + (local $d90 i64) (local $d91 i64) (local $d92 i64) (local $d93 i64) (local $d94 i64) + (local $d95 i64) (local $d96 i64) (local $d97 i64) (local $d98 i64) (local $d99 i64) + (local $d100 i64) (local $d101 i64) (local $d102 i64) (local $d103 i64) (local $d104 i64) + (local $d105 i64) (local $d106 i64) (local $d107 i64) (local $d108 i64) (local $d109 i64) + (local $d110 i64) (local $d111 i64) (local $d112 i64) (local $d113 i64) (local $d114 i64) + (local $d115 i64) (local $d116 i64) (local $d117 i64) (local $d118 i64) (local $d119 i64) + (local $d120 i64) (local $d121 i64) (local $d122 i64) (local $d123 i64) (local $d124 i64) + (local $d125 i64) (local $d126 i64) (local $d127 i64) (local $d128 i64) (local $d129 i64) + + (local $vec v128) + + ;; Should hit WASM_OP_TEE_LOCAL rather than EXT_OP_TEE_LOCAL_FAST_V128 + (v128.const i32x4 1 2 3 4) + (local.tee $vec) + (drop) + ) + + (export "_start" (func $test)) +) diff --git a/tests/regression/ba-issues/running_config.json b/tests/regression/ba-issues/running_config.json index 9288eb9704..decc6861aa 100644 --- a/tests/regression/ba-issues/running_config.json +++ b/tests/regression/ba-issues/running_config.json @@ -1754,6 +1754,22 @@ "stdout content": "", "description": "no sanitizer 'heap-buffer-overflow'" } + }, + { + "deprecated": false, + "ids": [ + 4643 + ], + "runtime": "iwasm-default-wasi-disabled", + "file": "test.wasm", + "mode": "fast-interp", + "options": "-f _start", + "argument": "", + "expected return": { + "ret code": 0, + "stdout content": "", + "description": "no 'invalid local type'" + } } ] } From 49ac85472d70f7eaddb05c16c6e3bbb09afae417 Mon Sep 17 00:00:00 2001 From: Kiyoshi Nakao <449732+ikehara@users.noreply.github.com> Date: Thu, 9 Oct 2025 12:24:12 +0900 Subject: [PATCH 070/103] Fix memory grow on SGX platform (#4651) * SGX: zero-initialize reserved memory in os_mmap after allocation * Add SGX-specific os_mremap to zero-clear remaining memory after memcpy * Modify core/shared/platform/linux-sgx/shared_platform.cmake not to include platform_api_memory.cmake * Modify core/shared/platform/linux-sgx/shared_platform.cmake to remove unnecessary PLATFORM_COMMON_MEMORY_SOURCE --- core/shared/platform/linux-sgx/sgx_platform.c | 39 +++++++++++++++++-- .../platform/linux-sgx/shared_platform.cmake | 3 -- 2 files changed, 35 insertions(+), 7 deletions(-) diff --git a/core/shared/platform/linux-sgx/sgx_platform.c b/core/shared/platform/linux-sgx/sgx_platform.c index db350bc8f4..d259908634 100644 --- a/core/shared/platform/linux-sgx/sgx_platform.c +++ b/core/shared/platform/linux-sgx/sgx_platform.c @@ -131,8 +131,9 @@ os_is_handle_valid(os_file_handle *handle) /* implemented in posix_file.c */ #endif -void * -os_mmap(void *hint, size_t size, int prot, int flags, os_file_handle file) +static void * +os_mmap_internal(void *hint, size_t size, int prot, int flags, + os_file_handle file, bool clear) { int mprot = 0; uint64 aligned_size, page_size; @@ -161,6 +162,10 @@ os_mmap(void *hint, size_t size, int prot, int flags, os_file_handle file) return NULL; } + if (clear) { + memset(ret, 0, aligned_size); + } + if (prot & MMAP_PROT_READ) mprot |= SGX_PROT_READ; if (prot & MMAP_PROT_WRITE) @@ -179,6 +184,30 @@ os_mmap(void *hint, size_t size, int prot, int flags, os_file_handle file) return ret; } +void * +os_mmap(void *hint, size_t size, int prot, int flags, os_file_handle file) +{ + return os_mmap_internal(hint, size, prot, flags, file, true); +} + +void * +os_mremap(void *old_addr, size_t old_size, size_t new_size) +{ + void *new_memory = + os_mmap_internal(NULL, new_size, MMAP_PROT_WRITE | MMAP_PROT_READ, 0, + os_get_invalid_handle(), false); + if (!new_memory) { + return NULL; + } + size_t copy_size = new_size < old_size ? new_size : old_size; + memcpy(new_memory, old_addr, copy_size); + if (new_size > copy_size) { + memset((char *)new_memory + copy_size, 0, new_size - copy_size); + } + os_munmap(old_addr, old_size); + return new_memory; +} + void os_munmap(void *addr, size_t size) { @@ -216,8 +245,10 @@ os_mprotect(void *addr, size_t size, int prot) void os_dcache_flush(void) -{} +{ +} void os_icache_flush(void *start, size_t len) -{} +{ +} diff --git a/core/shared/platform/linux-sgx/shared_platform.cmake b/core/shared/platform/linux-sgx/shared_platform.cmake index 9cd765be4e..e8e1670058 100644 --- a/core/shared/platform/linux-sgx/shared_platform.cmake +++ b/core/shared/platform/linux-sgx/shared_platform.cmake @@ -37,9 +37,6 @@ else() set(source_all ${source_all} ${PLATFORM_COMMON_LIBC_UTIL_SOURCE}) endif() -include (${CMAKE_CURRENT_LIST_DIR}/../common/memory/platform_api_memory.cmake) -set (source_all ${source_all} ${PLATFORM_COMMON_MEMORY_SOURCE}) - file (GLOB source_all_untrusted ${PLATFORM_SHARED_DIR}/untrusted/*.c) set (PLATFORM_SHARED_SOURCE ${source_all}) From 57cd389dfd7d9ccd8da7d52aea00166d4b534945 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 9 Oct 2025 11:26:02 +0800 Subject: [PATCH 071/103] build(deps): Bump ossf/scorecard-action from 2.4.2 to 2.4.3 (#4660) Bumps [ossf/scorecard-action](https://github.com/ossf/scorecard-action) from 2.4.2 to 2.4.3. - [Release notes](https://github.com/ossf/scorecard-action/releases) - [Changelog](https://github.com/ossf/scorecard-action/blob/main/RELEASE.md) - [Commits](https://github.com/ossf/scorecard-action/compare/05b42c624433fc40578a4040d5cf5e36ddca8cde...4eaacf0543bb3f2c246792bd56e8cdeffafb205a) --- updated-dependencies: - dependency-name: ossf/scorecard-action dependency-version: 2.4.3 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/supply_chain.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/supply_chain.yml b/.github/workflows/supply_chain.yml index 73fb683ee0..22b382a191 100644 --- a/.github/workflows/supply_chain.yml +++ b/.github/workflows/supply_chain.yml @@ -39,7 +39,7 @@ jobs: persist-credentials: false - name: "Run analysis" - uses: ossf/scorecard-action@05b42c624433fc40578a4040d5cf5e36ddca8cde # v2.4.2 + uses: ossf/scorecard-action@4eaacf0543bb3f2c246792bd56e8cdeffafb205a # v2.4.3 with: results_file: results.sarif results_format: sarif From fbef624118038e0b763245270189e8af9bc16977 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 9 Oct 2025 11:26:10 +0800 Subject: [PATCH 072/103] build(deps): Bump github/codeql-action from 3.30.1 to 3.30.6 (#4659) Bumps [github/codeql-action](https://github.com/github/codeql-action) from 3.30.1 to 3.30.6. - [Release notes](https://github.com/github/codeql-action/releases) - [Commits](https://github.com/github/codeql-action/compare/v3.30.1...v3.30.6) --- updated-dependencies: - dependency-name: github/codeql-action dependency-version: 3.30.6 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/codeql.yml | 6 +++--- .github/workflows/supply_chain.yml | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml index a2548f1d90..5a5afec1fc 100644 --- a/.github/workflows/codeql.yml +++ b/.github/workflows/codeql.yml @@ -53,7 +53,7 @@ jobs: # Initializes the CodeQL tools for scanning. - name: Initialize CodeQL - uses: github/codeql-action/init@v3.30.1 + uses: github/codeql-action/init@v3.30.6 with: languages: ${{ matrix.language }} @@ -70,7 +70,7 @@ jobs: - run: | ./.github/scripts/codeql_buildscript.sh - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@v3.30.1 + uses: github/codeql-action/analyze@v3.30.6 with: category: "/language:${{matrix.language}}" upload: false @@ -99,7 +99,7 @@ jobs: output: ${{ steps.step1.outputs.sarif-output }}/cpp.sarif - name: Upload CodeQL results to code scanning - uses: github/codeql-action/upload-sarif@v3.30.1 + uses: github/codeql-action/upload-sarif@v3.30.6 with: sarif_file: ${{ steps.step1.outputs.sarif-output }} category: "/language:${{matrix.language}}" diff --git a/.github/workflows/supply_chain.yml b/.github/workflows/supply_chain.yml index 22b382a191..407a7113fd 100644 --- a/.github/workflows/supply_chain.yml +++ b/.github/workflows/supply_chain.yml @@ -60,6 +60,6 @@ jobs: # Upload the results to GitHub's code scanning dashboard. - name: "Upload to code-scanning" - uses: github/codeql-action/upload-sarif@144880b6f0c9977178ab4000985a49023783178f + uses: github/codeql-action/upload-sarif@065c6cfb7809de8db2167a953b5b622491cda914 with: sarif_file: results.sarif From 326eeec615b6971c04cdfb88baed2f97171e5fed Mon Sep 17 00:00:00 2001 From: Liu Jia Date: Thu, 9 Oct 2025 11:35:12 +0800 Subject: [PATCH 073/103] Add new cases in ARC relocation of AOT (#4653) * add new case for arc relocation. R_ARC_S21H_PCREL, R_ARC_S21W_PCREL --- core/iwasm/aot/arch/aot_reloc_arc.c | 78 ++++++++++++++++++++++++++++- 1 file changed, 76 insertions(+), 2 deletions(-) diff --git a/core/iwasm/aot/arch/aot_reloc_arc.c b/core/iwasm/aot/arch/aot_reloc_arc.c index 3329629987..2ce1154426 100644 --- a/core/iwasm/aot/arch/aot_reloc_arc.c +++ b/core/iwasm/aot/arch/aot_reloc_arc.c @@ -310,6 +310,80 @@ apply_relocation(AOTModule *module, uint8 *target_section_addr, int32 symbol_index, char *error_buf, uint32 error_buf_size) { switch (reloc_type) { + case R_ARC_S21H_PCREL: + { + uint32 insn = LOAD_I32(target_section_addr + reloc_offset); + int32 addend, value; + uintptr_t S, P; + intptr_t A; + + CHECK_RELOC_OFFSET(sizeof(void *)); + + /* Convert from middle endian */ + insn = middle_endian_convert(insn); + + /* Extract the first 10 bits from Position 6 to 15 in insn */ + addend = (insn << 16) >> 22; + addend = addend << 10; + /* Extract the remaining 10 bits from Position 17 to 26 in insn */ + addend |= ((insn << 5) >> 22); + /* Fill in 1 bits to get the 21 bit Offset Value */ + addend = addend << 1; + + /* (S + A) - P */ + S = (uintptr_t)(uint8 *)symbol_addr; + A = (intptr_t)reloc_addend; + P = (uintptr_t)(target_section_addr + reloc_offset); + P &= (uintptr_t)~1; + value = (int32)(S + A + addend - P); + + insn = insn & 0xf801003f; + insn |= ((((value >> 1) & 0x3ff) << 17) + | (((value >> 1) & 0xffc00) >> 4)); + + /* Convert to middle endian */ + insn = middle_endian_convert(insn); + + STORE_U32(target_section_addr + reloc_offset, insn); + break; + } + case R_ARC_S21W_PCREL: + { + uint32 insn = LOAD_I32(target_section_addr + reloc_offset); + int32 addend, value; + uintptr_t S, P; + intptr_t A; + + CHECK_RELOC_OFFSET(sizeof(void *)); + + /* Convert from middle endian */ + insn = middle_endian_convert(insn); + + /* Extract the first 10 bits from Position 6 to 15 in insn */ + addend = (insn << 16) >> 22; + addend = addend << 9; + /* Extract the remaining 9 bits from Position 18 to 26 in insn */ + addend |= ((insn << 5) >> 23); + /* Fill in 2 bits to get the 21 bit Offset Value */ + addend = addend << 2; + + /* (S + A) - P */ + S = (uintptr_t)(uint8 *)symbol_addr; + A = (intptr_t)reloc_addend; + P = (uintptr_t)(target_section_addr + reloc_offset); + P &= (uintptr_t)~3; + value = (int32)(S + A + addend - P); + + insn = insn & 0xf803003f; + insn |= ((((value >> 2) & 0x1ff) << 18) + | (((value >> 2) & 0x7fe00) >> 3)); + + /* Convert to middle endian */ + insn = middle_endian_convert(insn); + + STORE_U32(target_section_addr + reloc_offset, insn); + break; + } case R_ARC_S25H_PCREL: { uint32 insn = LOAD_I32(target_section_addr + reloc_offset); @@ -340,8 +414,8 @@ apply_relocation(AOTModule *module, uint8 *target_section_addr, insn = insn & 0xf8010030; insn |= ((((value >> 1) & 0x3ff) << 17) - | (((value >> 1) & 0xffc00) >> 3) - | (((value >> 1) & 0xf00000) >> 19)); + | (((value >> 1) & 0xffc00) >> 4) + | (((value >> 1) & 0xf00000) >> 20)); /* Convert to middle endian */ insn = middle_endian_convert(insn); From 74cdf0b8c1b869d711e34f540bde8fb879bbb39e Mon Sep 17 00:00:00 2001 From: Zhenwei Jin <109658203+kylo5aby@users.noreply.github.com> Date: Thu, 9 Oct 2025 12:04:29 +0800 Subject: [PATCH 074/103] Add import functions callback (#4606) Signed-off-by: zhenweijin --- .../compilation_on_android_ubuntu.yml | 8 ++ .github/workflows/compilation_on_macos.yml | 8 ++ .github/workflows/nightly_run.yml | 8 ++ core/iwasm/include/wasm_export.h | 16 +++ samples/import-func-callback/CMakeLists.txt | 106 ++++++++++++++++++ samples/import-func-callback/README.md | 14 +++ samples/import-func-callback/src/main.c | 97 ++++++++++++++++ samples/import-func-callback/wasm-apps/test.c | 17 +++ 8 files changed, 274 insertions(+) create mode 100644 samples/import-func-callback/CMakeLists.txt create mode 100644 samples/import-func-callback/README.md create mode 100644 samples/import-func-callback/src/main.c create mode 100644 samples/import-func-callback/wasm-apps/test.c diff --git a/.github/workflows/compilation_on_android_ubuntu.yml b/.github/workflows/compilation_on_android_ubuntu.yml index 01356dc66e..98d4b1b723 100644 --- a/.github/workflows/compilation_on_android_ubuntu.yml +++ b/.github/workflows/compilation_on_android_ubuntu.yml @@ -622,6 +622,14 @@ jobs: ./shared_heap_test ./shared_heap_test --aot + - name: Build Sample [import-func-callback] + run: | + cd samples/import-func-callback + mkdir build && cd build + cmake .. + cmake --build . --config Release --parallel 4 + ./import-func-callback + test: needs: [ diff --git a/.github/workflows/compilation_on_macos.yml b/.github/workflows/compilation_on_macos.yml index 8387ee0c75..912bf7dea7 100644 --- a/.github/workflows/compilation_on_macos.yml +++ b/.github/workflows/compilation_on_macos.yml @@ -422,3 +422,11 @@ jobs: cmake --build . --config Debug --parallel 4 ./shared_heap_test ./shared_heap_test --aot + + - name: Build Sample [import-func-callback] + run: | + cd samples/import-func-callback + mkdir build && cd build + cmake .. + cmake --build . --config Release --parallel 4 + ./import-func-callback diff --git a/.github/workflows/nightly_run.yml b/.github/workflows/nightly_run.yml index 260a7e97c4..58532aac85 100644 --- a/.github/workflows/nightly_run.yml +++ b/.github/workflows/nightly_run.yml @@ -568,6 +568,14 @@ jobs: ./shared_heap_test ./shared_heap_test --aot + - name: Build Sample [import-func-callback] + run: | + cd samples/import-func-callback + mkdir build && cd build + cmake .. + cmake --build . --config Release --parallel 4 + ./import-func-callback + test: needs: [build_iwasm, build_llvm_libraries_on_ubuntu, build_wamrc] runs-on: ${{ matrix.os }} diff --git a/core/iwasm/include/wasm_export.h b/core/iwasm/include/wasm_export.h index 81efb8f6f7..0ab22f7112 100644 --- a/core/iwasm/include/wasm_export.h +++ b/core/iwasm/include/wasm_export.h @@ -1526,6 +1526,14 @@ wasm_runtime_get_native_addr_range(wasm_module_inst_t module_inst, /** * Get the number of import items for a WASM module * + * Typical usage scenario: + * Combine this function with wasm_runtime_get_import_count() to traverse + * all import items in a module. Use import_type.kind to filter and identify + * different types of import items. + * + * Example usage (as wasm_runtime_for_each_import_func() in + * samples/import-func-callback) + * * @param module the WASM module * * @return the number of imports (zero for none), or -1 for failure @@ -1536,6 +1544,14 @@ wasm_runtime_get_import_count(const wasm_module_t module); /** * Get information about a specific WASM module import * + * Typical usage scenario: + * Combine this function with wasm_runtime_get_import_count() to traverse + * all import items in a module. Use import_type.kind to filter and identify + * different types of import items. + * + * Example usage (as wasm_runtime_for_each_import_func() in + * samples/import-func-callback) + * * @param module the WASM module * @param import_index the desired import index * @param import_type the location to store information about the import diff --git a/samples/import-func-callback/CMakeLists.txt b/samples/import-func-callback/CMakeLists.txt new file mode 100644 index 0000000000..be0cc5032a --- /dev/null +++ b/samples/import-func-callback/CMakeLists.txt @@ -0,0 +1,106 @@ +# Copyright (C) 2019 Intel Corporation. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception + +cmake_minimum_required (VERSION 3.14) + +include(CheckPIESupported) +include(ExternalProject) + +project (import-func-callback) + +set (CMAKE_CXX_STANDARD 17) + +################ runtime settings ################ +string (TOLOWER ${CMAKE_HOST_SYSTEM_NAME} WAMR_BUILD_PLATFORM) +if (APPLE) + add_definitions(-DBH_PLATFORM_DARWIN) +endif () + +# Reset default linker flags +set (CMAKE_SHARED_LIBRARY_LINK_C_FLAGS "") +set (CMAKE_SHARED_LIBRARY_LINK_CXX_FLAGS "") + +# WAMR features switch + +# Set WAMR_BUILD_TARGET, currently values supported: +# "X86_64", "AMD_64", "X86_32", "AARCH64[sub]", "ARM[sub]", "THUMB[sub]", +# "MIPS", "XTENSA", "RISCV64[sub]", "RISCV32[sub]" +if (NOT DEFINED WAMR_BUILD_TARGET) + if (CMAKE_SYSTEM_PROCESSOR MATCHES "^(arm64|aarch64)") + set (WAMR_BUILD_TARGET "AARCH64") + elseif (CMAKE_SYSTEM_PROCESSOR STREQUAL "riscv64") + set (WAMR_BUILD_TARGET "RISCV64") + elseif (CMAKE_SIZEOF_VOID_P EQUAL 8) + # Build as X86_64 by default in 64-bit platform + set (WAMR_BUILD_TARGET "X86_64") + elseif (CMAKE_SIZEOF_VOID_P EQUAL 4) + # Build as X86_32 by default in 32-bit platform + set (WAMR_BUILD_TARGET "X86_32") + else () + message(SEND_ERROR "Unsupported build target platform!") + endif () +endif () + +if (NOT CMAKE_BUILD_TYPE) + set (CMAKE_BUILD_TYPE Debug) +endif () + +set (WAMR_BUILD_INTERP 1) + +if (NOT MSVC) + # linker flags + if (NOT (CMAKE_C_COMPILER MATCHES ".*clang.*" OR CMAKE_C_COMPILER_ID MATCHES ".*Clang")) + set (CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,--gc-sections") + endif () + set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -Wextra -Wformat -Wformat-security") + if (WAMR_BUILD_TARGET MATCHES "X86_.*" OR WAMR_BUILD_TARGET STREQUAL "AMD_64") + if (NOT (CMAKE_C_COMPILER MATCHES ".*clang.*" OR CMAKE_C_COMPILER_ID MATCHES ".*Clang")) + set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -mindirect-branch-register") + endif () + endif () +endif () + +# build out vmlib +set (WAMR_ROOT_DIR ${CMAKE_CURRENT_LIST_DIR}/../..) +include (${WAMR_ROOT_DIR}/build-scripts/runtime_lib.cmake) + +add_library(vmlib ${WAMR_RUNTIME_LIB_SOURCE}) + +################ wasm application ################ +if (NOT DEFINED WASI_SDK_DIR) + set (WASI_SDK_DIR "/opt/wasi-sdk") +endif () + +ExternalProject_Add(wasm_app + SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/wasm-apps + BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR}/wasm-apps + CONFIGURE_COMMAND "" + BUILD_COMMAND ${CMAKE_COMMAND} -E env + ${WASI_SDK_DIR}/bin/clang + -nostdlib + --target=wasm32 + -Wl,--no-entry + -Wl,--export=test + -Wl,--allow-undefined + -o ${CMAKE_CURRENT_BINARY_DIR}/wasm-apps/test.wasm + ${CMAKE_CURRENT_SOURCE_DIR}/wasm-apps/test.c + BUILD_ALWAYS TRUE + INSTALL_COMMAND "" +) + +################ application related ################ +include_directories(${CMAKE_CURRENT_LIST_DIR}/src) +include (${SHARED_DIR}/utils/uncommon/shared_uncommon.cmake) + +add_executable (import-func-callback src/main.c ${UNCOMMON_SHARED_SOURCE}) + +add_dependencies(import-func-callback wasm_app) + +check_pie_supported() +set_target_properties (import-func-callback PROPERTIES POSITION_INDEPENDENT_CODE ON) + +if (APPLE) + target_link_libraries (import-func-callback vmlib -lm -ldl -lpthread ${LLVM_AVAILABLE_LIBS}) +else () + target_link_libraries (import-func-callback vmlib -lm -ldl -lpthread -lrt ${LLVM_AVAILABLE_LIBS}) +endif () diff --git a/samples/import-func-callback/README.md b/samples/import-func-callback/README.md new file mode 100644 index 0000000000..ee822388b5 --- /dev/null +++ b/samples/import-func-callback/README.md @@ -0,0 +1,14 @@ +# "import function callback" sample introduction + +This sample demonstrates how to use import function callbacks to handle WebAssembly modules that import external functions. The sample shows how to register callback functions for imported functions and execute them when the WASM module loads these imported functions. + +The sample includes a WASM module that imports external functions and a host application that provides callback `import_func_type_callback` for these imported functions. + +## Build and run the sample + +```bash +mkdir build && cd build +cmake .. +cmake --build . --config Release +./import-func-callback +``` diff --git a/samples/import-func-callback/src/main.c b/samples/import-func-callback/src/main.c new file mode 100644 index 0000000000..a5f9a9acfe --- /dev/null +++ b/samples/import-func-callback/src/main.c @@ -0,0 +1,97 @@ +/* + * Copyright (C) 2019 Intel Corporation. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception + */ + +#include "wasm_export.h" +#include "bh_read_file.h" +#include "bh_getopt.h" +#include "assert.h" + +typedef void (*wasm_func_type_callback_t)(const wasm_import_t *import_type); + +const char *import_func_names[] = { "import_func1", "import_func2" }; + +void +import_func_type_callback(const wasm_import_t *import_type) +{ + int ret = 0; + for (uint32_t i = 0; + i < sizeof(import_func_names) / sizeof(import_func_names[0]); i++) { + if (strcmp(import_type->name, import_func_names[i]) == 0) { + ret = 1; + break; + } + } + assert(ret == 1); + return; +} + +/* Iterate over all import functions in the module */ +void +wasm_runtime_for_each_import_func(const wasm_module_t module, + wasm_func_type_callback_t callback) +{ + int32_t import_count = wasm_runtime_get_import_count(module); + if (import_count <= 0) + return; + if (callback == NULL) + return; + + for (int32_t i = 0; i < import_count; ++i) { + wasm_import_t import_type; + wasm_runtime_get_import_type(module, i, &import_type); + + if (import_type.kind != WASM_IMPORT_EXPORT_KIND_FUNC) { + continue; + } + + callback(&import_type); + } +} + +int +main(int argc, char *argv_main[]) +{ + static char global_heap_buf[512 * 1024]; + wasm_module_t module = NULL; + uint32 buf_size; + char *buffer = NULL; + const char *wasm_path = "wasm-apps/test.wasm"; + char error_buf[128]; + + RuntimeInitArgs init_args; + memset(&init_args, 0, sizeof(RuntimeInitArgs)); + + init_args.mem_alloc_type = Alloc_With_Pool; + init_args.mem_alloc_option.pool.heap_buf = global_heap_buf; + init_args.mem_alloc_option.pool.heap_size = sizeof(global_heap_buf); + + if (!wasm_runtime_full_init(&init_args)) { + printf("Init runtime environment failed.\n"); + return -1; + } + buffer = bh_read_file_to_buffer(wasm_path, &buf_size); + + if (!buffer) { + printf("Open wasm app file [%s] failed.\n", wasm_path); + goto fail; + } + + module = wasm_runtime_load((uint8 *)buffer, buf_size, error_buf, + sizeof(error_buf)); + if (!module) { + printf("Load wasm app file [%s] failed.\n", wasm_path); + goto fail; + } + + wasm_runtime_for_each_import_func(module, import_func_type_callback); + +fail: + if (module) + wasm_runtime_unload(module); + if (buffer) + BH_FREE(buffer); + wasm_runtime_destroy(); + return 0; +} diff --git a/samples/import-func-callback/wasm-apps/test.c b/samples/import-func-callback/wasm-apps/test.c new file mode 100644 index 0000000000..5e6f30b5c6 --- /dev/null +++ b/samples/import-func-callback/wasm-apps/test.c @@ -0,0 +1,17 @@ +/* + * Copyright (C) 2019 Intel Corporation. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception + */ + +extern int +import_func1(int a, int b); +extern int +import_func2(int a); + +int +test() +{ + int a = import_func1(1, 2); + int b = import_func2(3); + return a + b; +} From 635576c607bd77f65776db75f767d0b33fb28e74 Mon Sep 17 00:00:00 2001 From: "liang.he" Date: Thu, 9 Oct 2025 12:05:59 +0800 Subject: [PATCH 075/103] Enhance security guidelines for identifying vulnerabilities (#4584) * Enhance security guidelines for identifying vulnerabilities. It includes a tiered-support-list * Update issue templates. Follow [the instructions at GitHub Documentation](https://docs.github.com/en/communities/using-templates-to-encourage-useful-issues-and-pull-requests/configuring-issue-templates-for-your-repository#creating-issue-templates) to recreate issue templates. Apply the new format and add new fields. --- .github/ISSUE_TEMPLATE/blank_issue.md | 5 - .github/ISSUE_TEMPLATE/bug_report.md | 41 ++++ .github/ISSUE_TEMPLATE/config.yml | 1 + .github/ISSUE_TEMPLATE/feature_request.md | 20 ++ .github/ISSUE_TEMPLATE/improvement.md | 28 --- .github/ISSUE_TEMPLATE/report_bug.md | 36 ---- .github/workflows/compilation_on_zephyr.yml | 2 + doc/build_wamr.md | 2 + doc/security_need_to_know.md | 41 +++- doc/tiered_support.md | 196 ++++++++++++++++++++ 10 files changed, 296 insertions(+), 76 deletions(-) delete mode 100644 .github/ISSUE_TEMPLATE/blank_issue.md create mode 100644 .github/ISSUE_TEMPLATE/bug_report.md create mode 100644 .github/ISSUE_TEMPLATE/config.yml create mode 100644 .github/ISSUE_TEMPLATE/feature_request.md delete mode 100644 .github/ISSUE_TEMPLATE/improvement.md delete mode 100644 .github/ISSUE_TEMPLATE/report_bug.md create mode 100644 doc/tiered_support.md diff --git a/.github/ISSUE_TEMPLATE/blank_issue.md b/.github/ISSUE_TEMPLATE/blank_issue.md deleted file mode 100644 index 57febe7d5f..0000000000 --- a/.github/ISSUE_TEMPLATE/blank_issue.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -name: Blank Issue -about: Create a blank issue. -title: '' ---- diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md new file mode 100644 index 0000000000..9fa3fad944 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -0,0 +1,41 @@ +--- +name: Bug report +about: Create a report to help us improve +title: "Add a placeholder for issue title. ex: [BUG]" +labels: bug +assignees: "" +--- + +**Is it a security vulnerability?** +If it results in a crash or hang, please refer to [a quick checklist](../../doc/security_need_to_know.md#is-this-bug-considered-a-security-vulnerability) to determine if it is a security vulnerability. If you are still unsure, please report it through [a security advisor](https://github.com/bytecodealliance/wasm-micro-runtime/security/advisories) and allow the maintainer to make a decision. Thank you. + +**Describe the bug** +A clear and concise description of what the bug is. + +**Version** +Information like tags, release version, commits. + +**To Reproduce** +Steps to reproduce the behavior: + +1. Compile iwasm with flags like '...' +2. (Optional) Compile wamrc with flags like '....' +3. (Optional) Run wamrc with CLI options like '...' to generate .aot +4. Run iwasm with CLI options like '...' +5. See error + +**Expected behavior** +A clear and concise description of what you expected to happen. + +**Actual Result** +What you've got. + +**Desktop (please complete the following information):** + +- Arch [e.g. x86_64, arm64, 32bit] +- Board [e.g. STM32F407] +- OS [e.g. Linux, Windows, macOS, FreeRTOS] +- Version [e.g. 22] + +**Additional context** +Add any other context about the problem here. diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml new file mode 100644 index 0000000000..0086358db1 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -0,0 +1 @@ +blank_issues_enabled: true diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md new file mode 100644 index 0000000000..f20f45edee --- /dev/null +++ b/.github/ISSUE_TEMPLATE/feature_request.md @@ -0,0 +1,20 @@ +--- +name: Feature request +about: Suggest an idea for this project +title: 'Add a placeholder for issue title. ex: [RFC]' +labels: help wanted +assignees: '' + +--- + +**Is your feature request related to a problem? Please describe.** +A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] + +**Describe the solution you'd like** +A clear and concise description of what you want to happen. + +**Describe alternatives you've considered** +A clear and concise description of any alternative solutions or features you've considered. + +**Additional context** +Add any other context or screenshots about the feature request here. diff --git a/.github/ISSUE_TEMPLATE/improvement.md b/.github/ISSUE_TEMPLATE/improvement.md deleted file mode 100644 index ffdf0906ff..0000000000 --- a/.github/ISSUE_TEMPLATE/improvement.md +++ /dev/null @@ -1,28 +0,0 @@ ---- -name: Improvement -about: A feature request or code improvement. -title: '' -labels: '' -assignees: '' ---- - -Thanks for filing a feature request! Please fill out the TODOs below. - -#### Feature - -TODO: Brief description of the feature/improvement you'd like to see in WAMR - -#### Benefit - -TODO: What is the value of adding this in WAMR? What problems does it solve? - -#### Implementation - -TODO: Do you have an implementation plan, and/or ideas for data structures or -algorithms to use? - -#### Alternatives - -TODO: What are the alternative implementation approaches or alternative ways to -solve the problem that this feature would solve? How do these alternatives -compare to this proposal? diff --git a/.github/ISSUE_TEMPLATE/report_bug.md b/.github/ISSUE_TEMPLATE/report_bug.md deleted file mode 100644 index d3058c9ca1..0000000000 --- a/.github/ISSUE_TEMPLATE/report_bug.md +++ /dev/null @@ -1,36 +0,0 @@ ---- -name: WAMR bug or defect report -about: Report a bug or defect in WAMR -title: '' ---- - -Thanks for filing a bug or defect report! Please fill out the TODOs below. - -### Subject of the issue - -Describe the bug or defect here. - -### Test case - -Upload the related wasm file, wast file or the source files if you can. - -### Your environment - -* Host OS -* WAMR version, platform, cpu architecture, running mode, etc. - -### Steps to reproduce - -Tell us how to reproduce this bug or defect. - -### Expected behavior - -Tell us what should happen - -### Actual behavior - -Tell us what happens instead - -### Extra Info - -Anything else you'd like to add? diff --git a/.github/workflows/compilation_on_zephyr.yml b/.github/workflows/compilation_on_zephyr.yml index 7342804ac8..06ff334f1e 100644 --- a/.github/workflows/compilation_on_zephyr.yml +++ b/.github/workflows/compilation_on_zephyr.yml @@ -11,6 +11,7 @@ on: - synchronize paths: - ".github/**" + - "!.github/ISSUE_TEMPLATE/**" - "build-scripts/**" - "core/**" - "!core/deps/**" @@ -27,6 +28,7 @@ on: - "dev/**" paths: - ".github/**" + - "!.github/ISSUE_TEMPLATE/**" - "build-scripts/**" - "core/**" - "!core/deps/**" diff --git a/doc/build_wamr.md b/doc/build_wamr.md index 798c792643..fa6c6af8db 100644 --- a/doc/build_wamr.md +++ b/doc/build_wamr.md @@ -20,6 +20,8 @@ add_library(vmlib ${WAMR_RUNTIME_LIB_SOURCE}) The script `runtime_lib.cmake` defines a number of variables for configuring the WAMR runtime features. You can set these variables in your CMakeList.txt or pass the configurations from cmake command line. +Please refer to [a full list of configuration options](./tired_support.md#appendix-all-compilation-flags). + ### **Configure platform and architecture** - **WAMR_BUILD_PLATFORM**: set the target platform. It can be set to any platform name (folder name) under folder [core/shared/platform](../core/shared/platform). diff --git a/doc/security_need_to_know.md b/doc/security_need_to_know.md index b0d076d38d..f760e1e110 100644 --- a/doc/security_need_to_know.md +++ b/doc/security_need_to_know.md @@ -15,10 +15,41 @@ It is commonly stated that a security issue is an issue that: Given that WASI is a set of Capability-based APIs, all unauthorized actions are not supposed to happen. Most of the above security concerns can be alleviated. What remains for us is to ensure that the execution of Wasm modules is secure. In other words, do not compromise the sandbox. Unless it is explicitly disabled beforehand. -Thus, we share most of the criteria for judging security issues with [the Bytecode Alliance](https://github.com/bytecodealliance/rfcs/blob/main/accepted/what-is-considered-a-security-bug.md#definition). +### Is this bug considered a security vulnerability? -> [!NOTE] -> keep updating this document as the project evolves. +#### For someone who finds a problem + +if a bug **results in crash or hang**, please treat it as a security problem and report it to a security advisor. The maintainer will look into it and change its category if needed. It is better safe than sorry. + +If the author of an issue(results in crash or hang) can go through the following checklist and answer all questions with "No", it is fine to mark it as a regular bug. If not, please report it as a security issue. + +--- + +#### For those maintainers + +please use the following guidelines to determine if a bug or advisory is a security issue: + +Only bugs that affect [tier A platforms or features](./tiered_support.md) should be considered. + +Actions that differ from Wasm rules (like calculating wrong values) are not seen as security issues as long as they stay within the sandbox. + +By default, native APIs and CLIs are following the principle of **caller guarantee**. If the caller provides incorrect parameters or users input malformed options, it is not a security issue. For example, if a user passes an invalid file descriptor to `fd_read`, it is not a security issue. + +.wasm are not trusted. Malformed .wasm files should be handled gracefully. If a .wasm file causes a runtime crash or hang, it is a security issue. On the other hand, it's expected that aot runtime alone doesn't provide the same guarantee. So user-crafted .aot can cause anything, including crashes or hangs. They are not considered security issues. + +A denial-of-service (DoS) attack is a cyberattack that aims to make a computer or network resource unavailable to its users. If the service (runtime in this case) can recover and start another module or run another function within the same instance, it is not considered unavailable, and thus not a Denial of Service (DoS). + +Another type of execution problem we usually do not classify as a security one is if it is caused by an infinite loop or incorrect recursive function call chain. + +### When a maintainer identify a problem that should be classified as a security vulnerability + +Once a maintainer realizes an issue or PR describes a real or possible security vulnerability, act quickly to minimize exposure. Do not share technical details publicly on the issue or PR anymore. Maintainers should: + +- Close or edit the public discussion. Thank the person who reported it and explain that security-related issues should go through the Security Advisory process. Close the public issue or pull request as soon as possible to prevent further public sharing. If details have already been shared, consider editing or asking GitHub staff to remove sensitive content. + +- Create a Security Advisory. Invite the reporter to join as a collaborator or reporter. If the reporter is uncomfortable using GitHub Security Advisories, offer another private communication method, such as email. + +- Follow the guidelines in [the security issue runbook](./security_issue_runbook.md) for the next steps. ## reporting a security issue @@ -26,8 +57,4 @@ Follow the [same guidelines](https://bytecodealliance.org/security) as other pro ## managing a security issue -Before reporting an issue, particularly one related to crashing, consult [the cheat sheet](https://github.com/bytecodealliance/rfcs/blob/main/accepted/what-is-considered-a-security-bug.md#cheat-sheet-is-this-bug-considered-a-security-vulnerability), _Report a security vulnerability_ if it qualifies. - -Upon receiving an issue, thoroughly review [the cheat sheet](https://github.com/bytecodealliance/rfcs/blob/main/accepted/what-is-considered-a-security-bug.md#cheat-sheet-is-this-bug-considered-a-security-vulnerability) to assess and _Report a security vulnerability_ if the issue is indeed a security vulnerability. - Once a security issue is confirmed, please refer to [the runbook](./security_issue_runbook.md) for the subsequent steps to take. diff --git a/doc/tiered_support.md b/doc/tiered_support.md new file mode 100644 index 0000000000..565d347b29 --- /dev/null +++ b/doc/tiered_support.md @@ -0,0 +1,196 @@ +# Tiered Supported + +**Tier definitions** + +- **A — Production Ready:** fully tested and stable. +- **B — Almost Production Ready:** partially tested; close to production. +- **C — Experimental / Not Production Ready:** unfinished or volatile. + +The condition _tested_ mentioned above specifically refers to whether there are enough tests in CI. + +## Architecture Support + +| Architecture | Tier | +| ------------ | ----- | +| **x86-64** | **A** | +| **x86-32** | **A** | +| AArch64 | B | +| ARC | B | +| ARM | B | +| RISCV32 | B | +| RISCV64 | B | +| THUMB | B | +| XTENSA | B | +| MIPS | C | + +## OS / Platform Support + +| Platform | Tier | +| ------------------ | ----- | +| **NuttX** | **A** | +| **Ubuntu** | **A** | +| Android | B | +| macOS | B | +| Windows | B | +| Zephyr | B | +| AliOS-Things | C | +| Cosmopolitan | C | +| ESP-IDF (FreeRTOS) | C | +| FreeBSD | C | +| iOS | C | +| RT-Thread | C | +| RIOT | C | +| VxWorks | C | + +## WebAssembly Proposal Support + +> During configuration, It is able to disable or enable the following features by setting the corresponding flags (see Appendix). It is also possible to check features status in the configuration output. + +| WASM Proposal / Extension | Tier | +| -------------------------------------- | ----------- | +| **Bulk Memory** | A | +| **Extended Constant Expressions** | A | +| **Import/Export of Mutable Globals** | A | +| **Memory64** | A | +| **Multi-value** | A | +| **Non-trapping float-to-int** | A | +| **Reference Types** | A | +| **Shared Memory (Threads)** | A | +| **SIMD (128-bit)** | A | +| **Sign-extension Operators** | A | +| GC (Garbage Collection) | B | +| Stringref | B | +| Tail Calls | B | +| Multi-memory | C | +| Legacy Exception Handling | C | +| Branch Hinting | Unsupported | +| Custom Annotation Syntax (text format) | Unsupported | +| Exception Handling (new spec) | Unsupported | +| JS String Builtins | Unsupported | +| Relaxed SIMD | Unsupported | + +# WAMR-Specific Feature Support + +> During configuration, It is able to disable or enable the following features by setting the corresponding flags (see Appendix). It is also possible to check features status in the configuration output. + +| WAMR Feature | Tier | +| --------------------------------- | ---- | +| **AoT (wamrc)** | A | +| **AOT intrinsics** | A | +| **Fast Interpreter** | A | +| **Interpreter (classic)** | A | +| **Libc builtin** | A | +| **Libc WASI** | A | +| **Quick AOT/JIT entries** | A | +| **Shrunk memory** | A | +| **Wakeup of blocking operations** | A | +| **WASM C API** | A | +| Fast JIT | B | +| LLVM ORC JIT | B | +| Memory profiling | B | +| Module instance context[^7] | B | +| Multi-module | B | +| Perf profiling | B | +| Pthread | B | +| Shared heap | B | +| WASI threads | B | +| WASI-NN (neural network APIs) | B | +| Debug Interpreter | B | +| Debug AOT | C | +| Tier-up (Fast JIT → LLVM JIT) | C | + +--- + +# Appendix: All compilation flags + +| Compilation flags | Tiered | Default | on Ubuntu | +| ------------------------------------------- | ------ | ------- | --------- | +| WAMR_APP_THREAD_STACK_SIZE_MAX | B | ND[^1] | | +| WAMR_BH_LOG | B | ND | | +| WAMR_BH_VPRINTF | B | ND | | +| WAMR_BUILD_ALLOC_WITH_USAGE | B | ND | | +| WAMR_BUILD_ALLOC_WITH_USER_DATA | B | ND | | +| WAMR_BUILD_AOT | A | ND | 1 | +| WAMR_BUILD_AOT_INTRINSICS | A | 1[^2] | | +| WAMR_BUILD_AOT_STACK_FRAME | A | ND | | +| WAMR_BUILD_AOT_VALIDATOR | B | ND | | +| WAMR_BUILD_BULK_MEMORY | A | 1 | | +| WAMR_BUILD_COPY_CALL_STACK | B | ND | | +| WAMR_BUILD_CUSTOM_NAME_SECTION | B | ND | | +| WAMR_BUILD_DEBUG_AOT | C | ND | | +| WAMR_BUILD_DEBUG_INTERP | B | ND | | +| WAMR_BUILD_DUMP_CALL_STACK | B | ND | | +| WAMR_BUILD_DYNAMIC_AOT_DEBUG | C | ND | | +| WAMR_BUILD_EXCE_HANDLING | C | 0 | | +| WAMR_BUILD_EXTENDED_CONST_EXPR | A | 0 | | +| WAMR_BUILD_FAST_INTERP | A | ND | 1 | +| WAMR_BUILD_FAST_JIT | B | ND | | +| WAMR_BUILD_FAST_JIT_DUMP | B | ND | | +| WAMR_BUILD_GC | B | 0 | | +| WAMR_BUILD_GC_HEAP_VERIFY | B | ND | | +| WAMR_BUILD_GLOBAL_HEAP_POOL | A | ND | | +| WAMR_BUILD_GLOBAL_HEAP_SIZE | A | ND | | +| WAMR_BUILD_INSTRUCTION_METERING | C | ND | | +| WAMR_BUILD_INTERP | A | ND | 1 | +| WAMR_BUILD_INVOKE_NATIVE_GENERAL | B | ND | | +| WAMR_BUILD_JIT | B | ND | | +| WAMR_BUILD_LAZY_JIT | B | 1[^3] | | +| WAMR_BUILD_LIBC_BUILTIN | A | ND | 1 | +| WAMR_BUILD_LIBC_EMCC | C | ND | | +| WAMR_BUILD_LIBC_UVWASI | C | ND | | +| WAMR_BUILD_LIBC_WASI | A | ND | 1 | +| WAMR_BUILD_LIB_PTHREAD | B | ND | | +| WAMR_BUILD_LIB_PTHREAD_SEMAPHORE | B | ND | | +| WAMR_BUILD_LIB_RATS | C | ND | | +| WAMR_BUILD_LIB_WASI_THREADS | B | ND | | +| WAMR_BUILD_LINUX_PERF | B | ND | | +| WAMR_BUILD_LIME1 | A | NO | | +| WAMR_BUILD_LOAD_CUSTOM_SECTION | A | ND | | +| WAMR_BUILD_MEMORY64 | A | 0 | | +| WAMR_BUILD_MEMORY_PROFILING | B | ND | | +| WAMR_BUILD_MINI_LOADER | B | ND | | +| WAMR_BUILD_MODULE_INST_CONTEXT | B | ND | 1 | +| WAMR_BUILD_MULTI_MEMORY | C | 0 | | +| WAMR_BUILD_MULTI_MODULE | B | ND | | +| WAMR_BUILD_PERF_PROFILING | B | ND | | +| WAMR_BUILD_PLATFORM | - | ND | linux | +| WAMR_BUILD_QUICK_AOT_ENTRY | A | 1[^4] | | +| WAMR_BUILD_REF_TYPES | A | ND | 1 | +| WAMR_BUILD_SANITIZER | B | ND | | +| WAMR_BUILD_SGX_IPFS | C | ND | | +| WAMR_BUILD_SHARED_HEAP | A | ND | | +| WAMR_BUILD_SHARED_MEMORY | A | 0 | 1 | +| WAMR_BUILD_SHRUNK_MEMORY | A | ND | 1 | +| WAMR_BUILD_SIMD | A | ND | 1 | +| WAMR_BUILD_SIMDE | A | ND | 1 | +| WAMR_BUILD_SPEC_TEST | A | ND | | +| WAMR_BUILD_STACK_GUARD_SIZE | B | ND | | +| WAMR_BUILD_STATIC_PGO | B | ND | | +| WAMR_BUILD_STRINGREF | B | 0 | | +| WAMR_BUILD_TAIL_CALL | A | 0 | 1 | +| WAMR_BUILD_TARGET | - | ND | X86-64 | +| WAMR_BUILD_THREAD_MGR | A | ND | | +| WAMR_BUILD_WAMR_COMPILER | A | ND | | +| WAMR_BUILD_WASI_EPHEMERAL_NN | B | ND | | +| WAMR_BUILD_WASI_NN | B | ND | | +| WAMR_BUILD_WASI_NN_ENABLE_EXTERNAL_DELEGATE | B | ND | | +| WAMR_BUILD_WASI_NN_ENABLE_GPU | B | ND | | +| WAMR_BUILD_WASI_NN_EXTERNAL_DELEGATE_PATH | B | ND | | +| WAMR_BUILD_WASI_NN_LLAMACPP | B | ND | | +| WAMR_BUILD_WASI_NN_ONNX | B | ND | | +| WAMR_BUILD_WASI_NN_OPENVINO | B | ND | | +| WAMR_BUILD_WASI_NN_TFLITE | B | ND | | +| WAMR_BUILD_WASI_TEST | B | ND | | +| WAMR_BUILD_WASM_CACHE | B | ND | | +| WAMR_CONFIGURABLE_BOUNDS_CHECKS | C | ND | | +| WAMR_DISABLE_APP_ENTRY | A | ND | | +| WAMR_DISABLE_HW_BOUND_CHECK | A | ND | | +| WAMR_DISABLE_STACK_HW_BOUND_CHECK | A | ND | | +| WAMR_DISABLE_WAKEUP_BLOCKING_OP | B | ND | | +| WAMR_DISABLE_WRITE_GS_BASE | B | ND | | +| WAMR_TEST_GC | B | ND | | + +[^1]: _ND_ represents _not defined_ +[^2]: active if `WAMR_BUILD_AOT` is 1 +[^3]: active if `WAMR_BUILD_FAST_JIT` or `WAMR_BUILD_JIT1` is 1 +[^4]: active if `WAMR_BUILD_AOT` or `WAMR_BUILD_JIT` is 1 From 1b9542830e9fa3d6eaabf4df16a9b7224db85473 Mon Sep 17 00:00:00 2001 From: Hiroshi Hatake Date: Thu, 9 Oct 2025 13:09:00 +0900 Subject: [PATCH 076/103] Implement invokeNative asm code for armasm64 assembler on ARM64 Windows (#4636) * Implement invokeNative asm code for armasm64 assembler on ARM64 Windows * Use more solid wrapper for armasm64 executable Signed-off-by: Hiroshi Hatake --- .../common/arch/invokeNative_armasm64.asm | 73 +++++++++++++++++++ .../arch/invokeNative_armasm64_simd.asm | 73 +++++++++++++++++++ core/iwasm/common/iwasm_common.cmake | 68 ++++++++++++++++- 3 files changed, 212 insertions(+), 2 deletions(-) create mode 100644 core/iwasm/common/arch/invokeNative_armasm64.asm create mode 100644 core/iwasm/common/arch/invokeNative_armasm64_simd.asm diff --git a/core/iwasm/common/arch/invokeNative_armasm64.asm b/core/iwasm/common/arch/invokeNative_armasm64.asm new file mode 100644 index 0000000000..0abe160e61 --- /dev/null +++ b/core/iwasm/common/arch/invokeNative_armasm64.asm @@ -0,0 +1,73 @@ + ; Copyright (C) 2019 Intel Corporation. All rights reserved. + ; SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception + + AREA |.text|, CODE, READONLY, ALIGN=2 + + EXPORT invokeNative + +; ------------------------ direct call path ------------------------ + +call_func + mov x20, x30 ; save x30(lr) + blr x19 + mov sp, x22 ; restore sp saved before function call + +return_label + mov x30, x20 ; restore x30(lr) + ldp x19, x20, [sp, #0x20] + ldp x21, x22, [sp, #0x10] + ldp x23, x24, [sp, #0x0] + add sp, sp, #0x30 + ret + +; ------------------------ stack-args path ------------------------ + +handle_stack + ; Reserve aligned stack space for stack arguments and copy them + mov x23, sp + bic sp, x23, #15 ; Ensure 16-byte alignment + lsl x23, x21, #3 ; x23 = nstacks * 8 + add x23, x23, #15 + bic x23, x23, #15 + sub sp, sp, x23 + mov x23, sp + +copy_loop + cmp x21, #0 + b.eq call_func ; when done, branch back to call path + ldr x24, [x20], #8 + str x24, [x23], #8 + sub x21, x21, #1 + b copy_loop + +; ------------------------ function entry ------------------------ + +invokeNative + sub sp, sp, #0x30 + stp x19, x20, [sp, #0x20] ; save the registers + stp x21, x22, [sp, #0x10] + stp x23, x24, [sp, #0x0] + + mov x19, x0 ; x19 = function ptr + mov x20, x1 ; x20 = argv + mov x21, x2 ; x21 = nstacks + mov x22, sp ; save the sp before call function + + ; Fill in floating-point registers + ldp d0, d1, [x20], #16 + ldp d2, d3, [x20], #16 + ldp d4, d5, [x20], #16 + ldp d6, d7, [x20], #16 + + ; Fill integer registers + ldp x0, x1, [x20], #16 ; x0 = argv[8] = exec_env, x1 = argv[9] + ldp x2, x3, [x20], #16 + ldp x4, x5, [x20], #16 + ldp x6, x7, [x20], #16 + + ; Now x20 points to stack args + cmp x21, #0 + b.ne handle_stack ; backward: there are stack args + b call_func ; backward: no stack args + + END diff --git a/core/iwasm/common/arch/invokeNative_armasm64_simd.asm b/core/iwasm/common/arch/invokeNative_armasm64_simd.asm new file mode 100644 index 0000000000..d209f10751 --- /dev/null +++ b/core/iwasm/common/arch/invokeNative_armasm64_simd.asm @@ -0,0 +1,73 @@ + ; Copyright (C) 2019 Intel Corporation. All rights reserved. + ; SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception + + AREA |.text|, CODE, READONLY, ALIGN=2 + + EXPORT invokeNative + +; ------------------------ direct call path ------------------------ + +call_func + mov x20, x30 ; save x30(lr) + blr x19 + mov sp, x22 ; restore sp saved before function call + +return_label + mov x30, x20 ; restore x30(lr) + ldp x19, x20, [sp, #0x20] + ldp x21, x22, [sp, #0x10] + ldp x23, x24, [sp, #0x0] + add sp, sp, #0x30 + ret + +; ------------------------ stack-args path ------------------------ + +handle_stack + ; Reserve aligned stack space for stack arguments and copy them + mov x23, sp + bic sp, x23, #15 ; Ensure 16-byte alignment + lsl x23, x21, #3 ; x23 = nstacks * 8 + add x23, x23, #15 + bic x23, x23, #15 + sub sp, sp, x23 + mov x23, sp + +copy_loop + cmp x21, #0 + b.eq call_func ; when done, branch back to call path + ldr x24, [x20], #8 + str x24, [x23], #8 + sub x21, x21, #1 + b copy_loop + +; ------------------------ function entry ------------------------ + +invokeNative + sub sp, sp, #0x30 + stp x19, x20, [sp, #0x20] ; save the registers + stp x21, x22, [sp, #0x10] + stp x23, x24, [sp, #0x0] + + mov x19, x0 ; x19 = function ptr + mov x20, x1 ; x20 = argv + mov x21, x2 ; x21 = nstacks + mov x22, sp ; save the sp before call function + + ; Fill in floating-point registers + ; v0 = argv[0], v1 = argv[1], v2 = argv[2], v3 = argv[3] + ld1 {v0.2D, v1.2D, v2.2D, v3.2D}, [x20], #64 + ; v4 = argv[4], v5 = argv[5], v6 = argv[6], v7 = argv[7] + ld1 {v4.2D, v5.2D, v6.2D, v7.2D}, [x20], #64 + + ; Fill integer registers + ldp x0, x1, [x20], #16 ; x0 = argv[8] = exec_env, x1 = argv[9] + ldp x2, x3, [x20], #16 + ldp x4, x5, [x20], #16 + ldp x6, x7, [x20], #16 + + ; Now x20 points to stack args + cmp x21, #0 + b.ne handle_stack ; (backward) there are stack args + b call_func ; (backward) no stack args + + END diff --git a/core/iwasm/common/iwasm_common.cmake b/core/iwasm/common/iwasm_common.cmake index 15895b8e5e..c3653f156c 100644 --- a/core/iwasm/common/iwasm_common.cmake +++ b/core/iwasm/common/iwasm_common.cmake @@ -4,6 +4,42 @@ set (IWASM_COMMON_DIR ${CMAKE_CURRENT_LIST_DIR}) include_directories (${IWASM_COMMON_DIR}) +if (MSVC AND WAMR_BUILD_PLATFORM STREQUAL "windows" AND WAMR_BUILD_TARGET MATCHES "AARCH64.*") + if (DEFINED ENV{VCToolsInstallDir}) + # Detect host tool dir + set(_ARMASM64_CANDIDATES + "$ENV{VCToolsInstallDir}/bin/HostX64/ARM64/armasm64.exe" + "$ENV{VCToolsInstallDir}/bin/HostARM64/arm64/armasm64.exe") + set(_ARMASM64_EXE "") + foreach(_p IN LISTS _ARMASM64_CANDIDATES) + if (EXISTS "${_p}") + set(_ARMASM64_EXE "${_p}") + break() + endif() + endforeach() + if (_ARMASM64_EXE STREQUAL "") + message(FATAL_ERROR "armasm64.exe not found under VCToolsInstallDir") + endif() + + # Wrapper without spaces to avoid quoting hell on NMake/cmd.exe + set(_WRAP "${CMAKE_BINARY_DIR}/armasm64_wrapper.bat") + file(WRITE "${_WRAP}" +"@echo off\r\n\"${_ARMASM64_EXE}\" %*\r\n") + + # Use wrapper as compiler (no spaces in path) + set(CMAKE_ASM_MASM_COMPILER + "${_WRAP}" + CACHE FILEPATH "" FORCE) + + # Quote ONLY object and source (compiler path has no spaces now) + set(CMAKE_ASM_MASM_COMPILE_OBJECT + " /nologo -o \"\" \"\"" + CACHE STRING "" FORCE) + + else() + message(FATAL_ERROR "VCToolsInstallDir is not defined. Please run from a Developer Command Prompt or specify armasm64.exe manually.") + endif() +endif() add_definitions(-DBH_MALLOC=wasm_runtime_malloc) add_definitions(-DBH_FREE=wasm_runtime_free) @@ -79,9 +115,37 @@ elseif (WAMR_BUILD_TARGET MATCHES "THUMB.*") endif () elseif (WAMR_BUILD_TARGET MATCHES "AARCH64.*") if (NOT WAMR_BUILD_SIMD EQUAL 1) - set (source_all ${c_source_all} ${IWASM_COMMON_DIR}/arch/invokeNative_aarch64.s) + if (WAMR_BUILD_PLATFORM STREQUAL "windows") + if (MSVC) + set (source_all ${c_source_all} ${IWASM_COMMON_DIR}/arch/invokeNative_armasm64.asm) + set(_WAMR_ARM64_MASM_SOURCES ${IWASM_COMMON_DIR}/arch/invokeNative_armasm64.asm) + set_source_files_properties(${_WAMR_ARM64_MASM_SOURCES} + PROPERTIES + LANGUAGE ASM_MASM + COMPILE_DEFINITIONS "" + INCLUDE_DIRECTORIES "" + COMPILE_OPTIONS "/nologo" + ) + endif () + else () + set (source_all ${c_source_all} ${IWASM_COMMON_DIR}/arch/invokeNative_aarch64.s) + endif () else() - set (source_all ${c_source_all} ${IWASM_COMMON_DIR}/arch/invokeNative_aarch64_simd.s) + if (WAMR_BUILD_PLATFORM STREQUAL "windows") + if (MSVC) + set (source_all ${c_source_all} ${IWASM_COMMON_DIR}/arch/invokeNative_armasm64_simd.asm) + set(_WAMR_ARM64_MASM_SOURCES_SIMD ${IWASM_COMMON_DIR}/arch/invokeNative_armasm64_simd.asm) + set_source_files_properties(${_WAMR_ARM64_MASM_SOURCES_SIMD} + PROPERTIES + LANGUAGE ASM_MASM + COMPILE_DEFINITIONS "" + INCLUDE_DIRECTORIES "" + COMPILE_OPTIONS "/nologo" + ) + endif () + else () + set (source_all ${c_source_all} ${IWASM_COMMON_DIR}/arch/invokeNative_aarch64_simd.s) + endif () endif() elseif (WAMR_BUILD_TARGET STREQUAL "MIPS") set (source_all ${c_source_all} ${IWASM_COMMON_DIR}/arch/invokeNative_mips.s) From df908048de3990c9a74056d44c0870c5efb9dd04 Mon Sep 17 00:00:00 2001 From: Aiden Grossman Date: Wed, 8 Oct 2025 22:33:11 -0700 Subject: [PATCH 077/103] Switch from deprecated overload of createTargetMachine (#4650) The overload accepting the string version of a triple will be removed soon, so switch over to the one that accepts a triple object. https://github.com/llvm/llvm-project/pull/161053 --- core/iwasm/compilation/aot_llvm_extra2.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/core/iwasm/compilation/aot_llvm_extra2.cpp b/core/iwasm/compilation/aot_llvm_extra2.cpp index 5e1fdf6ce6..bc49c54bbb 100644 --- a/core/iwasm/compilation/aot_llvm_extra2.cpp +++ b/core/iwasm/compilation/aot_llvm_extra2.cpp @@ -157,8 +157,13 @@ LLVMCreateTargetMachineWithOpts(LLVMTargetRef ctarget, const char *triple, auto ol = convert(opt_level); bool jit; auto cm = convert(code_model, &jit); +#if LLVM_VERSION_MAJOR >= 21 + auto targetmachine = target->createTargetMachine( + llvm::Triple(triple), cpu, features, opts, rm, cm, ol, jit); +#else auto targetmachine = target->createTargetMachine(triple, cpu, features, opts, rm, cm, ol, jit); +#endif #if LLVM_VERSION_MAJOR >= 18 // always place data in normal data section. // From d7b6bc5aca989f8a558249518d51274d0b0c92ba Mon Sep 17 00:00:00 2001 From: Liu Jia Date: Sun, 12 Oct 2025 20:18:25 +0800 Subject: [PATCH 078/103] Add a watchdog to prevent the similar crash in AOT mode (#4625) --- core/iwasm/aot/aot_runtime.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/core/iwasm/aot/aot_runtime.c b/core/iwasm/aot/aot_runtime.c index 3bf33e1276..2c7df68e69 100644 --- a/core/iwasm/aot/aot_runtime.c +++ b/core/iwasm/aot/aot_runtime.c @@ -114,6 +114,13 @@ set_error_buf_v(char *error_buf, uint32 error_buf_size, const char *format, ...) } } +static void +aot_unlinked_import_func_trap(WASMExecEnv *exec_env) +{ + AOTModuleInstance *module_inst = (AOTModuleInstance *)exec_env->module_inst; + aot_set_exception_with_id(module_inst, EXCE_CALL_UNLINKED_IMPORT_FUNC); +} + static void * runtime_malloc(uint64 size, char *error_buf, uint32 error_buf_size) { @@ -1397,6 +1404,7 @@ init_func_ptrs(AOTModuleInstance *module_inst, AOTModule *module, * Debugging: Check if the import is resolved at link time */ LOG_WARNING("warning: failed to link import function (%s, %s)", module_name, field_name); + *func_ptrs = (void *)aot_unlinked_import_func_trap; } } From 7aff7372e210d29c48cffcb0fea452be1394c869 Mon Sep 17 00:00:00 2001 From: William Furr <519506+wffurr@users.noreply.github.com> Date: Tue, 14 Oct 2025 22:39:05 -0400 Subject: [PATCH 079/103] Merge version update to 2.4.2 back into main branch (#4661) * Add release notes for WAMR-2.4.2 (#4624) * bump version to 2.4.2 (#4626) --- RELEASE_NOTES.md | 16 ++++++++++++++++ build-scripts/version.cmake | 2 +- core/version.h | 2 +- 3 files changed, 18 insertions(+), 2 deletions(-) diff --git a/RELEASE_NOTES.md b/RELEASE_NOTES.md index 4904d39492..15fe80d81b 100644 --- a/RELEASE_NOTES.md +++ b/RELEASE_NOTES.md @@ -1,3 +1,19 @@ +## WAMR-2.4.2 + +### Breaking Changes + +### New Features + +### Bug Fixes + +- CVE-2025-58749. Fix a potential hang issue in LLVMJIT mode + +### Enhancements + +### Others + +--- + ## WAMR-2.4.1 ### Breaking Changes diff --git a/build-scripts/version.cmake b/build-scripts/version.cmake index 637b3ba7b6..1d8437da3f 100644 --- a/build-scripts/version.cmake +++ b/build-scripts/version.cmake @@ -8,7 +8,7 @@ endif() set(WAMR_VERSION_MAJOR 2) set(WAMR_VERSION_MINOR 4) -set(WAMR_VERSION_PATCH 1) +set(WAMR_VERSION_PATCH 2) message("-- WAMR version: ${WAMR_VERSION_MAJOR}.${WAMR_VERSION_MINOR}.${WAMR_VERSION_PATCH}") diff --git a/core/version.h b/core/version.h index 261c9b8cf9..7892846808 100644 --- a/core/version.h +++ b/core/version.h @@ -18,7 +18,7 @@ /* clang-format off */ #define WAMR_VERSION_MAJOR 2 #define WAMR_VERSION_MINOR 4 -#define WAMR_VERSION_PATCH 1 +#define WAMR_VERSION_PATCH 2 /* clang-format on */ #endif From 8be32732ffbfbd60af1cb93c809cb9d5dbd2f346 Mon Sep 17 00:00:00 2001 From: Keisuke Horii Date: Thu, 16 Oct 2025 11:19:19 +0900 Subject: [PATCH 080/103] Resolved a bug in the socket API example (#4667) * Fixed a bug in its script * Applied the wasi-sdk-pthread toolchain file Related issue: #4649 --- samples/socket-api/CMakeLists.txt | 11 ++++------- samples/socket-api/sample_test_run.py | 2 +- 2 files changed, 5 insertions(+), 8 deletions(-) diff --git a/samples/socket-api/CMakeLists.txt b/samples/socket-api/CMakeLists.txt index f09da910a9..ca3484668d 100644 --- a/samples/socket-api/CMakeLists.txt +++ b/samples/socket-api/CMakeLists.txt @@ -34,7 +34,7 @@ endif() message(CHECK_START "Detecting WASI_TOOLCHAIN_FILE at ${WASI_SDK_DIR}") find_file(WASI_TOOLCHAIN_FILE - wasi-sdk.cmake + wasi-sdk-pthread.cmake PATHS "${WASI_SDK_DIR}/share/cmake" NO_DEFAULT_PATH NO_CMAKE_FIND_ROOT_PATH @@ -46,7 +46,7 @@ else() endif() if(WASI_TOOLCHAIN_FILE-NOTFOUND) - message(FATAL_ERROR "Can not find wasi-sdk.cmake under ${WASI_SDK_DIR}") + message(FATAL_ERROR "Can not find wasi-sdk-pthread.cmake under ${WASI_SDK_DIR}") endif() message(CHECK_START "Detecting WASI_SYS_ROOT at ${WASI_SDK_DIR}") @@ -80,10 +80,7 @@ ExternalProject_Add(wasm-app SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/wasm-src UPDATE_COMMAND "" PATCH_COMMAND "" - CONFIGURE_COMMAND ${CMAKE_COMMAND} -E copy - ${CMAKE_CURRENT_SOURCE_DIR}/../../wamr-sdk/app/libc-builtin-sysroot/include/pthread.h - ${CMAKE_CURRENT_SOURCE_DIR}/wasm-src/inc - && ${CMAKE_COMMAND} + CONFIGURE_COMMAND ${CMAKE_COMMAND} -DWASI_SDK_PREFIX=${WASI_SDK_DIR} -DCMAKE_TOOLCHAIN_FILE=${WASI_TOOLCHAIN_FILE} -DCMAKE_SYSROOT=${WASI_SYS_ROOT} @@ -170,8 +167,8 @@ set(WAMR_BUILD_AOT 1) set(WAMR_BUILD_JIT 0) set(WAMR_BUILD_LIBC_BUILTIN 1) set(WAMR_BUILD_LIBC_WASI 1) -set(WAMR_BUILD_LIB_PTHREAD 1) set(WAMR_BUILD_REF_TYPES 1) +set(WAMR_BUILD_LIB_WASI_THREADS 1) # compiling and linking flags if (NOT (CMAKE_C_COMPILER MATCHES ".*clang.*" OR CMAKE_C_COMPILER_ID MATCHES ".*Clang")) diff --git a/samples/socket-api/sample_test_run.py b/samples/socket-api/sample_test_run.py index 6e9153b248..9951a3766f 100755 --- a/samples/socket-api/sample_test_run.py +++ b/samples/socket-api/sample_test_run.py @@ -31,7 +31,7 @@ def run_cmd(cmd, cwd): shlex.split(cmd), cwd=cwd, check=False, capture_output=True ) if (qry_prc.returncode != 0): - print("Run {} failed, return {}".format(cmd), qry_prc.returncode) + print("Run {} failed, return {}".format(cmd, qry_prc.returncode)) return print("return code: {}, output:\n{}".format(qry_prc.returncode, qry_prc.stdout.decode())) From 163acd2259ba8489621dfcecbd2395e8d39141b7 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 16 Oct 2025 10:19:32 +0800 Subject: [PATCH 081/103] build(deps): Bump github/codeql-action from 3.30.6 to 4.30.8 (#4666) Bumps [github/codeql-action](https://github.com/github/codeql-action) from 3.30.6 to 4.30.8. - [Release notes](https://github.com/github/codeql-action/releases) - [Commits](https://github.com/github/codeql-action/compare/v3.30.6...v4.30.8) --- updated-dependencies: - dependency-name: github/codeql-action dependency-version: 4.30.8 dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/codeql.yml | 6 +++--- .github/workflows/supply_chain.yml | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml index 5a5afec1fc..7fd0c2d260 100644 --- a/.github/workflows/codeql.yml +++ b/.github/workflows/codeql.yml @@ -53,7 +53,7 @@ jobs: # Initializes the CodeQL tools for scanning. - name: Initialize CodeQL - uses: github/codeql-action/init@v3.30.6 + uses: github/codeql-action/init@v4.30.8 with: languages: ${{ matrix.language }} @@ -70,7 +70,7 @@ jobs: - run: | ./.github/scripts/codeql_buildscript.sh - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@v3.30.6 + uses: github/codeql-action/analyze@v4.30.8 with: category: "/language:${{matrix.language}}" upload: false @@ -99,7 +99,7 @@ jobs: output: ${{ steps.step1.outputs.sarif-output }}/cpp.sarif - name: Upload CodeQL results to code scanning - uses: github/codeql-action/upload-sarif@v3.30.6 + uses: github/codeql-action/upload-sarif@v4.30.8 with: sarif_file: ${{ steps.step1.outputs.sarif-output }} category: "/language:${{matrix.language}}" diff --git a/.github/workflows/supply_chain.yml b/.github/workflows/supply_chain.yml index 407a7113fd..8d64949c01 100644 --- a/.github/workflows/supply_chain.yml +++ b/.github/workflows/supply_chain.yml @@ -60,6 +60,6 @@ jobs: # Upload the results to GitHub's code scanning dashboard. - name: "Upload to code-scanning" - uses: github/codeql-action/upload-sarif@065c6cfb7809de8db2167a953b5b622491cda914 + uses: github/codeql-action/upload-sarif@17783bfb99b07f70fae080b654aed0c514057477 with: sarif_file: results.sarif From 826ae6eb01a9e722d3d5f46d8a5c9872afbb93a7 Mon Sep 17 00:00:00 2001 From: "liang.he" Date: Thu, 16 Oct 2025 10:19:44 +0800 Subject: [PATCH 082/103] Prevent `BuildPhi` from encountering a null llvm_entry_block (#4663) There is a scenario where `aot_compile_op_block()` does not prepare a block for `if`. As a result, the return value of `LLVMBuildPhi()` in `push_aot_block_to_stack_and_pass_params()` will be dangling, leading to a memory leak as it cannot be released. --- core/iwasm/compilation/aot_emit_control.c | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/core/iwasm/compilation/aot_emit_control.c b/core/iwasm/compilation/aot_emit_control.c index 6817295f86..ce4c2e1bdb 100644 --- a/core/iwasm/compilation/aot_emit_control.c +++ b/core/iwasm/compilation/aot_emit_control.c @@ -495,15 +495,17 @@ push_aot_block_to_stack_and_pass_params(AOTCompContext *comp_ctx, /* Create param phis */ for (i = 0; i < block->param_count; i++) { - SET_BUILDER_POS(block->llvm_entry_block); - snprintf(name, sizeof(name), "%s%d_phi%d", - block_name_prefix[block->label_type], block->block_index, - i); - if (!(block->param_phis[i] = LLVMBuildPhi( - comp_ctx->builder, TO_LLVM_TYPE(block->param_types[i]), - name))) { - aot_set_last_error("llvm build phi failed."); - goto fail; + if (block->llvm_entry_block) { + SET_BUILDER_POS(block->llvm_entry_block); + snprintf(name, sizeof(name), "%s%d_phi%d", + block_name_prefix[block->label_type], + block->block_index, i); + if (!(block->param_phis[i] = LLVMBuildPhi( + comp_ctx->builder, + TO_LLVM_TYPE(block->param_types[i]), name))) { + aot_set_last_error("llvm build phi failed."); + goto fail; + } } if (block->label_type == LABEL_TYPE_IF From d25fdc37095358d8986c809f7814fd39641d10de Mon Sep 17 00:00:00 2001 From: Xenia Lu Date: Thu, 16 Oct 2025 10:20:16 +0800 Subject: [PATCH 083/103] fix: typo in AOT stack dump with GC (#4657) --- core/iwasm/aot/aot_runtime.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/iwasm/aot/aot_runtime.c b/core/iwasm/aot/aot_runtime.c index 2c7df68e69..a5760f4918 100644 --- a/core/iwasm/aot/aot_runtime.c +++ b/core/iwasm/aot/aot_runtime.c @@ -4503,7 +4503,7 @@ aot_create_call_stack(struct WASMExecEnv *exec_env) frame.frame_ref = (uint8 *)frame.lp + (frame_ref - (uint8 *)lp); /* copy local ref flags from AOT module */ bh_memcpy_s(frame.frame_ref, local_ref_flags_cell_num, - local_ref_flags, lp_size); + local_ref_flags, local_ref_flags_cell_num); #endif } From 3bf08a0eda39d97324dac99fff087012bf0407bf Mon Sep 17 00:00:00 2001 From: Xenia Lu Date: Thu, 16 Oct 2025 10:20:50 +0800 Subject: [PATCH 084/103] loader: fix block/loop ref params type checking (#4647) * loader: fix block/loop ref params type checking --- core/iwasm/interpreter/wasm_loader.c | 29 ++++++++++++++++ .../ba-issues/issues/issue-4646/test.wasm | Bin 0 -> 157 bytes .../ba-issues/issues/issue-4646/test.wat | 31 ++++++++++++++++++ .../regression/ba-issues/running_config.json | 16 +++++++++ 4 files changed, 76 insertions(+) create mode 100644 tests/regression/ba-issues/issues/issue-4646/test.wasm create mode 100644 tests/regression/ba-issues/issues/issue-4646/test.wat diff --git a/core/iwasm/interpreter/wasm_loader.c b/core/iwasm/interpreter/wasm_loader.c index 19ca249496..5874931e05 100644 --- a/core/iwasm/interpreter/wasm_loader.c +++ b/core/iwasm/interpreter/wasm_loader.c @@ -12050,9 +12050,25 @@ wasm_loader_prepare_bytecode(WASMModule *module, WASMFunction *func, WASMFuncType *wasm_type = block_type.u.type; BranchBlock *cur_block = loader_ctx->frame_csp - 1; +#if WASM_ENABLE_GC != 0 + WASMRefType *ref_type; + uint32 j = 0; +#endif #if WASM_ENABLE_FAST_INTERP != 0 uint32 cell_num; available_params = block_type.u.type->param_count; +#endif +#if WASM_ENABLE_GC != 0 + /* find the index of the last param + * in wasm_type->ref_type_maps as j */ + for (i = 0; i < block_type.u.type->param_count; i++) { + if (wasm_is_type_multi_byte_type(wasm_type->types[i])) { + j += 1; + } + } + if (j > 0) { + j -= 1; + } #endif for (i = 0; i < block_type.u.type->param_count; i++) { @@ -12066,6 +12082,19 @@ wasm_loader_prepare_bytecode(WASMModule *module, WASMFunction *func, #endif break; } +#if WASM_ENABLE_GC != 0 + if (wasm_is_type_multi_byte_type( + wasm_type + ->types[wasm_type->param_count - i - 1])) { + bh_assert(wasm_type->ref_type_maps[j].index + == wasm_type->param_count - i - 1); + ref_type = wasm_type->ref_type_maps[j].ref_type; + bh_memcpy_s(&wasm_ref_type, sizeof(WASMRefType), + ref_type, + wasm_reftype_struct_size(ref_type)); + j--; + } +#endif POP_TYPE( wasm_type->types[wasm_type->param_count - i - 1]); diff --git a/tests/regression/ba-issues/issues/issue-4646/test.wasm b/tests/regression/ba-issues/issues/issue-4646/test.wasm new file mode 100644 index 0000000000000000000000000000000000000000..e163405eec49af2539875c7c9b672d1d0afe4aa5 GIT binary patch literal 157 zcmXxWF%E(-7zWVq`&+=ks1u2CFwUN#UZhmY;80AU4lecz9>jxq5O2{%7T)yW=0E`4 z7nX^ZFIq{5~@ptN&zQv~W0k1)0QAp>T2`7(o|+lBdv id8-U*+6HGmx-hUJba1y(9~3rooF09&j_a literal 0 HcmV?d00001 diff --git a/tests/regression/ba-issues/issues/issue-4646/test.wat b/tests/regression/ba-issues/issues/issue-4646/test.wat new file mode 100644 index 0000000000..3fd503c550 --- /dev/null +++ b/tests/regression/ba-issues/issues/issue-4646/test.wat @@ -0,0 +1,31 @@ +;; define different reference types +(type $struct_a (struct (field (mut i32)))) +(type $struct_b (struct (field (mut i64)))) +(type $struct_c (struct (field (mut i32)) (field (mut i32)))) + +(func $main + ;; prepare parameters: i32, ref_a, i32, ref_b + (i32.const 10) + (struct.new $struct_a (i32.const 100)) + (i32.const 20) + (struct.new $struct_b (i64.const 200)) + + ;; block with interleaved parameters: i32, ref_a, i32, ref_b -> ref_c + (block (param i32 (ref $struct_a) i32 (ref $struct_b)) (result (ref $struct_c)) + ;; clean up parameters from stack + drop ;; drop ref_b + drop ;; drop i32 + drop ;; drop ref_a + drop ;; drop i32 + + ;; return new type reference struct_c + (struct.new $struct_c (i32.const 300) (i32.const 400)) + ) + + ;; drop return value + drop +) + +(memory 1) +(export "memory" (memory 0)) +(export "_start" (func $main)) \ No newline at end of file diff --git a/tests/regression/ba-issues/running_config.json b/tests/regression/ba-issues/running_config.json index decc6861aa..bc62c54915 100644 --- a/tests/regression/ba-issues/running_config.json +++ b/tests/regression/ba-issues/running_config.json @@ -1770,6 +1770,22 @@ "stdout content": "", "description": "no 'invalid local type'" } + }, + { + "deprecated": false, + "ids": [ + 4646 + ], + "runtime": "iwasm-default-gc-enabled", + "file": "test.wasm", + "mode": "classic-interp", + "options": "-f _start", + "argument": "", + "expected return": { + "ret code": 0, + "stdout content": "", + "description": "load successfully" + } } ] } From 0ecaf8c7da04086a490e3205371adc827cf53dfd Mon Sep 17 00:00:00 2001 From: Liu Jia Date: Thu, 23 Oct 2025 11:27:30 +0800 Subject: [PATCH 085/103] add validation of dynamic_offset (#4563) * add check_dynamic_offset_pop --- core/iwasm/interpreter/wasm_loader.c | 12 +++++++++++- core/iwasm/interpreter/wasm_mini_loader.c | 12 +++++++++++- 2 files changed, 22 insertions(+), 2 deletions(-) diff --git a/core/iwasm/interpreter/wasm_loader.c b/core/iwasm/interpreter/wasm_loader.c index 5874931e05..1453f1bfae 100644 --- a/core/iwasm/interpreter/wasm_loader.c +++ b/core/iwasm/interpreter/wasm_loader.c @@ -8542,6 +8542,15 @@ check_offset_pop(WASMLoaderContext *ctx, uint32 cells) return true; } +static bool +check_dynamic_offset_pop(WASMLoaderContext *ctx, uint32 cells) +{ + if (ctx->dynamic_offset < 0 + || (ctx->dynamic_offset > 0 && (uint32)ctx->dynamic_offset < cells)) + return false; + return true; +} + static void free_label_patch_list(BranchBlock *frame_csp) { @@ -9980,7 +9989,8 @@ wasm_loader_pop_frame_offset(WASMLoaderContext *ctx, uint8 type, return true; ctx->frame_offset -= cell_num_to_pop; - if ((*(ctx->frame_offset) > ctx->start_dynamic_offset) + if (check_dynamic_offset_pop(ctx, cell_num_to_pop) + && (*(ctx->frame_offset) > ctx->start_dynamic_offset) && (*(ctx->frame_offset) < ctx->max_dynamic_offset)) ctx->dynamic_offset -= cell_num_to_pop; diff --git a/core/iwasm/interpreter/wasm_mini_loader.c b/core/iwasm/interpreter/wasm_mini_loader.c index b9dcc9877a..ec1e25cdb1 100644 --- a/core/iwasm/interpreter/wasm_mini_loader.c +++ b/core/iwasm/interpreter/wasm_mini_loader.c @@ -4342,6 +4342,15 @@ check_offset_pop(WASMLoaderContext *ctx, uint32 cells) return true; } +static bool +check_dynamic_offset_pop(WASMLoaderContext *ctx, uint32 cells) +{ + if (ctx->dynamic_offset < 0 + || (ctx->dynamic_offset > 0 && (uint32)ctx->dynamic_offset < cells)) + return false; + return true; +} + static void free_label_patch_list(BranchBlock *frame_csp) { @@ -5256,7 +5265,8 @@ wasm_loader_pop_frame_offset(WASMLoaderContext *ctx, uint8 type, return true; ctx->frame_offset -= cell_num_to_pop; - if ((*(ctx->frame_offset) > ctx->start_dynamic_offset) + if (check_dynamic_offset_pop(ctx, cell_num_to_pop) + && (*(ctx->frame_offset) > ctx->start_dynamic_offset) && (*(ctx->frame_offset) < ctx->max_dynamic_offset)) ctx->dynamic_offset -= cell_num_to_pop; From 053481d61460e9a7b51a90cbd7523557a80f1935 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 23 Oct 2025 11:28:12 +0800 Subject: [PATCH 086/103] build(deps): Bump actions/setup-node from 5 to 6 (#4674) Bumps [actions/setup-node](https://github.com/actions/setup-node) from 5 to 6. - [Release notes](https://github.com/actions/setup-node/releases) - [Commits](https://github.com/actions/setup-node/compare/v5...v6) --- updated-dependencies: - dependency-name: actions/setup-node dependency-version: '6' dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/build_wamr_vscode_ext.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build_wamr_vscode_ext.yml b/.github/workflows/build_wamr_vscode_ext.yml index 02a6ac7a32..1b4f3fc5d8 100644 --- a/.github/workflows/build_wamr_vscode_ext.yml +++ b/.github/workflows/build_wamr_vscode_ext.yml @@ -27,7 +27,7 @@ jobs: - uses: actions/checkout@v5 - name: Use Node.js 18.x - uses: actions/setup-node@v5 + uses: actions/setup-node@v6 with: node-version: 18.x From 9ee9ff0d73c86844a86fa49af7f93314bfc2394f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 23 Oct 2025 11:28:23 +0800 Subject: [PATCH 087/103] build(deps): Bump github/codeql-action from 4.30.8 to 4.30.9 (#4673) Bumps [github/codeql-action](https://github.com/github/codeql-action) from 4.30.8 to 4.30.9. - [Release notes](https://github.com/github/codeql-action/releases) - [Commits](https://github.com/github/codeql-action/compare/v4.30.8...v4.30.9) --- updated-dependencies: - dependency-name: github/codeql-action dependency-version: 4.30.9 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/codeql.yml | 6 +++--- .github/workflows/supply_chain.yml | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml index 7fd0c2d260..fc4bb571bc 100644 --- a/.github/workflows/codeql.yml +++ b/.github/workflows/codeql.yml @@ -53,7 +53,7 @@ jobs: # Initializes the CodeQL tools for scanning. - name: Initialize CodeQL - uses: github/codeql-action/init@v4.30.8 + uses: github/codeql-action/init@v4.30.9 with: languages: ${{ matrix.language }} @@ -70,7 +70,7 @@ jobs: - run: | ./.github/scripts/codeql_buildscript.sh - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@v4.30.8 + uses: github/codeql-action/analyze@v4.30.9 with: category: "/language:${{matrix.language}}" upload: false @@ -99,7 +99,7 @@ jobs: output: ${{ steps.step1.outputs.sarif-output }}/cpp.sarif - name: Upload CodeQL results to code scanning - uses: github/codeql-action/upload-sarif@v4.30.8 + uses: github/codeql-action/upload-sarif@v4.30.9 with: sarif_file: ${{ steps.step1.outputs.sarif-output }} category: "/language:${{matrix.language}}" diff --git a/.github/workflows/supply_chain.yml b/.github/workflows/supply_chain.yml index 8d64949c01..ac1241c719 100644 --- a/.github/workflows/supply_chain.yml +++ b/.github/workflows/supply_chain.yml @@ -60,6 +60,6 @@ jobs: # Upload the results to GitHub's code scanning dashboard. - name: "Upload to code-scanning" - uses: github/codeql-action/upload-sarif@17783bfb99b07f70fae080b654aed0c514057477 + uses: github/codeql-action/upload-sarif@d88a5540c3fd916f4e15b7744d287a124278e065 with: sarif_file: results.sarif From 34c6fc94e92893660400e4d457b8197508379f6c Mon Sep 17 00:00:00 2001 From: "liang.he" Date: Thu, 23 Oct 2025 13:15:25 +0800 Subject: [PATCH 088/103] Bump version number to 2.4.3 (#4671) --- RELEASE_NOTES.md | 16 ++++++++++++++++ build-scripts/version.cmake | 2 +- core/version.h | 2 +- 3 files changed, 18 insertions(+), 2 deletions(-) diff --git a/RELEASE_NOTES.md b/RELEASE_NOTES.md index 15fe80d81b..56455b8742 100644 --- a/RELEASE_NOTES.md +++ b/RELEASE_NOTES.md @@ -1,3 +1,19 @@ +## WAMR-2.4.3 + +### Breaking Changes + +### New Features + +### Bug Fixes + +- libc-wasi: add missing pointer validations to socket functions (#4611) (#4665) + +### Enhancements + +### Others + +--- + ## WAMR-2.4.2 ### Breaking Changes diff --git a/build-scripts/version.cmake b/build-scripts/version.cmake index 1d8437da3f..accbe5fd5a 100644 --- a/build-scripts/version.cmake +++ b/build-scripts/version.cmake @@ -8,7 +8,7 @@ endif() set(WAMR_VERSION_MAJOR 2) set(WAMR_VERSION_MINOR 4) -set(WAMR_VERSION_PATCH 2) +set(WAMR_VERSION_PATCH 3) message("-- WAMR version: ${WAMR_VERSION_MAJOR}.${WAMR_VERSION_MINOR}.${WAMR_VERSION_PATCH}") diff --git a/core/version.h b/core/version.h index 7892846808..1baffd2dc7 100644 --- a/core/version.h +++ b/core/version.h @@ -18,7 +18,7 @@ /* clang-format off */ #define WAMR_VERSION_MAJOR 2 #define WAMR_VERSION_MINOR 4 -#define WAMR_VERSION_PATCH 2 +#define WAMR_VERSION_PATCH 3 /* clang-format on */ #endif From 25c5d575a1441dbadef562c3f9a1015356ad0fac Mon Sep 17 00:00:00 2001 From: TianlongLiang <111852609+TianlongLiang@users.noreply.github.com> Date: Thu, 23 Oct 2025 13:15:35 +0800 Subject: [PATCH 089/103] fix warning sign-compare and macro-redefined on Zephyr platform (#4668) --- core/shared/platform/common/math/math.c | 6 +++--- core/shared/platform/zephyr/platform_internal.h | 2 ++ 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/core/shared/platform/common/math/math.c b/core/shared/platform/common/math/math.c index ac0c402210..3c0171570f 100644 --- a/core/shared/platform/common/math/math.c +++ b/core/shared/platform/common/math/math.c @@ -851,7 +851,7 @@ freebsd_floor(double x) i0 += 1; else { j = i1 + (1 << (52 - j0)); - if (j < i1) + if (j < (u_int32_t)i1) i0 += 1; /* got a carry */ i1 = j; } @@ -913,7 +913,7 @@ freebsd_ceil(double x) i0 += 1; else { j = i1 + (1 << (52 - j0)); - if (j < i1) + if (j < (u_int32_t)i1) i0 += 1; /* got a carry */ i1 = j; } @@ -1345,7 +1345,7 @@ freebsd_pow(double x, double y) k = (iy >> 20) - 0x3ff; /* exponent */ if (k > 20) { j = ly >> (52 - k); - if ((j << (52 - k)) == ly) + if (((u_int32_t)(j << (52 - k))) == ly) yisint = 2 - (j & 1); } else if (ly == 0) { diff --git a/core/shared/platform/zephyr/platform_internal.h b/core/shared/platform/zephyr/platform_internal.h index d5f0c80d81..134b5c2b5f 100644 --- a/core/shared/platform/zephyr/platform_internal.h +++ b/core/shared/platform/zephyr/platform_internal.h @@ -290,7 +290,9 @@ typedef struct timespec os_timespec; #define CLOCK_REALTIME 1 #endif +#ifndef CLOCK_MONOTONIC #define CLOCK_MONOTONIC 4 +#endif static inline int os_sched_yield(void) From 4c371e655ae89e0c01aa58cc792eca42aaadd4d0 Mon Sep 17 00:00:00 2001 From: Xenia Lu Date: Thu, 23 Oct 2025 13:15:42 +0800 Subject: [PATCH 090/103] fix: false OOB in array.fill for interp (#4645) * cherry-pick gc spec test case * Fix false OOB in array.fill --- core/iwasm/interpreter/wasm_interp_classic.c | 2 +- core/iwasm/interpreter/wasm_interp_fast.c | 2 +- .../gc_array_fill_cases.patch | 27 +++++++++++++++++++ tests/wamr-test-suites/test_wamr.sh | 1 + 4 files changed, 30 insertions(+), 2 deletions(-) create mode 100644 tests/wamr-test-suites/spec-test-script/gc_array_fill_cases.patch diff --git a/core/iwasm/interpreter/wasm_interp_classic.c b/core/iwasm/interpreter/wasm_interp_classic.c index 9ba3a5f4f0..0603a00b41 100644 --- a/core/iwasm/interpreter/wasm_interp_classic.c +++ b/core/iwasm/interpreter/wasm_interp_classic.c @@ -3165,7 +3165,7 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module, if (len > 0) { if ((uint64)start_offset + len - >= wasm_array_obj_length(array_obj)) { + > wasm_array_obj_length(array_obj)) { wasm_set_exception( module, "out of bounds array access"); goto got_exception; diff --git a/core/iwasm/interpreter/wasm_interp_fast.c b/core/iwasm/interpreter/wasm_interp_fast.c index 90bdb8f17d..8e634ecb7f 100644 --- a/core/iwasm/interpreter/wasm_interp_fast.c +++ b/core/iwasm/interpreter/wasm_interp_fast.c @@ -2562,7 +2562,7 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module, if (len > 0) { if ((uint64)start_offset + len - >= wasm_array_obj_length(array_obj)) { + > wasm_array_obj_length(array_obj)) { wasm_set_exception( module, "out of bounds array access"); goto got_exception; diff --git a/tests/wamr-test-suites/spec-test-script/gc_array_fill_cases.patch b/tests/wamr-test-suites/spec-test-script/gc_array_fill_cases.patch new file mode 100644 index 0000000000..e10f207f37 --- /dev/null +++ b/tests/wamr-test-suites/spec-test-script/gc_array_fill_cases.patch @@ -0,0 +1,27 @@ +diff --git a/test/core/gc/array_fill.wast b/test/core/gc/array_fill.wast +index 0379ad53..73122178 100644 +--- a/test/core/gc/array_fill.wast ++++ b/test/core/gc/array_fill.wast +@@ -79,3 +79,22 @@ + (assert_return (invoke "array_get_nth" (i32.const 2)) (i32.const 11)) + (assert_return (invoke "array_get_nth" (i32.const 3)) (i32.const 11)) + (assert_return (invoke "array_get_nth" (i32.const 4)) (i32.const 0)) ++ ++;; fill the whole array ++(assert_return (invoke "array_fill" (i32.const 0) (i32.const 42) (i32.const 12))) ++(assert_return (invoke "array_get_nth" (i32.const 0)) (i32.const 42)) ++(assert_return (invoke "array_get_nth" (i32.const 2)) (i32.const 42)) ++(assert_return (invoke "array_get_nth" (i32.const 5)) (i32.const 42)) ++(assert_return (invoke "array_get_nth" (i32.const 11)) (i32.const 42)) ++ ++;; fill the first element ++(assert_return (invoke "array_fill" (i32.const 0) (i32.const 7) (i32.const 1))) ++(assert_return (invoke "array_get_nth" (i32.const 0)) (i32.const 7)) ++(assert_return (invoke "array_get_nth" (i32.const 1)) (i32.const 42)) ++(assert_return (invoke "array_get_nth" (i32.const 11)) (i32.const 42)) ++ ++;; fill the last 2 elements ++(assert_return (invoke "array_fill" (i32.const 10) (i32.const 9) (i32.const 2))) ++(assert_return (invoke "array_get_nth" (i32.const 9)) (i32.const 42)) ++(assert_return (invoke "array_get_nth" (i32.const 10)) (i32.const 9)) ++(assert_return (invoke "array_get_nth" (i32.const 11)) (i32.const 9)) diff --git a/tests/wamr-test-suites/test_wamr.sh b/tests/wamr-test-suites/test_wamr.sh index 1edf363bcb..8c637cea92 100755 --- a/tests/wamr-test-suites/test_wamr.sh +++ b/tests/wamr-test-suites/test_wamr.sh @@ -478,6 +478,7 @@ function spec_test() # Dec 9, 2024. Merge branch 'funcref' git reset --hard 756060f5816c7e2159f4817fbdee76cf52f9c923 git apply --ignore-whitespace ../../spec-test-script/gc_ignore_cases.patch || exit 1 + git apply --ignore-whitespace ../../spec-test-script/gc_array_fill_cases.patch || exit 1 if [[ ${ENABLE_QEMU} == 1 ]]; then # Decrease the recursive count for tail call cases as nuttx qemu's From 75e5b4ea82a1923f4d4ed0b40229f6f72428dae9 Mon Sep 17 00:00:00 2001 From: YAMAMOTO Takashi Date: Thu, 23 Oct 2025 16:57:19 +0900 Subject: [PATCH 091/103] product-mini/platforms/rt-thread: migrate to InstantiationArgs2 (#4597) This is a preparation for https://github.com/bytecodealliance/wasm-micro-runtime/issues/4364 --- product-mini/platforms/rt-thread/iwasm.c | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/product-mini/platforms/rt-thread/iwasm.c b/product-mini/platforms/rt-thread/iwasm.c index 9c2b43b791..39ddfaebb7 100644 --- a/product-mini/platforms/rt-thread/iwasm.c +++ b/product-mini/platforms/rt-thread/iwasm.c @@ -262,6 +262,7 @@ iwasm(int argc, char **argv) wasm_module_t wasm_module = NULL; wasm_module_inst_t wasm_module_inst = NULL; RuntimeInitArgs init_args; + struct InstantiationArgs2 *inst_args; static char error_buf[128] = { 0 }; /* avoid stack overflow */ #if WASM_ENABLE_LIBC_WASI != 0 @@ -369,13 +370,23 @@ iwasm(int argc, char **argv) rt_kprintf("%s\n", error_buf); goto fail2; } + + if (!wasm_runtime_instantiation_args_create(&inst_args)) { + rt_kprintf("failed to create instantiate args\n"); + goto fail3; + } + wasm_runtime_instantiation_args_set_default_stack_size(inst_args, + stack_size); + wasm_runtime_instantiation_args_set_host_managed_heap_size(inst_args, + heap_size); #if WASM_ENABLE_LIBC_WASI != 0 libc_wasi_init(wasm_module, argc, argv, &wasi_parse_ctx); #endif rt_memset(error_buf, 0x00, sizeof(error_buf)); - wasm_module_inst = wasm_runtime_instantiate( - wasm_module, stack_size, heap_size, error_buf, sizeof(error_buf)); + wasm_module_inst = wasm_runtime_instantiate_ex2( + wasm_module, inst_args, error_buf, sizeof(error_buf)); + wasm_runtime_instantiation_args_destroy(inst_args); if (!wasm_module_inst) { rt_kprintf("%s\n", error_buf); goto fail3; From 3b8b265f1f804e883f340ba75687f6e678961d40 Mon Sep 17 00:00:00 2001 From: YAMAMOTO Takashi Date: Thu, 23 Oct 2025 16:57:50 +0900 Subject: [PATCH 092/103] Pass InstantiationArgs2 down to aot_instantiate/wasm_instantiate (#4594) This is a preparation for https://github.com/bytecodealliance/wasm-micro-runtime/issues/4364 No functional changes are intended. --- core/iwasm/aot/aot_runtime.c | 10 ++-- core/iwasm/aot/aot_runtime.h | 9 ++-- core/iwasm/common/wasm_runtime_common.c | 48 +++++++++---------- core/iwasm/common/wasm_runtime_common.h | 12 +++-- core/iwasm/interpreter/wasm_runtime.c | 9 ++-- core/iwasm/interpreter/wasm_runtime.h | 4 +- .../lib-pthread/lib_pthread_wrapper.c | 5 +- .../lib_wasi_threads_wrapper.c | 5 +- .../libraries/thread-mgr/thread_manager.c | 5 +- 9 files changed, 61 insertions(+), 46 deletions(-) diff --git a/core/iwasm/aot/aot_runtime.c b/core/iwasm/aot/aot_runtime.c index a5760f4918..55c962f4a6 100644 --- a/core/iwasm/aot/aot_runtime.c +++ b/core/iwasm/aot/aot_runtime.c @@ -1897,8 +1897,9 @@ check_linked_symbol(AOTModule *module, char *error_buf, uint32 error_buf_size) AOTModuleInstance * aot_instantiate(AOTModule *module, AOTModuleInstance *parent, - WASMExecEnv *exec_env_main, uint32 stack_size, uint32 heap_size, - uint32 max_memory_pages, char *error_buf, uint32 error_buf_size) + WASMExecEnv *exec_env_main, + const struct InstantiationArgs2 *args, char *error_buf, + uint32 error_buf_size) { AOTModuleInstance *module_inst; #if WASM_ENABLE_BULK_MEMORY != 0 || WASM_ENABLE_REF_TYPES != 0 @@ -1916,6 +1917,9 @@ aot_instantiate(AOTModule *module, AOTModuleInstance *parent, #if WASM_ENABLE_MULTI_MODULE != 0 bool ret = false; #endif + uint32 stack_size = args->v1.default_stack_size; + uint32 heap_size = args->v1.host_managed_heap_size; + uint32 max_memory_pages = args->v1.max_memory_pages; /* Align and validate heap size */ heap_size = align_uint(heap_size, 8); @@ -1997,7 +2001,7 @@ aot_instantiate(AOTModule *module, AOTModuleInstance *parent, ret = wasm_runtime_sub_module_instantiate( (WASMModuleCommon *)module, (WASMModuleInstanceCommon *)module_inst, - stack_size, heap_size, max_memory_pages, error_buf, error_buf_size); + args, error_buf, error_buf_size); if (!ret) { LOG_DEBUG("build a sub module list failed"); goto fail; diff --git a/core/iwasm/aot/aot_runtime.h b/core/iwasm/aot/aot_runtime.h index d06cd10812..687c75e142 100644 --- a/core/iwasm/aot/aot_runtime.h +++ b/core/iwasm/aot/aot_runtime.h @@ -544,10 +544,7 @@ aot_resolve_import_func(AOTModule *module, AOTImportFunc *import_func); * * @param module the AOT module to instantiate * @param parent the parent module instance - * @param heap_size the default heap size of the module instance, a heap will - * be created besides the app memory space. Both wasm app and native - * function can allocate memory from the heap. If heap_size is 0, the - * default heap size will be used. + * @param args the instantiation parameters * @param error_buf buffer to output the error info if failed * @param error_buf_size the size of the error buffer * @@ -555,8 +552,8 @@ aot_resolve_import_func(AOTModule *module, AOTImportFunc *import_func); */ AOTModuleInstance * aot_instantiate(AOTModule *module, AOTModuleInstance *parent, - WASMExecEnv *exec_env_main, uint32 stack_size, uint32 heap_size, - uint32 max_memory_pages, char *error_buf, + WASMExecEnv *exec_env_main, + const struct InstantiationArgs2 *args, char *error_buf, uint32 error_buf_size); /** diff --git a/core/iwasm/common/wasm_runtime_common.c b/core/iwasm/common/wasm_runtime_common.c index 26283b3f8b..5c832a64e8 100644 --- a/core/iwasm/common/wasm_runtime_common.c +++ b/core/iwasm/common/wasm_runtime_common.c @@ -1623,41 +1623,45 @@ wasm_runtime_get_max_mem(uint32 max_memory_pages, uint32 module_init_page_count, WASMModuleInstanceCommon * wasm_runtime_instantiate_internal(WASMModuleCommon *module, WASMModuleInstanceCommon *parent, - WASMExecEnv *exec_env_main, uint32 stack_size, - uint32 heap_size, uint32 max_memory_pages, + WASMExecEnv *exec_env_main, + const struct InstantiationArgs2 *args, char *error_buf, uint32 error_buf_size) { #if WASM_ENABLE_INTERP != 0 if (module->module_type == Wasm_Module_Bytecode) return (WASMModuleInstanceCommon *)wasm_instantiate( (WASMModule *)module, (WASMModuleInstance *)parent, exec_env_main, - stack_size, heap_size, max_memory_pages, error_buf, error_buf_size); + args, error_buf, error_buf_size); #endif #if WASM_ENABLE_AOT != 0 if (module->module_type == Wasm_Module_AoT) return (WASMModuleInstanceCommon *)aot_instantiate( (AOTModule *)module, (AOTModuleInstance *)parent, exec_env_main, - stack_size, heap_size, max_memory_pages, error_buf, error_buf_size); + args, error_buf, error_buf_size); #endif set_error_buf(error_buf, error_buf_size, "Instantiate module failed, invalid module type"); return NULL; } +void +wasm_runtime_instantiation_args_set_defaults(struct InstantiationArgs2 *args) +{ + memset(args, 0, sizeof(*args)); +} + WASMModuleInstanceCommon * wasm_runtime_instantiate(WASMModuleCommon *module, uint32 stack_size, uint32 heap_size, char *error_buf, uint32 error_buf_size) { - return wasm_runtime_instantiate_internal(module, NULL, NULL, stack_size, - heap_size, 0, error_buf, - error_buf_size); -} - -static void -instantiation_args_set_defaults(struct InstantiationArgs2 *args) -{ - memset(args, 0, sizeof(*args)); + struct InstantiationArgs2 args; + wasm_runtime_instantiation_args_set_defaults(&args); + wasm_runtime_instantiation_args_set_default_stack_size(&args, stack_size); + wasm_runtime_instantiation_args_set_host_managed_heap_size(&args, + heap_size); + return wasm_runtime_instantiate_internal(module, NULL, NULL, &args, + error_buf, error_buf_size); } WASMModuleInstanceCommon * @@ -1666,7 +1670,7 @@ wasm_runtime_instantiate_ex(WASMModuleCommon *module, uint32 error_buf_size) { struct InstantiationArgs2 v2; - instantiation_args_set_defaults(&v2); + wasm_runtime_instantiation_args_set_defaults(&v2); v2.v1 = *args; return wasm_runtime_instantiate_ex2(module, &v2, error_buf, error_buf_size); } @@ -1678,7 +1682,7 @@ wasm_runtime_instantiation_args_create(struct InstantiationArgs2 **p) if (args == NULL) { return false; } - instantiation_args_set_defaults(args); + wasm_runtime_instantiation_args_set_defaults(args); *p = args; return true; } @@ -1715,10 +1719,8 @@ wasm_runtime_instantiate_ex2(WASMModuleCommon *module, const struct InstantiationArgs2 *args, char *error_buf, uint32 error_buf_size) { - return wasm_runtime_instantiate_internal( - module, NULL, NULL, args->v1.default_stack_size, - args->v1.host_managed_heap_size, args->v1.max_memory_pages, error_buf, - error_buf_size); + return wasm_runtime_instantiate_internal(module, NULL, NULL, args, + error_buf, error_buf_size); } void @@ -7666,9 +7668,8 @@ wasm_runtime_load_depended_module(const WASMModuleCommon *parent_module, bool wasm_runtime_sub_module_instantiate(WASMModuleCommon *module, WASMModuleInstanceCommon *module_inst, - uint32 stack_size, uint32 heap_size, - uint32 max_memory_pages, char *error_buf, - uint32 error_buf_size) + const struct InstantiationArgs2 *args, + char *error_buf, uint32 error_buf_size) { bh_list *sub_module_inst_list = NULL; WASMRegisteredModule *sub_module_list_node = NULL; @@ -7696,8 +7697,7 @@ wasm_runtime_sub_module_instantiate(WASMModuleCommon *module, WASMModuleCommon *sub_module = sub_module_list_node->module; WASMModuleInstanceCommon *sub_module_inst = NULL; sub_module_inst = wasm_runtime_instantiate_internal( - sub_module, NULL, NULL, stack_size, heap_size, max_memory_pages, - error_buf, error_buf_size); + sub_module, NULL, NULL, args, error_buf, error_buf_size); if (!sub_module_inst) { LOG_DEBUG("instantiate %s failed", sub_module_list_node->module_name); diff --git a/core/iwasm/common/wasm_runtime_common.h b/core/iwasm/common/wasm_runtime_common.h index a315c75da6..88af687447 100644 --- a/core/iwasm/common/wasm_runtime_common.h +++ b/core/iwasm/common/wasm_runtime_common.h @@ -616,6 +616,9 @@ struct InstantiationArgs2 { InstantiationArgs v1; }; +void +wasm_runtime_instantiation_args_set_defaults(struct InstantiationArgs2 *args); + /* See wasm_export.h for description */ WASM_RUNTIME_API_EXTERN bool wasm_runtime_init(void); @@ -683,8 +686,8 @@ wasm_runtime_get_max_mem(uint32 max_memory_pages, uint32 module_init_page_count, WASMModuleInstanceCommon * wasm_runtime_instantiate_internal(WASMModuleCommon *module, WASMModuleInstanceCommon *parent, - WASMExecEnv *exec_env_main, uint32 stack_size, - uint32 heap_size, uint32 max_memory_pages, + WASMExecEnv *exec_env_main, + const struct InstantiationArgs2 *args, char *error_buf, uint32 error_buf_size); /* Internal API */ @@ -1064,9 +1067,8 @@ wasm_runtime_load_depended_module(const WASMModuleCommon *parent_module, bool wasm_runtime_sub_module_instantiate(WASMModuleCommon *module, WASMModuleInstanceCommon *module_inst, - uint32 stack_size, uint32 heap_size, - uint32 max_memory_pages, char *error_buf, - uint32 error_buf_size); + const struct InstantiationArgs2 *args, + char *error_buf, uint32 error_buf_size); void wasm_runtime_sub_module_deinstantiate(WASMModuleInstanceCommon *module_inst); #endif diff --git a/core/iwasm/interpreter/wasm_runtime.c b/core/iwasm/interpreter/wasm_runtime.c index 3642adf9b0..e81bbf6e01 100644 --- a/core/iwasm/interpreter/wasm_runtime.c +++ b/core/iwasm/interpreter/wasm_runtime.c @@ -2421,8 +2421,8 @@ wasm_set_running_mode(WASMModuleInstance *module_inst, RunningMode running_mode) */ WASMModuleInstance * wasm_instantiate(WASMModule *module, WASMModuleInstance *parent, - WASMExecEnv *exec_env_main, uint32 stack_size, - uint32 heap_size, uint32 max_memory_pages, char *error_buf, + WASMExecEnv *exec_env_main, + const struct InstantiationArgs2 *args, char *error_buf, uint32 error_buf_size) { WASMModuleInstance *module_inst; @@ -2440,6 +2440,9 @@ wasm_instantiate(WASMModule *module, WASMModuleInstance *parent, bool ret = false; #endif const bool is_sub_inst = parent != NULL; + uint32 stack_size = args->v1.default_stack_size; + uint32 heap_size = args->v1.host_managed_heap_size; + uint32 max_memory_pages = args->v1.max_memory_pages; if (!module) return NULL; @@ -2515,7 +2518,7 @@ wasm_instantiate(WASMModule *module, WASMModuleInstance *parent, &module_inst->e->sub_module_inst_list_head; ret = wasm_runtime_sub_module_instantiate( (WASMModuleCommon *)module, (WASMModuleInstanceCommon *)module_inst, - stack_size, heap_size, max_memory_pages, error_buf, error_buf_size); + args, error_buf, error_buf_size); if (!ret) { LOG_DEBUG("build a sub module list failed"); goto fail; diff --git a/core/iwasm/interpreter/wasm_runtime.h b/core/iwasm/interpreter/wasm_runtime.h index 16c670f0fa..0ba2049af9 100644 --- a/core/iwasm/interpreter/wasm_runtime.h +++ b/core/iwasm/interpreter/wasm_runtime.h @@ -553,8 +553,8 @@ wasm_resolve_import_func(const WASMModule *module, WASMModuleInstance * wasm_instantiate(WASMModule *module, WASMModuleInstance *parent, - WASMExecEnv *exec_env_main, uint32 stack_size, - uint32 heap_size, uint32 max_memory_pages, char *error_buf, + WASMExecEnv *exec_env_main, + const struct InstantiationArgs2 *args, char *error_buf, uint32 error_buf_size); void diff --git a/core/iwasm/libraries/lib-pthread/lib_pthread_wrapper.c b/core/iwasm/libraries/lib-pthread/lib_pthread_wrapper.c index b3fa57d721..d7dca2f1df 100644 --- a/core/iwasm/libraries/lib-pthread/lib_pthread_wrapper.c +++ b/core/iwasm/libraries/lib-pthread/lib_pthread_wrapper.c @@ -561,6 +561,7 @@ pthread_create_wrapper(wasm_exec_env_t exec_env, uint32 aux_stack_size; uint64 aux_stack_start = 0; int32 ret = -1; + struct InstantiationArgs2 args; bh_assert(module); bh_assert(module_inst); @@ -579,8 +580,10 @@ pthread_create_wrapper(wasm_exec_env_t exec_env, } #endif + wasm_runtime_instantiation_args_set_defaults(&args); + wasm_runtime_instantiation_args_set_default_stack_size(&args, stack_size); if (!(new_module_inst = wasm_runtime_instantiate_internal( - module, module_inst, exec_env, stack_size, 0, 0, NULL, 0))) + module, module_inst, exec_env, &args, NULL, 0))) return -1; /* Set custom_data to new module instance */ diff --git a/core/iwasm/libraries/lib-wasi-threads/lib_wasi_threads_wrapper.c b/core/iwasm/libraries/lib-wasi-threads/lib_wasi_threads_wrapper.c index c9512fb432..65b75ac28e 100644 --- a/core/iwasm/libraries/lib-wasi-threads/lib_wasi_threads_wrapper.c +++ b/core/iwasm/libraries/lib-wasi-threads/lib_wasi_threads_wrapper.c @@ -80,14 +80,17 @@ thread_spawn_wrapper(wasm_exec_env_t exec_env, uint32 start_arg) int32 thread_id; uint32 stack_size = 8192; int32 ret = -1; + struct InstantiationArgs2 args; bh_assert(module); bh_assert(module_inst); stack_size = ((WASMModuleInstance *)module_inst)->default_wasm_stack_size; + wasm_runtime_instantiation_args_set_defaults(&args); + wasm_runtime_instantiation_args_set_default_stack_size(&args, stack_size); if (!(new_module_inst = wasm_runtime_instantiate_internal( - module, module_inst, exec_env, stack_size, 0, 0, NULL, 0))) + module, module_inst, exec_env, &args, NULL, 0))) return -1; wasm_runtime_set_custom_data_internal( diff --git a/core/iwasm/libraries/thread-mgr/thread_manager.c b/core/iwasm/libraries/thread-mgr/thread_manager.c index 8f3a6317ba..5a647a9b64 100644 --- a/core/iwasm/libraries/thread-mgr/thread_manager.c +++ b/core/iwasm/libraries/thread-mgr/thread_manager.c @@ -501,13 +501,16 @@ wasm_cluster_spawn_exec_env(WASMExecEnv *exec_env) uint32 aux_stack_size; uint64 aux_stack_start; uint32 stack_size = 8192; + struct InstantiationArgs2 args; if (!module_inst || !(module = wasm_exec_env_get_module(exec_env))) { return NULL; } + wasm_runtime_instantiation_args_set_defaults(&args); + wasm_runtime_instantiation_args_set_default_stack_size(&args, stack_size); if (!(new_module_inst = wasm_runtime_instantiate_internal( - module, module_inst, exec_env, stack_size, 0, 0, NULL, 0))) { + module, module_inst, exec_env, &args, NULL, 0))) { return NULL; } From ba9f9d180f80766ace2df9d22c92c4b0f768f409 Mon Sep 17 00:00:00 2001 From: TianlongLiang <111852609+TianlongLiang@users.noreply.github.com> Date: Thu, 23 Oct 2025 16:00:04 +0800 Subject: [PATCH 093/103] Port gitbook document to main (#4621) * Import Gitbook v1.0 (#1732) Modify existing documents, add markdown files for Gitbook to generate the webpage --- SUMMARY.md | 90 +++++++++++ gitbook/advance-tutorial/README.md | 7 + .../performance-benchmark/README.md | 18 +++ .../remote-applicatoin-management/README.md | 7 + gitbook/appendix/background_knowledge.md | 61 ++++++++ gitbook/appendix/webassembly_details.md | 6 + gitbook/basics/getting-started/README.md | 13 ++ .../getting-started/host_prerequsites.md | 40 +++++ gitbook/basics/getting-started/on_docker.md | 26 ++++ gitbook/basics/getting-started/on_host.md | 26 ++++ gitbook/basics/introduction/README.md | 5 + .../basics/introduction/security_feature.md | 147 ++++++++++++++++++ gitbook/basics/introduction/wamr_project.md | 65 ++++++++ gitbook/basics/introduction/webassembly.md | 52 +++++++ gitbook/examples/README.md | 11 ++ gitbook/features/README.md | 39 +++++ gitbook/features/demo-examples/README.md | 15 ++ gitbook/features/user-case/README.md | 10 ++ gitbook/home_page.md | 15 ++ gitbook/programmer's-manual/C_API_Lists.md | 3 + gitbook/programmer's-manual/README.md | 6 + gitbook/tutorial/README.md | 9 ++ gitbook/tutorial/build-tutorial/README.md | 36 +++++ .../tutorial/build-tutorial/build_wamrc.md | 23 +++ .../tutorial/debugging&IDE-support/README.md | 3 + gitbook/tutorial/language-embedding/README.md | 9 ++ gitbook/tutorial/running-modes/README.md | 29 ++++ samples/basic/README.md | 4 +- samples/file/README.md | 3 + samples/multi-module/README.md | 3 + samples/multi-thread/README.md | 3 + samples/native-lib/README.md | 3 + samples/ref-types/README.md | 3 + samples/sgx-ra/README.md | 3 + samples/socket-api/README.md | 3 + samples/spawn-thread/README.md | 3 + samples/wasm-c-api/README.md | 3 + samples/workload/README.md | 3 + 38 files changed, 804 insertions(+), 1 deletion(-) create mode 100644 SUMMARY.md create mode 100644 gitbook/advance-tutorial/README.md create mode 100644 gitbook/advance-tutorial/performance-benchmark/README.md create mode 100644 gitbook/advance-tutorial/remote-applicatoin-management/README.md create mode 100644 gitbook/appendix/background_knowledge.md create mode 100644 gitbook/appendix/webassembly_details.md create mode 100644 gitbook/basics/getting-started/README.md create mode 100644 gitbook/basics/getting-started/host_prerequsites.md create mode 100644 gitbook/basics/getting-started/on_docker.md create mode 100644 gitbook/basics/getting-started/on_host.md create mode 100644 gitbook/basics/introduction/README.md create mode 100644 gitbook/basics/introduction/security_feature.md create mode 100644 gitbook/basics/introduction/wamr_project.md create mode 100644 gitbook/basics/introduction/webassembly.md create mode 100644 gitbook/examples/README.md create mode 100644 gitbook/features/README.md create mode 100644 gitbook/features/demo-examples/README.md create mode 100644 gitbook/features/user-case/README.md create mode 100644 gitbook/home_page.md create mode 100644 gitbook/programmer's-manual/C_API_Lists.md create mode 100644 gitbook/programmer's-manual/README.md create mode 100644 gitbook/tutorial/README.md create mode 100644 gitbook/tutorial/build-tutorial/README.md create mode 100644 gitbook/tutorial/build-tutorial/build_wamrc.md create mode 100644 gitbook/tutorial/debugging&IDE-support/README.md create mode 100644 gitbook/tutorial/language-embedding/README.md create mode 100644 gitbook/tutorial/running-modes/README.md create mode 100644 samples/multi-thread/README.md create mode 100644 samples/ref-types/README.md create mode 100644 samples/spawn-thread/README.md diff --git a/SUMMARY.md b/SUMMARY.md new file mode 100644 index 0000000000..ea0d9a3040 --- /dev/null +++ b/SUMMARY.md @@ -0,0 +1,90 @@ +# Summary: structure of chapters and subchapters of the book + +* [WAMR Document Home Page](gitbook/home_page.md) + +## Basics + +* [Introduction](gitbook/basics/introduction/README.md) + * [WebAssembly](gitbook/basics/introduction/webassembly.md) + * [WAMR Project](gitbook/basics/introduction/wamr_project.md) + * [Security Feature](gitbook/basics/introduction/security_feature.md) + +* [Getting Started](gitbook/basics/getting-started/README.md) + * [Host Environment Preparation](gitbook/basics/getting-started/host_prerequsites.md) + * [Hello-world Program On Host](gitbook/basics/getting-started/on_host.md) + * [Docker Environment Preparation](doc/devcontainer.md) + * [Hello-world Program On Docker](gitbook/basics/getting-started/on_docker.md) + * [Build And Run WASM Application](doc/build_wasm_app.md) + * [More Tools To Create WASM Application](doc/other_wasm_compilers.md) + +## WAMR In Practice + +* [Tutorial](gitbook/tutorial/README.md) + * [WAMR Running Modes](gitbook/tutorial/running-modes/README.md) + * [Build Tutorial](gitbook/tutorial/build-tutorial/README.md) + * [Build iwasm](doc/build_wamr.md) + * [Build wamrc](gitbook/tutorial/build-tutorial/build_wamrc.md) + * [Language Embedding](gitbook/tutorial/language-embedding/README.md) + * [C/C++](doc/embed_wamr.md) + * [Python](language-bindings/python/README.md) + * [Go](language-bindings/go/README.md) + * [Debugging & IDE Support](gitbook/tutorial/debugging%26IDE-support/README.md) + * [WAMR Source Debugging With LLDB](doc/source_debugging.md) + * [VS Code Support](test-tools/wamr-ide/README.md) + * [Enable Debugging In VS Code](test-tools/wamr-ide/VSCode-Extension/README.md) + * [Move LLDB Binaries](test-tools/wamr-ide/VSCode-Extension/resource/debug/README.md) + +* [Advance Tutorial](gitbook/advance-tutorial/README.md) + * [Performance Test](gitbook/advance-tutorial/performance-benchmark/README.md) + * [PolyBench](tests/benchmarks/polybench/README.md) + * [CoreMark](tests/benchmarks/coremark/README.md) + * [Sightglass](tests/benchmarks/sightglass/README.md) + * [JetStream2](tests/benchmarks/jetstream/README.md) + * [Memory Usage Tunning](doc/memory_tune.md) + * [WAMR Porting Guide](doc/port_wamr.md) + +* [Features](gitbook/features/README.md) + * [Export Native APIs To WASM Applications](doc/export_native_api.md) + * [Example 1: Export C Functions to WASM](samples/basic/README.md) + * [Example 2: Using "native-lib"](samples/native-lib/README.md) + * [Multiple Modules As Dependencies](doc/multi_module.md) + * [Multi-modules Example](samples/multi-module/README.md) + * [Multi-thread, Pthread APIs And Thread Management](doc/pthread_library.md) + * [Multi-thread Example](samples/multi-thread/README.md) + * [Linux SGX(Intel Software Guard Extension) Support](doc/linux_sgx.md) + * [Linux SGX Remote Attestation](samples/sgx-ra/README.md) + * [XIP(Execution In Place) Support](doc/xip.md) + * [Socket Support](doc/socket_api.md) + * [Example: Use Socket Api in WAMR](samples/socket-api/README.md) + * [Post-MVP Features](gitbook/features/demo-examples/README.md) + * [WASM C API](samples/wasm-c-api/README.md) + * [128-bit SIMD](samples/workload/README.md) + * [Reference Types](samples/ref-types/README.md) + +* [More Examples](gitbook/examples/README.md) + * [File Interaction Of WASI](samples/file/README.md) + * [Same WASM Program Executing Concurrently](samples/spawn-thread/README.md) + * [Build And Run Workload](samples/workload/README.md) + +* [User Case](gitbook/features/user-case/README.md) + +## Programmer's Manual + +* [Programmer's Manual](gitbook/programmer's-manual/README.md) + * [C API Lists](gitbook/programmer's-manual/C_API_Lists.md) + +## Community + +* [How To Contribute](CONTRIBUTING.md) + +* [WAMR On Github](https://github.com/bytecodealliance/wasm-micro-runtime) + +* [WAMR Blogs](https://bytecodealliance.github.io/wamr.dev/) + +## Appendix + +* [Appendix A. Background Knowledge And Glossary Of Terms](gitbook/appendix/background_knowledge.md) + +* [Appendix B. WebAssembly Details](gitbook/appendix/webassembly_details.md) + +* [Appendix C. Complete WAMR Guide](README.md) diff --git a/gitbook/advance-tutorial/README.md b/gitbook/advance-tutorial/README.md new file mode 100644 index 0000000000..4a02cc026c --- /dev/null +++ b/gitbook/advance-tutorial/README.md @@ -0,0 +1,7 @@ +# Advance tutorial + +Welcome to the chapter of the advanced tutorial. + +If you care about performance(don't we all?), want to know whether WAMR stands out among other wasm runtimes with respect to your demands, or wish to fine-tune your wasm application's memory footprint. You could refer to [this section](performance-benchmark/README.md) + +In later sections, you can find the tutorial on how to use [application framework](../../doc/wamr_api.md) and [dynamic management](remote-applicatoin-management/README.md). Also, there is a tutorial on [how to port WAMR to the platform](../../doc/port_wamr.md) diff --git a/gitbook/advance-tutorial/performance-benchmark/README.md b/gitbook/advance-tutorial/performance-benchmark/README.md new file mode 100644 index 0000000000..84095e5d0f --- /dev/null +++ b/gitbook/advance-tutorial/performance-benchmark/README.md @@ -0,0 +1,18 @@ +# Performance Test + +Like word on the street said(no way it's just us saying!) or you may saw in previous chapters(maybe multiple times), WAMR is a **lightweight** standalone WebAssembly (WASM) runtime with **small footprint**, **high performance** and highly configurable features. + +Well, you don't have to take our word for it. You could run the [Benchmarks in our repo](https://github.com/bytecodealliance/wasm-micro-runtime/tree/main/tests/benchmarks) and decide whether the performance is good enough. + +We provide multiple benchmarks that you could try: + +- [PolyBench](../../../tests/benchmarks/polybench/README.md) +- [CoreMark](../../../tests/benchmarks/coremark/README.md) +- [Sightglass](../../../tests/benchmarks/sightglass/README.md) +- [JetStream2](../../../tests/benchmarks/jetstream/README.md) + +For the memory footprint, you can refer to the links below. + +- [Performance and footprint data](https://github.com/bytecodealliance/wasm-micro-runtime/wiki/Performance): checkout [here](https://github.com/bytecodealliance/wasm-micro-runtime/wiki/Performance) for the performance and footprint data + +And in the next section, we provide tutorials on memory usage tuning. You can [profile memory usage](../../../doc/build_wamr.md#enable-memory-profiling-experiment) and [tunning memory usage](../../../doc/memory_tune.md) diff --git a/gitbook/advance-tutorial/remote-applicatoin-management/README.md b/gitbook/advance-tutorial/remote-applicatoin-management/README.md new file mode 100644 index 0000000000..d1d2568feb --- /dev/null +++ b/gitbook/advance-tutorial/remote-applicatoin-management/README.md @@ -0,0 +1,7 @@ +# Remote application management + +The WAMR application manager supports **remote application management**(check out local directory {WAMR-DIR}/core/app-mgr or [same directory on GitHub](https://github.com/bytecodealliance/wasm-micro-runtime/tree/main/core/app-mgr) for more) from the host environment or the cloud through any physical communications such as TCP, UPD, UART, BLE, etc. Its modular design makes it able to support application management for different managed runtimes. + +The tool **host_tool** (check out local directory {WAMR-DIR}/test-tools/host-tool or [same directory on GitHub](https://github.com/bytecodealliance/wasm-micro-runtime/tree/main/test-tools/host-tool) for more) communicates to the WAMR app manager for installing/uninstalling the wasm applications on the companion chip from the host system. + +We have two example demos of the use of **host_tool**. One is the [simple example](../../../samples/simple/README.md) using the tool "host_tool" to remotely install/uninstall wasm applications from the WAMR runtime over either TCP socket or UART cable; the other is the [IoT App Store Demo](../../../test-tools/IoT-APP-Store-Demo/README.md) showing the concept of remotely managing the device applications from the cloud. diff --git a/gitbook/appendix/background_knowledge.md b/gitbook/appendix/background_knowledge.md new file mode 100644 index 0000000000..61c1719d2f --- /dev/null +++ b/gitbook/appendix/background_knowledge.md @@ -0,0 +1,61 @@ +# Some background knowledge + +In this section, we aggregate some basic background knowledge and jargon in our project field. This section could be served as a refresher for those who have left academia for a while and cannot fully recall all the weary details and exact meaning of jargon in the Compiler course. Also, it would be a great primer for those who did not take such a course and are interested in such a field(and, of course, our fantastic WAMR project). + +We think providing such a section would be nice so that you do not have to Google around. If there is anything you find inaccurate, you think should be included, or even better, you have something for us that would perfect this section, do feel free to reach out to us on [GitHub](https://github.com/bytecodealliance/wasm-micro-runtime)! + +Let's dive right into our exciting recitation/learning journey without further ado! + +## 1. Compiler + +### 1.1 What is a Compiler? + +Strictly speaking(formal definition you usually find in textbooks), the compiler is a special computer program, a system program(serves as a platform for other software), to be more precise. It takes a source program as input and outputs a target program. The source program is written in the source programming language, and usually, it is a high-level programming language such as C/C++, Java, Rust, and so on. The target program is written in a target programming language would be a low-level programming language like assembly. Take C/C++ as an example, the input for the GCC compiler(component) is a C/C++ translation unit(a source file along with any header it used), and the output is platform-dependent assembly code. + +However, in our daily life, what we usually mean when we refer to the word compiler is the compiler toolchain, which comprises a compiler, assembler, and linker. The assembler is in charge of translating the compiled translation unit(object file) from assembly to truly machine-readable machine code. The linker is used to link all the parts of the program(object files) into one executable file. Together, they can translate our human-readable source code(potentially many files) into a program that can run on the machine. + +For now, we will mainly focus on the more strict definition because I think the concept and algorithm compiler use more closely pertain to our WAMR project. + + + +### 1.2 Structure and algorithm involved + + + +Since we alright know what a compiler is, now let's learn more details about compilers. First, let's talk about the structure of the compiler and the algorithm related to each part. Typically, the compiler consists of three parts, Front End, Optimizer and Back End: + +- Front End: in some sense, this part is more "mature." The theory involved and actual implementation is more or less stable nowadays. Its primary purpose is to gather textual information from source-language programs and understand it syntactically and semantically. After that, it encodes the knowledge it has into Intermediate Representation. The theory behind Front End is formal language theory(Scanners & Parsers) and lattice theory(Elaboration for type checking). + +- Optimizer: as the name suggests, the Optimizer's goal is to optimize our program's performance. Clever readers may be conscious of the difficulty when they hear the word "optimize." Indeed, the Optimizer is very challenging to design and implement since it's a vital part of compiler infrastructure and imposes a heavy performance impact. It analyses the input IR and transforms it into definitive IR, usually through multiple passes, gradually accumulating knowledge of the program and applying a better(hopefully) transformation to it. The output(definitive IR) is semantically equivalent to the input IR to preserve the original meaning of the program we are compiling. The theories and algorithms that could be used for Optimizer are too many to list here. Here are examples: Number theory, some graph algorithms for static analysis, and fixed-point algorithms for data-flow analysis. It's still an active field that attracts many people to research. + +- Back End: the Back End is in charge of mapping programs (in IR form) to low-level code forms that can run on the target machine. Usually, there is more than one Back End, so the compiler is portable for different platforms (ISA). Its main functionality includes instruction selection, register allocation, and instruction scheduling, in which many algorithms are applied, like heuristic search, graph coloring, and some dynamic programming. Like Optimizer, the Back End has many open problems to tackle and also is a field many people hold great interest in. + +## 2. Interpreter + +### 2.1 What is an Interpreter? + +The Interpreter is also a system computer program. Like the compiler, it takes a source program as input; but instead of outputting a target program, it directly executes the program line by line and returns the corresponding results. One thing worth noting is that it's not uncommon for an interpreter to adapt widely used techniques in the compilers to improve its performance. Sometimes they are even used together. + +Based on the levels of the source language(high or low) and compilation strategies, the interpreters can be divided into several different categories. Let's look at them in more detail in the following section. + +### 2.2 Technique and jargon in Interpreter + +- Bytecode: + + The bytecode is a kind of low-level programming language in a very highly optimized and compact format. It could be the target language for the compiler. Because the instruction-like bytecode can be executed line by line in an interpreter on any platform, regardless of what hardware-related ISA it uses, it is also called p-code(portable). One example of bytecode you may be familiar with is Java bytecode. + +- Ahead-of-time(AOT) and Just-in-time(JIT) compilation: + + - AOT: as the name suggests, the AOT compilation means that the compilation happens before the program run time. Normally the target language after AOT compilation is some low-level machine code or bytecode. Then the compiled code can be executed by either a process VM or a normal computer. + + - JIT: just in time compilation is a technique widely adopted by the Interpreter to improve its performance. It detects the heavily used code section when interpreting the program and compiles them into more efficient machine code. When that code section is called again, the machine code is executed rather than having the bytecode interpreted. + +## 3. Virtual machines + +When it comes to the word "Virtual Machines," we usually would remember or refer to that System virtual machines managed by hypervisors such as KVM, VirtualBox, or VMware. We often use them as a substitute for real computers to resolve dependency or compatibility issues for courses or daily work. + +But there is also another type of virtual machine you may have heard of(even you may get really confused at first) and related more closely to the field where our project is. Process (application) virtual machines provide an environment independent of hardware, aiming to run computer programs written in a certain language. Take JVM as an example. It provides an environment for Java bytecode to execute across many platforms. + +## 4. Runtime system + +It's a rather vague term that is really difficult to explain or understand. To make things worse, when people sometimes refer to it as runtime, it's easily confused with compilation runtime, runtime library. The runtime system is an infrastructure that participates in the creation and running of our program. Typically, the components are the execution environment(Application VM maybe) to provide a place for the program to run, and the compiler front end or/and compiler back end to do the necessary analysis, transformation(from source code to bytecode), and optimization. diff --git a/gitbook/appendix/webassembly_details.md b/gitbook/appendix/webassembly_details.md new file mode 100644 index 0000000000..ea11a4ffb4 --- /dev/null +++ b/gitbook/appendix/webassembly_details.md @@ -0,0 +1,6 @@ +--- +description: "This page is under construction/refinement. p.s. wanna hear a construction joke? we are still working on it" +--- +# WebAssembly details + +Meanwhile, if you can't wait to learn more about Wasm, check out this book: _WebAssembly in Action_. It's a great book showcasing wasm basics and how to use wasm with JavaScript inside a browser. diff --git a/gitbook/basics/getting-started/README.md b/gitbook/basics/getting-started/README.md new file mode 100644 index 0000000000..4a6ca20e6b --- /dev/null +++ b/gitbook/basics/getting-started/README.md @@ -0,0 +1,13 @@ +# Getting started: a hello world program + +In this chapter, you'll learn how to run a simple hello world wasm program on your host or the Docker environment using WAMR. The docker tutorial is recommended so you don't have to worry about all the platform-related dependencies and compatibility problems. The hello world program will give you a taste of what our WAMR could do as server-side runtime and ready you for a more detailed guide at the end of this chapter. The [latter guide](../../../doc/build_wasm_app.md) covers the meaning of the compile and build option in detail and gives suggestions on fine-tuning your wasm module. More example programs can be found in [chapter 4. features](../../features/README.md) + +Now, here is the last piece of gibberish before you get your hand dirty: + +Clone our source code repo and use + +```sh +git clone https://github.com/bytecodealliance/wasm-micro-runtime.git +``` + +Or download from use any way you like diff --git a/gitbook/basics/getting-started/host_prerequsites.md b/gitbook/basics/getting-started/host_prerequsites.md new file mode 100644 index 0000000000..d6ab33cf82 --- /dev/null +++ b/gitbook/basics/getting-started/host_prerequsites.md @@ -0,0 +1,40 @@ +# Prerequisites for your host environment + +## Ubuntu + +First, install the needed packages and libraries. + +```sh +apt-get update \ + && apt-get install -y apt-transport-https apt-utils build-essential \ + ca-certificates curl g++-multilib git gnupg \ + libgcc-9-dev lib32gcc-9-dev lsb-release \ + ninja-build ocaml ocamlbuild python2.7 \ + software-properties-common tree tzdata \ + unzip valgrind vim wget zip --no-install-recommends +``` + +Then install CMake and wasi-sdk-16.0 + +```sh +wget --progress=dot:giga -O - https://apt.kitware.com/keys/kitware-archive-latest.asc 2>/dev/null | gpg --dearmor - | tee /usr/share/keyrings/kitware-archive-keyring.gpg > /dev/null \ + && echo 'deb [signed-by=/usr/share/keyrings/kitware-archive-keyring.gpg] https://apt.kitware.com/ubuntu/ bionic main' | tee /etc/apt/sources.list.d/kitware.list >/dev/null \ + && apt-get update \ + && rm /usr/share/keyrings/kitware-archive-keyring.gpg \ + && apt-get install -y kitware-archive-keyring --no-install-recommends \ + && apt-get install -y cmake --no-install-recommends + +wget -c --progress=dot:giga https://github.com/WebAssembly/wasi-sdk/releases/download/wasi-sdk-16/wasi-sdk-16.0-linux.tar.gz -P /opt \ + && tar xf /opt/wasi-sdk-16.0-linux.tar.gz -C /opt \ + && ln -fs /opt/wasi-sdk-16.0 /opt/wasi-sdk \ + && rm /opt/wasi-sdk-16.0-linux.tar.gz +``` + +This should be sufficient to build WAMR and run our hello world program. + \ No newline at end of file diff --git a/gitbook/basics/getting-started/on_docker.md b/gitbook/basics/getting-started/on_docker.md new file mode 100644 index 0000000000..2dd7c77a71 --- /dev/null +++ b/gitbook/basics/getting-started/on_docker.md @@ -0,0 +1,26 @@ +# Using docker + +Now that we have set up docker, we could run the following command directly in VS Code terminal(or the bash of your if you prefer ssh docker container directly). + +Similarly, build iwasm vmcore. + +```sh +cd product-mini/platforms/linux +mkdir build && cd build +cmake .. +make +``` + +Then you are ready to go to the directory that contains the hello world program and copy our iwasm vmcore + +```sh +cp iwasm ../../../app-samples/hello-world +cd ../../../app-samples/hello-world +./build.sh +``` + +Now you can execute your first wasm program! + +```sh +./iwasm test.wasm +``` diff --git a/gitbook/basics/getting-started/on_host.md b/gitbook/basics/getting-started/on_host.md new file mode 100644 index 0000000000..df8689ffb7 --- /dev/null +++ b/gitbook/basics/getting-started/on_host.md @@ -0,0 +1,26 @@ +# Compile, build and test hello world on the host + +Now we have our host set up, we can build our hello world program and run it using WAMR. + +First, build iwasm vmcore on your platform. + +```sh +cd ${WAMR-dir}/product-mini/platforms/${your platform} +mkdir build && cd build +cmake .. +make +``` + +Then you are ready to go to the directory that contains the hello world program and copy our iwasm vmcore + +```sh +cp iwasm ../../../app-samples/hello-world +cd ${WAMR-dir}/product-mini/app-samples/hello-world +./build.sh +``` + +Now you could execute your first wasm program! + +```sh +./iwasm test.wasm +``` diff --git a/gitbook/basics/introduction/README.md b/gitbook/basics/introduction/README.md new file mode 100644 index 0000000000..6886d072b8 --- /dev/null +++ b/gitbook/basics/introduction/README.md @@ -0,0 +1,5 @@ +# Introduction + +In this chapter, we will introduce you to some basic knowledge about [WebAssembly](./webassembly.md) and our project [WAMR](./wamr_project.md). And discuss the security feature that Webassembly language itself and WAMR's enhancement can bring in [this section](./security_feature.md) + +We understand because our backgrounds vary, some terms in the following section may sound familiar but vague. We have a primer in [Appendix A](../../appendix/background_knowledge.md) gathering some details about background knowledge(compiler, interpreter, runtime system, all other jargon) that may be helpful and free you from googling around. You are more than welcome to check it out. diff --git a/gitbook/basics/introduction/security_feature.md b/gitbook/basics/introduction/security_feature.md new file mode 100644 index 0000000000..f375b99f1c --- /dev/null +++ b/gitbook/basics/introduction/security_feature.md @@ -0,0 +1,147 @@ +# The Security of WebAssembly and WAMR's implementation + +WebAssembly is a cutting-edge programming language that helps Web applications such as PhotoShop Online run at native speed in the browser and offers a sandbox mechanism to protect the host environment from malicious attacks cross the world. Beyond the browser, the Wasm can be executed in standalone runtime such as WAMR safely without the need of additional security support from OS and HW. + +## WebAssembly Security Overview + +The security features of WebAssembly(More detailed Wasm language-level security features can be found on the official [WebAssembly website](https://webassembly.org/docs/security/)) + +WebAssembly (Wasm) is designed with two key security goals: + +1. protecting users from malicious or faulty modules + +2. providing developers with robust tools for building secure applications. + +### User Protection + +Each WebAssembly module executes within a sandboxed environment separated from the host runtime using fault isolation techniques. This implies: + +- Applications execute independently, and can't escape the sandbox without going through appropriate APIs. +- Applications generally execute deterministically with limited exceptions. + +Modules must also comply with the security policies of the host environment, such as the same-origin policy in browsers or POSIX on other platforms. + +### Developer Safety Tools + +WebAssembly's design emphasizes security by removing unsafe execution features while maintaining compatibility with C/C++ programs. + +Key safety features include: + +- **Control-flow Integrity (CFI):** + - Modules must declare all accessible functions and their types at load time, enforcing structured control flow. + - Immutable, non-observable compiled code prevents control-flow hijacking attacks. + +- **Function Calls:** + - Calls must reference a valid function index. + - Indirect function calls are checked at runtime for type signature compatibility. + - A protected call stack prevents buffer overflows, ensuring safe returns. + - Branches are restricted to valid destinations within the current function. + +- **Variable Handling:** + - Local variables (fixed scope) are initialized to zero and stored in the protected call stack. + - Global variables are stored in the global index space and can be imported from external modules. + - Variables with unclear static scope (e.g., structs or address-of operator) are stored in isolated linear memory, which has bounds checking and zero-initialization by default. + +- **Traps:** + - Used to terminate execution and signal errors (e.g., invalid index, type mismatch, stack overflow, out-of-bounds memory access, or illegal arithmetic). + - In a browser, traps trigger a JavaScript exception. Future updates may support custom module-defined trap handlers. + +Future improvements may introduce multiple memory sections and finer memory controls (e.g., shared memory, page protection). + +### Memory Safety + +WebAssembly improves memory safety by eliminating common bugs found in traditional C/C++ programs: + +- **Buffer Overflows**: Local and global variables are fixed-size and stored by index, preventing buffer overflows from affecting adjacent memory. Linear memory regions, though, can overwrite objects, but bounds checking and control-flow integrity (CFI) prevent direct code injection, so mitigation like DEP or SSP is unnecessary. + +- **Pointer Safety**: Unsafe pointer usage, like dereferencing unallocated memory or accessing freed memory, is minimized. WebAssembly removes pointer semantics for function calls and variables with fixed scope, and invalid index references result in load-time validation errors or runtime traps. Linear memory is bounds-checked at the region level and zero-initialized by default. + +- **Control Flow Protection**: Although WebAssembly prevents direct code injection, code reuse attacks targeting indirect calls are still possible. However, conventional ROP attacks are infeasible due to CFI, which enforces valid call targets declared at load time. + +- **Potential Vulnerabilities**: Race conditions (e.g., TOCTOU) and side-channel attacks (e.g., timing attacks) are possible, as WebAssembly offers no scheduling guarantees. Future enhancements may introduce memory randomization, code diversification, and bounded pointers to strengthen protection. + +### Control-Flow Integrity (CFI) + +Wasm ensures CFI for both direct and indirect function calls as well as function returns. It uses explicit function section indexes and runtime type checks to verify safe transitions. However, as mentioned above, while these mechanisms prevent most code injection, indirect call exploits using code reuse techniques are still possible. + +Developers can enhance security by enabling fine-grained CFI through Clang/LLVM's WebAssembly support, which adds richer type-level checks and mitigates indirect call attacks, albeit with minor performance trade-offs. + +## WAMR Security Features + +The WebAssembly Micro Runtime (WAMR) is designed to provide an efficient, secure, and lightweight runtime for WebAssembly on standalone devices. It offers a full coverage of the WebAssembly specification and added additional security enhancements to ensure safe execution of Wasm modules. + +### Wasm Language Security Features + +WAMR enforces WebAssembly language-level security features rigorously, ensuring that each Wasm module undergoes comprehensive validation at the loading phase and that execution conforms to the WebAssembly specification during runtime. + +#### Module Validation + +Before execution, WAMR validates the Wasm module to ensure it adheres to the WebAssembly specification. This involves several key checks: + +- **Format Validation**: Ensuring the binary is well-formed and compliant with the Wasm format. This checks the structure, ensuring correct definitions for functions, memory segments, tables, and types. + +- **Type Checking**: All function signatures, local variables, and global variables are verified against their declared types. This ensures type safety across calls and memory operations. + +- **Control Flow Integrity**: Verifies the function call graph to ensure that all function indices and signatures are valid and that function calls do not violate control-flow safety rules. + +- **Operand Stack Integrity**: WAMR ensures that operand stack overflows and underflows are checked during validation. For each function, the number of values pushed and popped from the operand stack must match the declared function signature, avoiding stack imbalances. + +- **Memory and Table Boundaries**: Ensures that memory and table sizes do not exceed predefined limits and that access to these regions remains within bounds. + +#### Module Execution + +During runtime, WAMR ensures that execution strictly conforms to the WebAssembly spec and maintains the security guarantees made at load time: + +- **Memory Safety**: Memory access, both direct and indirect, is rigorously checked. WAMR prevents out-of-bounds access, helping mitigate common vulnerabilities like buffer overflows. + + - Implementation of **Boundary Checks**: WAMR can leverage either software boundary checks or hardware boundary checks. For software boundary checks, before each memory access, the address is validated to ensure it falls within the allowable bounds of the allocated memory. For hardware boundary checks, protection mechanisms such as `mmap`-based memory protection, where sections of memory can be made non-writable or non-executable to prevent invalid memory address access. + +- Like previously mentioned, applications generally execute deterministically with **limited exceptions**, which can be handled in the runtime rather than simply crushing or causing undefined behavior. The exceptions that WAMR can handle include but are not limited to: + + - EXCE_UNREACHABLE: Triggered when unreachable code is executed. + - EXCE_OUT_OF_MEMORY: Signaled when the runtime runs out of memory. + - EXCE_OUT_OF_BOUNDS_MEMORY_ACCESS: Raised when memory access goes out of bounds. + - EXCE_INTEGER_OVERFLOW: Detects integer overflow during arithmetic operations. + - EXCE_INTEGER_DIVIDE_BY_ZERO: Handles division by zero in integer operations. + - EXCE_INVALID_CONVERSION_TO_INTEGER: Raised when an invalid conversion to an integer occurs. + - EXCE_INVALID_FUNCTION_TYPE_INDEX: Triggered when an invalid function type index is accessed. + - EXCE_INVALID_FUNCTION_INDEX: Signaled when an invalid function index is used. + - EXCE_UNDEFINED_ELEMENT: Raised when accessing an undefined element. + - EXCE_UNINITIALIZED_ELEMENT: Triggered when an uninitialized element is accessed. + - EXCE_CALL_UNLINKED_IMPORT_FUNC: Handles calls to unlinked imported functions. + - EXCE_NATIVE_STACK_OVERFLOW: Triggered when the native stack exceeds its limit. + - EXCE_UNALIGNED_ATOMIC: Raised when an unaligned atomic operation is attempted. + - EXCE_AUX_STACK_OVERFLOW: Signals that the auxiliary stack has overflowed. + - EXCE_AUX_STACK_UNDERFLOW: Triggered when the auxiliary stack is underflowed. + - EXCE_OUT_OF_BOUNDS_TABLE_ACCESS: Raised when accessing a table out of bounds. + - EXCE_OPERAND_STACK_OVERFLOW: Signaled when the operand stack overflows. + +These features, combined with the robust validation and execution checks, ensure that WAMR achieves comprehensive security for running WebAssembly modules. + +### Extra Enhancements on Security + +WAMR goes beyond the standard WebAssembly security features by offering additional mechanisms to enhance the security of applications, particularly in the areas of native API access control and hardware-based security. + +#### Native API Export Control + +WAMR allows WebAssembly applications to interact with the host environment through **exported native APIs**. However, unrestricted access to these APIs can introduce security risks, such as unauthorized system calls or resource manipulation. To mitigate these risks, WAMR implements a **fine-grained access control** mechanism for native APIs: + +- **Restricted API Access**: Developers can explicitly define which native APIs are exposed to WebAssembly modules, limiting the surface area for potential misuse. This allows for precise control over which system resources (e.g., file system, networking, I/O devices) can be accessed by a module. + +- **Custom API Policies**: WAMR supports customizable policies, enabling developers to set permissions and constraints on how WebAssembly modules can interact with native APIs. This is particularly useful for sandboxing untrusted code while still allowing necessary functionality under controlled conditions. + +- **API Call Validation**: All calls to native APIs are validated at runtime to ensure that they conform to the defined policies, preventing unauthorized or malicious API usage. + +#### Intel SGX Remote Attestation + +WAMR enhances security for trusted execution environments (TEEs) through its support for **Intel Software Guard Extensions (SGX)**, which provides hardware-level security features, including **remote attestation**: + +- **SGX Integration**: WAMR can run WebAssembly modules within an SGX enclave, a protected area of execution that provides isolation from the rest of the system. This ensures that even if the host machine is compromised, the code and data within the enclave remain secure. + +- **Remote Attestation**: WAMR supports SGX remote attestation, allowing remote parties to verify that a WebAssembly module is running inside a genuine SGX enclave. This involves generating and sending an **attestation report**, which proves the authenticity of the enclave and the integrity of the code running inside it. + + - **Endorsement of Trusted Execution**: The attestation process ensures that the WebAssembly module and its execution environment have not been tampered with, providing assurance to remote users that the module is running in a secure, trusted state. + +- **Sealing and Unsealing**: WAMR supports SGX's data sealing features, enabling WebAssembly modules to securely store sensitive data on disk. Sealed data can only be accessed by the same enclave in future executions, protecting it from unauthorized access even if the host system is compromised. + +These features enhance WAMR’s security, making it suitable for use cases that require both flexible native API access and strong hardware-backed guarantees of code integrity and confidentiality. diff --git a/gitbook/basics/introduction/wamr_project.md b/gitbook/basics/introduction/wamr_project.md new file mode 100644 index 0000000000..0cba5b084c --- /dev/null +++ b/gitbook/basics/introduction/wamr_project.md @@ -0,0 +1,65 @@ +# WAMR project + + In this section, we will introduce the basics of project WAMR to you. In each brief introduction section, you are more than welcome to jump to details of that section triggering your interest. + +## What is it? + +WebAssembly Micro Runtime (WAMR) is a [Bytecode Alliance](https://bytecodealliance.org/) project. A lightweight standalone WebAssembly (WASM) runtime with a small footprint, high performance, and highly configurable features for applications across from embedded, IoT, edge to Trusted Execution Environment (TEE), smart contract, cloud-native, and so on. + +## Why you may want to use it + + + +As we explained in the previous section, WebAssembly is great for code reuse on the server side with the help of runtime like our Project WAMR. So the most straightforward way is to use WAMR to run your WASM program. + +It's not limited to simply being a command line application that runs your wasm program. You could also use it as a library, integrated into your application to run any wasm program inside your application. Although most user cases are embedding WAMR in their C/C++ program, we do support other [language-binding](../../tutorial/language-embedding/README.md) so that you could use WAMR in some language you prefer. + +## Component of WAMR + + + +There are four parts of WAMR. Two main parts of WAMR are: + +1. The "iwasm" VM core to run WASM applications. It has many features and achieves several functionalities. The complete list of features and examples demonstrating it can be found in [Features](../../features/README.md). Here are some brief introductions of some features that may interest you: + + - Flexibility: It supports multiple running modes to provide the ideal responsive time and performance on your demand. The running mode includes interpreter mode, AOT mode (Ahead-of-Time compilation), and JIT modes (Just-in-Time compilation, LLVM JIT, and Fast JIT are supported). Details on how to build and use each mode properly and where you may want to use it can be found in [Tutorial](../../tutorial/README.md) + + - High Performance: WAMR achieves nearly native speed by AOT and JIT modes. It also has a small runtime binary size (~85K for interpreter and ~50K for AOT) and low memory usage + + - Portability: It supports many architectures and platforms. + + The architectures it supports: + + - X86-64, X86-32 + - ARM, THUMB (ARMV7 Cortex-M7 and Cortex-A15 are tested) + - AArch64 (Cortex-A57 and Cortex-A53 are tested) + - RISCV64, RISCV32 (RISC-V LP64 and RISC-V LP64D are tested) + - XTENSA, MIPS, ARC + + The platforms it supports: + + - [Linux](../../../doc/build_wamr.md#linux), [Linux SGX (Intel Software Guard Extension)](../../../doc/linux_sgx.md), [MacOS](../../../doc/build_wamr.md#macos), [Android](../../../doc/build_wamr.md#android), [Windows](../../../doc/build_wamr.md#windows), [Windows (MinGW)](../../../doc/build_wamr.md#mingw) + + - [Zephyr](../../../doc/build_wamr.md#zephyr), [AliOS-Things](../../../doc/build_wamr.md#alios-things), [VxWorks](../../../doc/build_wamr.md#vxworks), [NuttX](../../../doc/build_wamr.md#nuttx), [RT-Thread](../../../doc/build_wamr.md#RT-Thread), [ESP-IDF](../../../doc/build_wamr.md#esp-idf) + + It enables true cross-platform development experience. You can even port WAMR to a new platform following [this tutorial](../../../doc/port_wamr.md). Though it's unlikely since we support many platforms, having such features is comforting. + + - Security: It has Linux SGX (Intel Software Guard Extension) support. Through this unique application isolation technology, your application data is as safe as it can be. + +2. The "wamrc" AOT compiler to compile WASM files into AOT files for best performance and smaller runtime footprint, which is run by "iwasm" VM Core + + Both the wasm binary files and AOT files are supported by iwasm. The wamrc AOT compiler compiles a wasm binary file to an AOT file, which can also be run by iwasm. The speed by AOT and JIT are near to native. + +The other 2 parts are: + +1. Application framework: + + The WAMR application manager supports remote application management from the host environment or the cloud through any physical communications such as TCP, UPD, UART, BLE, etc. Its modular design makes it able to support application management for different managed runtimes. + +2. Application manager: + + By using the iwasm VM core, we are flexible to build different application frameworks for specific domains, although it would take quite some effort. + + The WAMR has offered a comprehensive framework for programming WASM applications for device and IoT usages. The framework supports running multiple applications that are based on the event-driven programming model. Here are the supporting API sets by the WAMR application framework library : + + - Timer, Inter-app communication (request/response and pub/sub), Sensor, Connectivity and data transmission, 2D graphic UI diff --git a/gitbook/basics/introduction/webassembly.md b/gitbook/basics/introduction/webassembly.md new file mode 100644 index 0000000000..65e2fe3521 --- /dev/null +++ b/gitbook/basics/introduction/webassembly.md @@ -0,0 +1,52 @@ +# WebAssembly + +In this section, you will learn the basics of WebAssembly. More details about WebAssembly can be found in [Appendix B](../../appendix/webassembly_details.md) + +## Overview + +Like its name suggest, in a sense, it is related to the Web and Assembly. Web means that it, like many other forerunners, like asm.js, trying to improve JavaScript's performance in Browsers. And the Assembly means that the format of WebAssembly is not a human-readable format but a compact binary format that is more efficient for Browsers to use. To conclude, WebAssembly (Wasm) is a compact, binary instruction format tailored for a stack-based virtual machine. It serves as a portable compilation target for various programming languages, enabling smooth deployment across both client and server environments on the web. It aims to provide benefits such as: + +- High Performance + + Wasm is built for fast execution and compact encoding, allowing programs to be efficiently transmitted and quickly loaded. By leveraging the common hardware capabilities across platforms, WebAssembly can run at near-native speeds. + +- Secure Execution Environment + + Wasm operates within a memory-safe, sandboxed environment, which can be implemented even inside existing JavaScript engines. When integrated into web applications, it adheres to the same-origin policy and browser-based permission models, ensuring robust security. + +- Open and Debuggable Format + + Wasm is designed with a textual representation that aids in debugging, testing, and optimization. This human-readable format allows developers to experiment, learn, and even hand-code Wasm modules. When viewed on the web, this text format makes Wasm modules easily accessible for inspection. + +- A Core Part of the Open Web + + Built to uphold the versionless and backward-compatible nature of the web, WebAssembly seamlessly interacts with JavaScript and can access web APIs. Beyond web applications, Wasm is versatile and supports other non-web environments as well. + +In [The State of WebAssembly 2023](https://www.cncf.io/reports/the-state-of-webassembly-2023/) from SlashData, Linux Foundation, and the Cloud Native Computing Foundation, some key insights into the current status and adoption of WebAssembly can be found. Including the top reason why people want to use WebAssembly: + +- Faster loading times 23% +- Exploring new use cases and technologies 22% +- Sharing code between projects 20% +- Improved performance over JavaScript 20% +- Efficient execution of computationally intensive tasks 19% +- Binaries run anywhere 18% +- Sandboxed security 18% +- Language agnostic 18% + +What makes it even better is that, like Javascript, shortly after the appearance of WebAssembly, it is not limited to the browser. It could also be used server-side. Many WebAssembly runtimes are out there, including our project WAMR. + +## How does it work + +### A browser example + +The most straightforward place you could think of when it comes to the use of WebAssembly is in the browser. + +Emscripten is a compiler toolchain for WebAssembly. It took the C/C++(or any other programming language LLVM frontend support) source program as input and translated it into the WebAssembly target program module. + +Optionally, an HTML and a Javascript file are generated alongside a wasm file, so the plumbing JS code is ready for you to call your wasm module. And you could open HTML on your browser to see the result of your wasm program. + +Here is the more detailed [emscripten official tutorial](https://emscripten.org/docs/getting_started/Tutorial.html) you could follow to write your hello world wasm program and run it on the browser. + +### A server-side example + +A hello world example using our WAMR can be found [here](../getting-started/README.md) diff --git a/gitbook/examples/README.md b/gitbook/examples/README.md new file mode 100644 index 0000000000..300a39f926 --- /dev/null +++ b/gitbook/examples/README.md @@ -0,0 +1,11 @@ +# More Examples + +In this chapter, we provide some extra useful examples to demonstrate how you may want to use WAMR: + +- [File Interaction Of WASI](../../samples/file/README.md): Demonstrating the supported file interaction API of WASI. This sample can also demonstrate the SGX IPFS (Intel Protected File System), enabling an enclave to seal and unseal data at rest. + +- [GUI Examples](gui-examples/README.md): We provide two examples that both use [LVGL library](https://github.com/lvgl/lvgl) + +- [Concurrent WASM Application](../../samples/spawn-thread): Demonstrating how to execute wasm functions of the same wasm application concurrently in threads created by host embedder or runtime, but not the wasm application itself. + +- [Workload](../../samples/workload/README.md): Demonstrating how to build and run some complex workloads, e.g., tensorflow-lite, XNNPACK, wasm-av1, meshoptimizer, and bwa. diff --git a/gitbook/features/README.md b/gitbook/features/README.md new file mode 100644 index 0000000000..de538076c8 --- /dev/null +++ b/gitbook/features/README.md @@ -0,0 +1,39 @@ +--- +description: "This page is under construction/refinement. p.s. wanna hear a construction joke? we are still working on it" +--- +# Features And Examples + + + +In this chapter, you can see the complete list of features that WAMR support. And for each feature, we have an example followed demonstrating the usage of such a feature. + +## IWASM features + +### Key features + +- Full compliant to the W3C WASM MVP +- Small runtime binary size (~85K for interpreter and ~50K for AOT) and low memory usage +- Near to native speed by AOT and JIT +- Self-implemented AOT module loader to enable AOT work on Linux, Windows, MacOS, Android, SGX, and MCU systems +- Choices of WASM application libc support: the built-in libc subset for the embedded environment or [WASI](https://github.com/WebAssembly/WASI) for the standard libc +- [The simple C APIs to embed WAMR into host environment](../../doc/embed_wamr.md), see [how to integrate WAMR](../../doc/embed_wamr.md) and the [API list](../../core/iwasm/include/wasm_export.h) +- [The mechanism to export native APIs to WASM applications](../../doc/export_native_api.md), see [how to register native APIs](../../doc/export_native_api.md) +- [Multiple modules as dependencies](../../doc/multi_module.md), ref to [document](../../doc/multi_module.md) and [sample](../../samples/multi-module) +- [Multi-thread, pthread APIs and thread management](../../doc/pthread_library.md), ref to [document](../../doc/pthread_library.md) and [sample](../../samples/multi-thread) +- [Linux SGX (Intel Software Guard Extension) support](../../doc/linux_sgx.md), ref to [document](../../doc/linux_sgx.md) +- [Source debugging support](../../doc/source_debugging.md), ref to [document](../../doc/source_debugging.md) +- [WAMR-IDE (Experimental)](../../test-tools/wamr-ide) to develop WebAssembly applications with build, run and debug support, ref to [document](../../test-tools/wamr-ide) +- [XIP (Execution In Place) support](../../doc/xip.md), ref to [document](../../doc/xip.md) +- [Berkeley/Posix Socket support](../../doc/socket_api.md), ref to [document](../../doc/socket_api.md) and [sample](../../samples/socket-api) +- Language bindings: [Go](../../language-bindings/go/README.md), [Python](../../language-bindings/python/README.md) + +### WASM post-MVP features + +There are many post-MVP features for WASM. We support some of them. You can see the details in [this section](demo-examples/README.md) + +- [wasm-c-api](https://github.com/WebAssembly/wasm-c-api) +- [128-bit SIMD](https://github.com/WebAssembly/simd) +- [Reference Types](https://github.com/WebAssembly/reference-types) +- [Non-trapping float-to-int conversions](https://github.com/WebAssembly/nontrapping-float-to-int-conversions) +- [Sign-extension operators](https://github.com/WebAssembly/sign-extension-ops), [Bulk memory operations](https://github.com/WebAssembly/bulk-memory-operations) +- [Multi-value](https://github.com/WebAssembly/multi-value), [Tail-call](https://github.com/WebAssembly/tail-call), [Shared memory](https://github.com/WebAssembly/threads/blob/main/proposals/threads/Overview.md#shared-linear-memory) diff --git a/gitbook/features/demo-examples/README.md b/gitbook/features/demo-examples/README.md new file mode 100644 index 0000000000..8f6c89155f --- /dev/null +++ b/gitbook/features/demo-examples/README.md @@ -0,0 +1,15 @@ +# WASM post-MVP features + +The ones we support: + +- [wasm-c-api](https://github.com/WebAssembly/wasm-c-api), ref to [document](../../../doc/wasm_c_api.md) and [sample](../../../samples/wasm-c-api) + +- [128-bit SIMD](https://github.com/WebAssembly/simd), ref to [samples/workload](../../../samples/workload/README.md) + +- [Reference Types](https://github.com/WebAssembly/reference-types), ref to [document](../../../doc/ref_types.md) and [sample](../../../samples/ref-types) + +Other post-MVP features: + +- [Non-trapping float-to-int conversions](https://github.com/WebAssembly/nontrapping-float-to-int-conversions) +- [Sign-extension operators](https://github.com/WebAssembly/sign-extension-ops), [Bulk memory operations](https://github.com/WebAssembly/bulk-memory-operations) +- [Multi-value](https://github.com/WebAssembly/multi-value), [Tail-call](https://github.com/WebAssembly/tail-call), [Shared memory](https://github.com/WebAssembly/threads/blob/main/proposals/threads/Overview.md#shared-linear-memory) diff --git a/gitbook/features/user-case/README.md b/gitbook/features/user-case/README.md new file mode 100644 index 0000000000..dea2acbcc6 --- /dev/null +++ b/gitbook/features/user-case/README.md @@ -0,0 +1,10 @@ +# User case + +WAMR is widely used in a lot of areas. Here are some cases: + +- [Hyperledger Private Data Objects](https://github.com/hyperledger-labs/private-data-objects/blob/main/common/interpreter/wawaka_wasm/README.md) +- [Inclavare Containers](https://github.com/alibaba/inclavare-containers) +- [Fassm](https://github.com/faasm/faasm) +- [Waft](https://developer.aliyun.com/article/787582) +- [Envoy Proxy](https://github.com/envoyproxy/envoy) +- [Apache Teaclave](https://teaclave.apache.org/docs/executing-wasm) diff --git a/gitbook/home_page.md b/gitbook/home_page.md new file mode 100644 index 0000000000..831c167f01 --- /dev/null +++ b/gitbook/home_page.md @@ -0,0 +1,15 @@ +# Welcome + +Welcome to the home page of WAMR documentation, [WebAssembly Micro Runtime](https://github.com/bytecodealliance/wasm-micro-runtime) is an open-source project under [Bytecode Alliance](https://bytecodealliance.org/). As the name suggests, it is a lightweight standalone WebAssembly (WASM) runtime with a small footprint, high performance, and highly configurable features for applications across from embedded, IoT, edge Trusted Execution Environment (TEE), smart contract, cloud-native, and so on. + +## How to navigate the documentation + +If you are a complete beginner who just stepped into the world of WebAssembly or just looking to kill some time and learn something fun, start with [appendix A. background knowledge 101](appendix/background_knowledge.md) and our [chapter 1. introduction](basics/introduction/README.md). Also, you could learn how to run a hello world server-side wasm application using runtime WAMR in [chapter 2. getting started](basics/getting-started/README.md). + +Suppose you are somewhat familiar with WebAssembly and want to explore what WAMR can do for you as a user and developer. You could first check out [chapter 3. tutorial on how to use WAMR](tutorial/README.md), including [introduction to different running modes](tutorial/running-modes/README.md), how to [build different running modes](tutorial/build-tutorial/README.md), how to [embed WAMR into your application](tutorial/language-embedding/README.md) and how to [debug with WAMR](tutorial/debugging%26IDE-support/README.md). Then you could visit the complete list of [chapter 5. features](features/README.md) WAMR supported to see whether specific feature interest you and would serve your demands well. If the time comes when you start to optimize and consider improving performance or want to utilize the advanced feature, including **application framework** and **dynamic management**. In that case, you could find them in [chapter 4. advance tutorial](advance-tutorial/README.md). + +And, of course, you can always utilize the search function in the top right corner to locate whichever topic you are interested in + +## Social + +Feel free to check out our [blog](https://bytecodealliance.github.io/wamr.dev/) from time to time! We have some great blogs that either showcase some WAMR features and use cases or discuss some interesting topics on WAMR/WASM. diff --git a/gitbook/programmer's-manual/C_API_Lists.md b/gitbook/programmer's-manual/C_API_Lists.md new file mode 100644 index 0000000000..abaef36e81 --- /dev/null +++ b/gitbook/programmer's-manual/C_API_Lists.md @@ -0,0 +1,3 @@ +# Complete C/C++ API Lists + +The complete C/C++ lists for embedding the WAMR VM core can be found in the header file [wasm_export.h](https://github.com/bytecodealliance/wasm-micro-runtime/blob/main/core/iwasm/include/wasm_export.h). diff --git a/gitbook/programmer's-manual/README.md b/gitbook/programmer's-manual/README.md new file mode 100644 index 0000000000..fa098060ce --- /dev/null +++ b/gitbook/programmer's-manual/README.md @@ -0,0 +1,6 @@ +--- +description: "This page is under construction/refinement. p.s. wanna hear a construction joke? we are still working on it" +--- +# Programmer's Manual + +Complete List of C APIs can be found [here](gitbook/programmer's_manual/C_API_Lists.md) diff --git a/gitbook/tutorial/README.md b/gitbook/tutorial/README.md new file mode 100644 index 0000000000..85b63677f0 --- /dev/null +++ b/gitbook/tutorial/README.md @@ -0,0 +1,9 @@ +# Tutorial + +In this chapter, we want to walk you through the basic development knowledge and skills of WARM you may need so that you are ready to write your wasm application with WARM. + +For starters, you could learn how to compile different running mode of WAMR and their usage in [this section](build-tutorial/README.md). + +Then, as we said before, WAMR is not limited to being a command line application that runs wasm code. You could also [embed WAMR](language-embedding/README.md) into your application. + +And don't forget the one important stage of developing, namely debugging. We cover it in [this section](debugging%26IDE-support/README.md). diff --git a/gitbook/tutorial/build-tutorial/README.md b/gitbook/tutorial/build-tutorial/README.md new file mode 100644 index 0000000000..dee388f970 --- /dev/null +++ b/gitbook/tutorial/build-tutorial/README.md @@ -0,0 +1,36 @@ +--- +description: "This page is under construction/refinement. p.s. wanna hear a construction joke? we are still working on it" +--- +# build tutorial + +In this chapter, we provide a detailed tutorial on how to build [iwasm vmcore](../../../doc/build_wamr.md) and [wamrc](build_wamrc.md). + +## Quick build matrix + +Our powerful **iwasm vmcore** provide various running mode you could choose using the compile CMake option. Here is the matrix for different running mode and their attributes: + +| Running mode | CMake build options | Pros and Cons | +| ----------- | ----------- | --------- | +| AOT | none(default) | | +| Classic Interpreter | -DWAMR_BUILD_FAST_INTERP=0 | | +| Fast Interpreter | none(default) | | +| LLVM JIT | -DWAMR_BUILD_JIT=1 | | +| Fast JIT | -DWAMR_BUILD_FAST_JIT=1 | | + +## Supported architectures and platforms + +Here is a list of architectures and platforms WAMR support. You could click on the link for quick reference. + +The iwasm supports the following architectures: + +- X86-64, X86-32 +- ARM, THUMB (ARMV7 Cortex-M7 and Cortex-A15 are tested) +- AArch64 (Cortex-A57 and Cortex-A53 are tested) +- RISCV64, RISCV32 (RISC-V LP64 and RISC-V LP64D are tested) +- XTENSA, MIPS, ARC + +The following platforms are supported. Click each link below for how to build iwasm on that platform. Refer to [WAMR porting guide](../../../doc/port_wamr.md) for how to port WAMR to a new platform. + +- [Linux](../../../doc/build_wamr.md#linux), [Linux SGX (Intel Software Guard Extension)](../../../doc/linux_sgx.md), [MacOS](../../../doc/build_wamr.md#macos), [Android](../../../doc/build_wamr.md#android), [Windows](../../../doc/build_wamr.md#windows), [Windows (MinGW)](../../../doc/build_wamr.md#mingw) + +- [Zephyr](../../../doc/build_wamr.md#zephyr), [AliOS-Things](../../../doc/build_wamr.md#alios-things), [VxWorks](../../../doc/build_wamr.md#vxworks), [NuttX](../../../doc/build_wamr.md#nuttx), [RT-Thread](../../../doc/build_wamr.md#RT-Thread), [ESP-IDF](../../../doc/build_wamr.md#esp-idf) diff --git a/gitbook/tutorial/build-tutorial/build_wamrc.md b/gitbook/tutorial/build-tutorial/build_wamrc.md new file mode 100644 index 0000000000..891d7d7d44 --- /dev/null +++ b/gitbook/tutorial/build-tutorial/build_wamrc.md @@ -0,0 +1,23 @@ +# How to Build wamrc AOT compiler + +Both the WASM binary file and AOT file are supported by iwasm. The wamrc AOT compiler compiles wasm binary file to AOT file, which can also be run by iwasm. Execute the following commands to build **wamrc** compiler for Linux: + +```shell +cd wamr-compiler +./build_llvm.sh (or "./build_llvm_xtensa.sh" to support xtensa target) +mkdir build && cd build +cmake .. (or "cmake .. -DWAMR_BUILD_PLATFORM=darwin" for MacOS) +make +# wamrc is generated under current directory +``` + +For **Windows**: + +```shell +cd wamr-compiler +python build_llvm.py +mkdir build && cd build +cmake .. +cmake --build . --config Release +# wamrc.exe is generated under .\Release directory +``` diff --git a/gitbook/tutorial/debugging&IDE-support/README.md b/gitbook/tutorial/debugging&IDE-support/README.md new file mode 100644 index 0000000000..e03d0e7a92 --- /dev/null +++ b/gitbook/tutorial/debugging&IDE-support/README.md @@ -0,0 +1,3 @@ +# debugging & IDE support + +Has concern about debugging when it comes to a newly emerging technique like wasm? No worries, we got you covered. You could either [debug directly with lldb](../../../doc/source_debugging.md), or you could even [debug using VS Code](../../../test-tools/wamr-ide/README.md) diff --git a/gitbook/tutorial/language-embedding/README.md b/gitbook/tutorial/language-embedding/README.md new file mode 100644 index 0000000000..14c92a22f1 --- /dev/null +++ b/gitbook/tutorial/language-embedding/README.md @@ -0,0 +1,9 @@ +# language embedding + +As we mentioned before, WAMR is not only a server-side runtime for a wasm application but also a library that you could embed in your application. What's even better is that we support several programming languages so that you can choose your favorite language to embed WAMR to run the wasm app. + +The language WAMR support embedding: + +- [C/C++](../../../doc/embed_wamr.md) +- [Python](../../../language-bindings/python/README.md) +- [Go](../../../language-bindings/go/README.md) diff --git a/gitbook/tutorial/running-modes/README.md b/gitbook/tutorial/running-modes/README.md new file mode 100644 index 0000000000..c5f3c909d5 --- /dev/null +++ b/gitbook/tutorial/running-modes/README.md @@ -0,0 +1,29 @@ +--- +description: "This page is under construction/refinement. p.s. wanna hear a construction joke? we are still working on it" +--- + +# WAMR Running Modes + +## Brief Introduction + +In this section, we want to introduce running modes and their difference to you + +### "iwasm" VM core running mode + +It could run an AOT file(compiled by wamrc AOT compiler) in AOT running mode + +- AOT: Ahead-of-Time compilation. As you can guess from the name, we first need to use the *wamrc* compiler to compile wasm file to the AOT file. Then it could be run with our *iwasm* vmcore. In this running mode, we could achieve the nearly native speed(the best of all running modes) with very small footprint and quick startup + +It could run wasm applications in Interpreter/JIT running mode: + +- Interpreter: + Interpreters are very useful when debugging or studying, but their performance is relatively poor compared with other running modes. We support two running modes of the interpreter: + - Classic Interpreter: plain interpreter running mode + - Fast Interpreter: as you can guess from the name, the fast interpreter runs ~2X faster than the classic interpreter but consumes about 2X memory to hold the pre-compiled code. +- JIT: + Using the Just-in-Time compilation technique, we could make iwasm run much faster than Interpreter mode and sometimes very close to the speed of AOT running mode. We support two running modes of JIT: + - LLVM JIT: the JIT engine is implemented based on LLVM codegen. The performance of LLVM JIT is better than Fast JIT, with ~2x of the latter. But the startup time is slower than Fast JIT. + - Fast JIT: the JIT engine is implemented based on self-implemented codegen and asmjit encoder library. It is a lightweight JIT engine with small footprint, quick startup, good portability and relatively good performance. Currently it supports x86-64 target and Linux/Linux-SGX/MacOS platforms. The performance of Fast JIT is ~50% of the performance of LLVM JIT. + + +For more detailed introduction, kindly refer to this article(**incoming**) in our blog. diff --git a/samples/basic/README.md b/samples/basic/README.md index 32e7ed6501..45530ff7f1 100644 --- a/samples/basic/README.md +++ b/samples/basic/README.md @@ -1,4 +1,6 @@ - +--- +description: "The related code/working directory of this example resides in directory {WAMR_DIR}/samples/basic" +--- The "basic" sample project ============== diff --git a/samples/file/README.md b/samples/file/README.md index 98f0cc3a71..a90892ead0 100644 --- a/samples/file/README.md +++ b/samples/file/README.md @@ -1,3 +1,6 @@ +--- +description: "The related code/working directory of this example resides in directory {WAMR_DIR}/samples/file" +--- # "file" sample introduction This sample demonstrates the supported file interaction API of WASI. diff --git a/samples/multi-module/README.md b/samples/multi-module/README.md index 5aac0a5f45..8e5d8fe8fc 100644 --- a/samples/multi-module/README.md +++ b/samples/multi-module/README.md @@ -1,3 +1,6 @@ +--- +description: "The related code/working directory of this example resides in directory {WAMR_DIR}/samples/multi-module" +--- # WAMR MULTI-MODUEL SAMPLE **WAMR supports *multi-module* in both *interpreter* mode and *aot* mode.** diff --git a/samples/multi-thread/README.md b/samples/multi-thread/README.md new file mode 100644 index 0000000000..ccd23730ee --- /dev/null +++ b/samples/multi-thread/README.md @@ -0,0 +1,3 @@ +--- +description: "The related code/working directory of this example resides in directory {WAMR_DIR}/samples/multi-thread" +--- \ No newline at end of file diff --git a/samples/native-lib/README.md b/samples/native-lib/README.md index 8af01b23ca..2ce5e8ff62 100644 --- a/samples/native-lib/README.md +++ b/samples/native-lib/README.md @@ -1,3 +1,6 @@ +--- +description: "The related code/working directory of this example resides in directory {WAMR_DIR}/samples/native-lib" +--- # "native-lib" sample introduction This sample demonstrates how to write required interfaces in native library, build it into a shared library and register the shared library to iwasm. diff --git a/samples/ref-types/README.md b/samples/ref-types/README.md new file mode 100644 index 0000000000..d8eb205cca --- /dev/null +++ b/samples/ref-types/README.md @@ -0,0 +1,3 @@ +--- +description: "The related code/working directory of this example resides in directory {WAMR_DIR}/samples/ref-types" +--- \ No newline at end of file diff --git a/samples/sgx-ra/README.md b/samples/sgx-ra/README.md index 179a074b87..42240b303f 100644 --- a/samples/sgx-ra/README.md +++ b/samples/sgx-ra/README.md @@ -1,3 +1,6 @@ +--- +description: "The related code/working directory of this example resides in directory {WAMR_DIR}/samples/sgx-ra" +--- "sgx-ra" sample introduction ============== diff --git a/samples/socket-api/README.md b/samples/socket-api/README.md index f172c5b172..1122967c09 100644 --- a/samples/socket-api/README.md +++ b/samples/socket-api/README.md @@ -1,3 +1,6 @@ +--- +description: "The related code/working directory of this example resides in directory {WAMR_DIR}/samples/socket-api" +--- # "socket-api" sample introduction This sample demonstrates how to use WAMR socket-api to develop wasm network applications. diff --git a/samples/spawn-thread/README.md b/samples/spawn-thread/README.md new file mode 100644 index 0000000000..ec32364710 --- /dev/null +++ b/samples/spawn-thread/README.md @@ -0,0 +1,3 @@ +--- +description: "The related code/working directory of this example resides in directory {WAMR_DIR}/samples/spawn-thread" +--- \ No newline at end of file diff --git a/samples/wasm-c-api/README.md b/samples/wasm-c-api/README.md index 22595d1559..205c57b1a0 100644 --- a/samples/wasm-c-api/README.md +++ b/samples/wasm-c-api/README.md @@ -1,3 +1,6 @@ +--- +description: "The related code/working directory of this example resides in directory {WAMR_DIR}/samples/wasm-c-api" +--- WAMR supports *wasm-c-api* in both *interpreter* mode and *aot* mode. Before staring, we need to download and install [WABT](https://github.com/WebAssembly/wabt/releases/latest). diff --git a/samples/workload/README.md b/samples/workload/README.md index af13d5d3e9..8f9371723e 100644 --- a/samples/workload/README.md +++ b/samples/workload/README.md @@ -1,3 +1,6 @@ +--- +description: "The related code/working directory of this example resides in directory {WAMR_DIR}/samples/workload" +--- All workloads have similar requirement of software dependencies, including **emsdk** and **binaryen** > There might be slight differences when using MacOS and other Linux distro than Ubuntu. This document targets From f1566cc6b4957946a74d83e015bab7eee217a9a8 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 28 Oct 2025 07:00:34 +0800 Subject: [PATCH 094/103] build(deps): Bump github/codeql-action from 4.30.9 to 4.31.0 (#4680) Bumps [github/codeql-action](https://github.com/github/codeql-action) from 4.30.9 to 4.31.0. - [Release notes](https://github.com/github/codeql-action/releases) - [Commits](https://github.com/github/codeql-action/compare/v4.30.9...v4.31.0) --- updated-dependencies: - dependency-name: github/codeql-action dependency-version: 4.31.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/codeql.yml | 6 +++--- .github/workflows/supply_chain.yml | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml index fc4bb571bc..26bc648dc6 100644 --- a/.github/workflows/codeql.yml +++ b/.github/workflows/codeql.yml @@ -53,7 +53,7 @@ jobs: # Initializes the CodeQL tools for scanning. - name: Initialize CodeQL - uses: github/codeql-action/init@v4.30.9 + uses: github/codeql-action/init@v4.31.0 with: languages: ${{ matrix.language }} @@ -70,7 +70,7 @@ jobs: - run: | ./.github/scripts/codeql_buildscript.sh - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@v4.30.9 + uses: github/codeql-action/analyze@v4.31.0 with: category: "/language:${{matrix.language}}" upload: false @@ -99,7 +99,7 @@ jobs: output: ${{ steps.step1.outputs.sarif-output }}/cpp.sarif - name: Upload CodeQL results to code scanning - uses: github/codeql-action/upload-sarif@v4.30.9 + uses: github/codeql-action/upload-sarif@v4.31.0 with: sarif_file: ${{ steps.step1.outputs.sarif-output }} category: "/language:${{matrix.language}}" diff --git a/.github/workflows/supply_chain.yml b/.github/workflows/supply_chain.yml index ac1241c719..880630db2c 100644 --- a/.github/workflows/supply_chain.yml +++ b/.github/workflows/supply_chain.yml @@ -60,6 +60,6 @@ jobs: # Upload the results to GitHub's code scanning dashboard. - name: "Upload to code-scanning" - uses: github/codeql-action/upload-sarif@d88a5540c3fd916f4e15b7744d287a124278e065 + uses: github/codeql-action/upload-sarif@4e0b2cd8144ac9869cf8b34acc9a106efea83a8c with: sarif_file: results.sarif From 89b4043213d54f80da3ecf7c2bf395e0e0341eec Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 28 Oct 2025 07:00:44 +0800 Subject: [PATCH 095/103] build(deps): Bump actions/upload-artifact from 4 to 5 (#4679) Bumps [actions/upload-artifact](https://github.com/actions/upload-artifact) from 4 to 5. - [Release notes](https://github.com/actions/upload-artifact/releases) - [Commits](https://github.com/actions/upload-artifact/compare/v4...v5) --- updated-dependencies: - dependency-name: actions/upload-artifact dependency-version: '5' dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/codeql.yml | 2 +- .github/workflows/spec_test_on_nuttx.yml | 2 +- .github/workflows/supply_chain.yml | 2 +- .github/workflows/wamr_wasi_extensions.yml | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml index 26bc648dc6..94bde8132f 100644 --- a/.github/workflows/codeql.yml +++ b/.github/workflows/codeql.yml @@ -106,7 +106,7 @@ jobs: - name: Upload CodeQL results as an artifact if: success() || failure() - uses: actions/upload-artifact@v4.6.2 + uses: actions/upload-artifact@v5 with: name: codeql-results path: ${{ steps.step1.outputs.sarif-output }} diff --git a/.github/workflows/spec_test_on_nuttx.yml b/.github/workflows/spec_test_on_nuttx.yml index a65a03bf9c..9cf34d2ac3 100644 --- a/.github/workflows/spec_test_on_nuttx.yml +++ b/.github/workflows/spec_test_on_nuttx.yml @@ -329,7 +329,7 @@ jobs: - name: upload the log if: always() - uses: actions/upload-artifact@v4.6.2 + uses: actions/upload-artifact@v5 with: name: spec-test-log-${{ github.run_id }}-${{ strategy.job-index }}-${{ matrix.target_config.target }} path: log diff --git a/.github/workflows/supply_chain.yml b/.github/workflows/supply_chain.yml index 880630db2c..795938f89a 100644 --- a/.github/workflows/supply_chain.yml +++ b/.github/workflows/supply_chain.yml @@ -52,7 +52,7 @@ jobs: # Upload the results as artifacts (optional). Commenting out will disable uploads of run results in SARIF # format to the repository Actions tab. - name: "Upload artifact" - uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v3.1.0 + uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v3.1.0 with: name: SARIF file path: results.sarif diff --git a/.github/workflows/wamr_wasi_extensions.yml b/.github/workflows/wamr_wasi_extensions.yml index 7a7a56db33..4c8c2b737f 100644 --- a/.github/workflows/wamr_wasi_extensions.yml +++ b/.github/workflows/wamr_wasi_extensions.yml @@ -50,7 +50,7 @@ jobs: - name: Upload artifacts if: matrix.os == 'macos-14' - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v5 with: name: wamr-wasi-extensions path: wamr-wasi-extensions/dist From b08b02a409fef77decb2ce1d0d280fc1f08f7ed7 Mon Sep 17 00:00:00 2001 From: "liang.he" Date: Fri, 31 Oct 2025 15:40:46 +0800 Subject: [PATCH 096/103] fix: update git clone branch for threads spec to main-legacy (#4687) --- tests/wamr-test-suites/test_wamr.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/wamr-test-suites/test_wamr.sh b/tests/wamr-test-suites/test_wamr.sh index 8c637cea92..bf621172ab 100755 --- a/tests/wamr-test-suites/test_wamr.sh +++ b/tests/wamr-test-suites/test_wamr.sh @@ -451,10 +451,10 @@ function spec_test() echo "checkout spec from threads proposal" # check spec test cases for threads - git clone -b main --single-branch https://github.com/WebAssembly/threads.git spec + git clone -b main-legacy --single-branch https://github.com/WebAssembly/threads.git spec pushd spec - # May 31, 2012 [interpreter] implement atomic.wait and atomic.notify (#194) + # May 31, 2023 [interpreter] implement atomic.wait and atomic.notify (#194) git reset --hard 09f2831349bf409187abb6f7868482a8079f2264 git apply --ignore-whitespace ../../spec-test-script/thread_proposal_ignore_cases.patch || exit 1 git apply --ignore-whitespace ../../spec-test-script/thread_proposal_fix_atomic_case.patch || exit 1 From 238f45dddc7f2c57d994a37b06e6d8f7d92c8c21 Mon Sep 17 00:00:00 2001 From: Joe Polny Date: Fri, 31 Oct 2025 03:41:35 -0400 Subject: [PATCH 097/103] docs: clarify that * in signatures does address conversion (#4681) docs: clarify that * and $ in signatures does address conversion It was non-obvious that `*` means the runtime does the app to native conversion automatically. With the current docstring, one might assume that the runtime only does boundary checks and not address conversion. Under this assumption, passing the already-native address to `wasm_runtime_addr_app_to_native` will lead to unexpected behavior --- core/iwasm/include/wasm_export.h | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/core/iwasm/include/wasm_export.h b/core/iwasm/include/wasm_export.h index 0ab22f7112..fc46825c80 100644 --- a/core/iwasm/include/wasm_export.h +++ b/core/iwasm/include/wasm_export.h @@ -1740,11 +1740,15 @@ wasm_table_type_get_max_size(const wasm_table_type_t table_type); * auto check its boundary before calling the native function. * If it is followed by '~', the checked length of the pointer * is gotten from the following parameter, if not, the checked - * length of the pointer is 1. + * length of the pointer is 1. The runtime will also convert + * the app pointer to a native pointer, thus there is no need + * to manually call `wasm_runtime_addr_app_to_native`. * '~': the parameter is the pointer's length with i32 type, and must * follow after '*' * '$': the parameter is a string (i32 in WASM), and runtime will - * auto check its boundary before calling the native function + * auto check its boundary before calling the native function. + * Like '*', the runtime will also convert the app pointer to a + * native pointer. * @param n_native_symbols specifies the number of native symbols in the array * * @return true if success, false otherwise From de4b950781809e672e234fcfd83a080a507d6bef Mon Sep 17 00:00:00 2001 From: "liang.he" Date: Tue, 4 Nov 2025 11:44:46 +0800 Subject: [PATCH 098/103] Refactor the CMake and related scripts for unit tests (#4605) - only unit/CMakeLists.txt fetches googletest - only unit/unit_common.cmake find LLVM dependencies - use `WAMR_RUNTIME_LIB_SOURCE` to replace a long list - enable LLVM support across various CMake configurations - remove redundant LLVM dependency installation and add i386 support for libraries - CMake configurations for better build output and module support - Find llvm on demand - Add test suite guidelines --- .../compilation_on_android_ubuntu.yml | 9 +- build-scripts/code_coverage.cmake | 37 ++++ build-scripts/config_common.cmake | 4 +- tests/unit/CMakeLists.txt | 13 +- tests/unit/README.md | 195 ++++++++++++++++++ tests/unit/aot-stack-frame/CMakeLists.txt | 28 +-- tests/unit/aot/CMakeLists.txt | 24 +-- tests/unit/compilation/CMakeLists.txt | 33 +-- tests/unit/custom-section/CMakeLists.txt | 46 ++--- .../custom-section/wasm-apps/CMakeLists.txt | 21 +- tests/unit/gc/CMakeLists.txt | 20 +- tests/unit/interpreter/CMakeLists.txt | 19 +- tests/unit/libc-builtin/CMakeLists.txt | 15 +- tests/unit/linear-memory-aot/CMakeLists.txt | 20 +- tests/unit/linear-memory-wasm/CMakeLists.txt | 12 -- tests/unit/linux-perf/CMakeLists.txt | 12 +- tests/unit/memory64/CMakeLists.txt | 22 +- tests/unit/running-modes/CMakeLists.txt | 47 +++-- .../running-modes/wasm-apps/CMakeLists.txt | 64 +++--- tests/unit/runtime-common/CMakeLists.txt | 33 ++- .../wasm_runtime_common_test.cc | 12 -- tests/unit/shared-heap/CMakeLists.txt | 26 +-- tests/unit/shared-utils/CMakeLists.txt | 8 +- tests/unit/unit_common.cmake | 91 ++------ tests/unit/wasm-c-api/CMakeLists.txt | 53 +---- tests/unit/wasm-vm/CMakeLists.txt | 32 ++- .../spec-test-script/collect_coverage.sh | 6 +- tests/wamr-test-suites/test_wamr.sh | 27 ++- 28 files changed, 464 insertions(+), 465 deletions(-) create mode 100644 build-scripts/code_coverage.cmake create mode 100644 tests/unit/README.md diff --git a/.github/workflows/compilation_on_android_ubuntu.yml b/.github/workflows/compilation_on_android_ubuntu.yml index 98d4b1b723..3d888d4aa3 100644 --- a/.github/workflows/compilation_on_android_ubuntu.yml +++ b/.github/workflows/compilation_on_android_ubuntu.yml @@ -350,7 +350,7 @@ jobs: uses: ./.github/actions/install-wasi-sdk-wabt with: os: ${{ matrix.os }} - + - name: Build wamrc run: | mkdir build && cd build @@ -361,15 +361,16 @@ jobs: - name: Install dependencies for X86_32 if: matrix.build_target == 'X86_32' run: | + sudo dpkg --add-architecture i386 sudo apt-get update - sudo apt-get install -y g++-multilib + sudo apt-get install -y g++-multilib libzstd-dev:i386 zlib1g-dev:i386 - name: Build and run unit tests run: | mkdir build && cd build cmake .. -DWAMR_BUILD_TARGET=${{ matrix.build_target }} - cmake --build . --config Release --parallel 4 - ctest + cmake --build . --parallel 4 + ctest --output-on-failure working-directory: tests/unit build_regression_tests: diff --git a/build-scripts/code_coverage.cmake b/build-scripts/code_coverage.cmake new file mode 100644 index 0000000000..e122201df0 --- /dev/null +++ b/build-scripts/code_coverage.cmake @@ -0,0 +1,37 @@ +# Copyright (C) 2019 Intel Corporation. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception + +function(check_ubuntu_version) +# ubuntu 2204 is the recommended environment for collecting coverage data for now +# otherwise, there will be ERRORs, when using 2404, like below and +# +# geninfo: ERROR: ('mismatch') mismatched end line for _ZN63compilation_aot_emit_memory_test_aot_check_memory_overflow_Test8TestBodyEv at /workspaces/wasm-micro-runtime/tests/unit/compilation/aot_emit_memory_test.cc:96: 96 -> 106 +# (use "geninfo --ignore-errors mismatch,mismatch ..." to suppress this warning) +# geninfo: ERROR: ('negative') Unexpected negative count '-3' for /workspaces/wasm-micro-runtime/core/iwasm/interpreter/wasm_interp_classic.c:5473. +# Perhaps you need to compile with '-fprofile-update=atomic +# (use "geninfo --ignore-errors negative,negative ..." to suppress this warning) +# +# For sure, `--ignore-errors` can be used to ignore these errors, but better to use the recommended environment. + file(READ "/etc/os-release" OS_RELEASE_CONTENT) + string(REGEX MATCH "VERSION_ID=\"([0-9]+)\\.([0-9]+)\"" _ ${OS_RELEASE_CONTENT}) + if(NOT DEFINED CMAKE_MATCH_1 OR NOT DEFINED CMAKE_MATCH_2) + message(WARNING "Unable to detect Ubuntu version. Please ensure you are using Ubuntu 22.04.") + return() + endif() + + set(UBUNTU_MAJOR_VERSION ${CMAKE_MATCH_1}) + set(UBUNTU_MINOR_VERSION ${CMAKE_MATCH_2}) + + if(NOT (UBUNTU_MAJOR_VERSION EQUAL 22 AND UBUNTU_MINOR_VERSION EQUAL 04)) + message(WARNING "Ubuntu ${UBUNTU_MAJOR_VERSION}.${UBUNTU_MINOR_VERSION} detected. Ubuntu 22.04 is recommended for collecting coverage data.") + else() + message(STATUS "Ubuntu 22.04 detected. Proceeding with coverage data collection.") + endif() +endfunction() + +check_ubuntu_version() + +# add compile options for code coverage globally +add_compile_options(--coverage -O0 -g) +link_libraries(gcov) +add_definitions (-DCOLLECT_CODE_COVERAGE) diff --git a/build-scripts/config_common.cmake b/build-scripts/config_common.cmake index 52c6d94afa..c087a0e673 100644 --- a/build-scripts/config_common.cmake +++ b/build-scripts/config_common.cmake @@ -640,9 +640,7 @@ if (WAMR_BUILD_GC_HEAP_VERIFY EQUAL 1) message (" GC heap verification enabled") endif () if ("$ENV{COLLECT_CODE_COVERAGE}" STREQUAL "1" OR COLLECT_CODE_COVERAGE EQUAL 1) - set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fprofile-arcs -ftest-coverage") - set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fprofile-arcs -ftest-coverage") - add_definitions (-DCOLLECT_CODE_COVERAGE) + include(${CMAKE_CURRENT_LIST_DIR}/code_coverage.cmake) message (" Collect code coverage enabled") endif () if (WAMR_BUILD_STATIC_PGO EQUAL 1) diff --git a/tests/unit/CMakeLists.txt b/tests/unit/CMakeLists.txt index b726f83a12..9c641049b4 100644 --- a/tests/unit/CMakeLists.txt +++ b/tests/unit/CMakeLists.txt @@ -30,13 +30,8 @@ if(WAMR_BUILD_TARGET STREQUAL "X86_32") set(CMAKE_LIBRARY_ARCHITECTURE "i386-linux-gnu" CACHE STRING "" FORCE) endif() -# Prevent overriding the parent project's compiler/linker -# settings on Windows -set(gtest_force_shared_crt ON CACHE BOOL "" FORCE) - # Fetch Google test include (FetchContent) - if(${CMAKE_VERSION} VERSION_GREATER_EQUAL "3.24") FetchContent_Declare ( googletest @@ -50,10 +45,11 @@ else() ) endif() +# Prevent overriding the parent project's compiler/linker +# settings on Windows +set(gtest_force_shared_crt ON CACHE BOOL "" FORCE) FetchContent_MakeAvailable(googletest) -SET(GOOGLETEST_INCLUDED 1) - include(GoogleTest) enable_testing() @@ -64,12 +60,13 @@ add_subdirectory(libc-builtin) add_subdirectory(shared-utils) add_subdirectory(linear-memory-wasm) add_subdirectory(linear-memory-aot) -add_subdirectory(aot-stack-frame) add_subdirectory(linux-perf) add_subdirectory(gc) add_subdirectory(tid-allocator) if (NOT WAMR_BUILD_TARGET STREQUAL "X86_32") + add_subdirectory(aot-stack-frame) + # should enable 32-bit llvm when X86_32 add_subdirectory (aot) add_subdirectory (custom-section) diff --git a/tests/unit/README.md b/tests/unit/README.md new file mode 100644 index 0000000000..8b50bcb5a5 --- /dev/null +++ b/tests/unit/README.md @@ -0,0 +1,195 @@ +# Guide to Creating a Test Suite for a New Feature in WAMR + +This guide provides instructions for contributors on how to create a test suite for a new feature in the WAMR project. Follow these steps to ensure consistency and maintainability across the test framework. + +--- + +## General Guidelines + +- **Create a New Directory**: + Always create a dedicated directory for a new feature under the `tests/unit/` directory. + + - Reuse existing test cases and patch them when possible to avoid redundancy. + - Name the directory in lowercase with words separated by hyphens (e.g., `new-feature`). + - Name the test source file in lowercase with words separated by underscore (e.g., `new_test.cc`). + +- **Avoid Committing `.wasm` Files**: + Do not commit precompiled `.wasm` files. Instead: + + - Generate `.wasm` files from `.wat` or `.c` source files. + - Use `ExternalProject` and the `wasi-sdk` toolchain to compile `.wasm` files during the build process. + +- **Keep Using `ctest` as the framework**: + Continue to use `ctest` for running the test cases, as it is already integrated into the existing test framework. + +--- + +## Writing `CMakeLists.txt` for the Test Suite + +When creating a `CMakeLists.txt` file for your test suite, follow these best practices: + +1. **Do Not Fetch Googletest Again**: + The root `unit/CMakeLists.txt` already fetches Googletest. Avoid including or fetching it again in your test suite. + +2. **Find LLVM on Demand**: + If your test suite requires LLVM, use `find_package` to locate LLVM components as needed. Do not include LLVM globally unless required. + +3. **Include `unit_common.cmake`**: + Always include `../unit_common.cmake` in your `CMakeLists.txt` to avoid duplicating common configurations and utilities. + + Example: + + ```cmake + include("../unit_common.cmake") + ``` + +4. **Use `WAMR_RUNTIME_LIB_SOURCE`**: + Replace long lists of runtime source files with the `WAMR_RUNTIME_LIB_SOURCE` variable to simplify your configuration. + + Example: + + ```cmake + target_sources(your_test_target PRIVATE ${WAMR_RUNTIME_LIB_SOURCE}) + ``` + +5. **Avoid Global Compilation Flags**: + Do not define global compilation flags in the `unit` directory. Each test case should specify its own compilation flags based on its unique requirements. + +--- + +## Generating `.wasm` Files + +- **Compile `.wasm` Files Dynamically**: + Use `ExternalProject` in your `CMakeLists.txt` to compile `.wasm` files from `.wat` or `.c` source files. + - Use the `wasi-sdk` toolchain for `.c` or `.cc` source files. + - Example configuration: + ```cmake + ExternalProject_Add( + generate_wasm + SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/wasm-apps + BUILD_ALWAYS YES + CONFIGURE_COMMAND ${CMAKE_COMMAND} -S ${CMAKE_CURRENT_SOURCE_DIR}/wasm-apps -B build + -DWASI_SDK_PREFIX=${WASI_SDK_DIR} + -DCMAKE_TOOLCHAIN_FILE=${WASISDK_TOOLCHAIN} + BUILD_COMMAND ${CMAKE_COMMAND} --build build + INSTALL_COMMAND ${CMAKE_COMMAND} --install build --prefix ${CMAKE_CURRENT_BINARY_DIR}/wasm-apps + ) + ``` +- **Example for `wasm-apps` Directory**: + Place your source files in a `wasm-apps/` subdirectory within your test suite directory. + + - Create a `CMakeLists.txt` in `wasm-apps/` to handle the compilation of these files. + - Example `CMakeLists.txt` for `wasm-apps/`: + + ```cmake + cmake_minimum_required(VERSION 3.13) + project(wasm_apps) + + add_executable(example example.c) + set_target_properties(example PROPERTIES SUFFIX .wasm) + install(TARGETS example DESTINATION .) + ``` + +--- + +## Compiling and Running Test Cases + +To compile and run the test cases, follow these steps: + +1. **Generate Build Files**: + + ```bash + cmake -S . -B build + ``` + +2. **Build the Test Suite**: + + ```bash + cmake --build build + ``` + +3. **Run the Tests**: + + ```bash + ctest --test-dir build --output-on-failure + ``` + + This will compile and execute all test cases in the test suite, displaying detailed output for any failures. + +4. **List all Tests**: + To see all available test cases, use: + + ```bash + ctest --test-dir build -N + ``` + +5. **Run a Specific Test**: + To run a specific test case, use: + ```bash + ctest --test-dir build -R --output-on-failure + ``` + +--- + +## Collecting Code Coverage Data + +To collect code coverage data using `lcov`, follow these steps: + +1. **Build with Coverage Flags**: + Ensure the test suite is built with coverage flags enabled: + + ```bash + cmake -S . -B build -DCOLLECT_CODE_COVERAGE=1 + cmake --build build + ``` + +2. **Run the Tests**: + Execute the test cases as described above. + +3. **Generate Coverage Report**: + Use `lcov` to collect and generate the coverage report: + + ```bash + lcov --capture --directory build --output-file coverage.all.info + lcov --extract coverage.all.info "*/core/iwasm/*" "*/core/shared/*" --output-file coverage.info + genhtml coverage.info --output-directory coverage-report + ``` + +4. **View the Report**: + Open the `index.html` file in the `coverage-report` directory to view the coverage results in your browser. + +5. **Summary of Coverage**: + To get a summary of the coverage data, use: + + ```bash + lcov --summary coverage.info + ``` + +--- + +## Example Directory Structure + +Here’s an example of how your test suite directory might look: + +``` +new-feature/ +├── CMakeLists.txt +├── new_feature_test.cc +├── wasm-apps/ +| ├── CMakeLists.txt +│ ├── example.c +│ └── example.wat +``` + +--- + +## Additional Notes + +- **Testing Framework**: Use Googletest for writing unit tests. Refer to existing test cases in the `tests/unit/` directory for examples. +- **Documentation**: Add comments in your test code to explain the purpose of each test case. +- **Edge Cases**: Ensure your test suite covers edge cases and potential failure scenarios. +- **Reuse Utilities**: Leverage existing utilities in `common/` (e.g., `mock_allocator.h`, `test_helper.h`) to simplify your test code. + +--- + +By following these guidelines, you can create a well-structured and maintainable test suite that integrates seamlessly with the WAMR testing framework. diff --git a/tests/unit/aot-stack-frame/CMakeLists.txt b/tests/unit/aot-stack-frame/CMakeLists.txt index 90a61aea76..b20bb67b9a 100644 --- a/tests/unit/aot-stack-frame/CMakeLists.txt +++ b/tests/unit/aot-stack-frame/CMakeLists.txt @@ -8,7 +8,7 @@ project (test-aot-stack-frame) add_definitions (-DRUN_ON_LINUX) set (WAMR_BUILD_AOT 1) -set (WAMR_BUILD_INTERP 0) +set (WAMR_BUILD_INTERP 1) set (WAMR_BUILD_JIT 0) set (WAMR_BUILD_SIMD 1) set (WAMR_BUILD_REF_TYPES 1) @@ -21,6 +21,10 @@ set (WAMR_BUILD_GC 1) include (../unit_common.cmake) +find_package(LLVM REQUIRED CONFIG) +include_directories(${LLVM_INCLUDE_DIRS}) +add_definitions(${LLVM_DEFINITIONS}) + include_directories (${CMAKE_CURRENT_SOURCE_DIR}) add_definitions (-DWASM_ENABLE_AOT_STACK_FRAME=1) @@ -32,22 +36,10 @@ file (GLOB_RECURSE source_all ${CMAKE_CURRENT_SOURCE_DIR}/*.cc) set (UNIT_SOURCE ${source_all}) set (unit_test_sources - ${UNIT_SOURCE} - ${WAMR_RUNTIME_LIB_SOURCE} - ${UNCOMMON_SHARED_SOURCE} - ${SRC_LIST} - ${PLATFORM_SHARED_SOURCE} - ${UTILS_SHARED_SOURCE} - ${MEM_ALLOC_SHARED_SOURCE} - ${LIB_HOST_AGENT_SOURCE} - ${NATIVE_INTERFACE_SOURCE} - ${LIBC_BUILTIN_SOURCE} - ${IWASM_COMMON_SOURCE} - ${IWASM_INTERP_SOURCE} - ${IWASM_AOT_SOURCE} - ${IWASM_COMPL_SOURCE} - ${WASM_APP_LIB_SOURCE_ALL} - ) + ${UNIT_SOURCE} + ${WAMR_RUNTIME_LIB_SOURCE} + ${IWASM_COMPL_SOURCE} +) # Automatically build wasm-apps for this test add_subdirectory(wasm-apps) @@ -59,4 +51,4 @@ add_dependencies (aot_stack_frame_test aot-stack-frame-test-wasm) target_link_libraries (aot_stack_frame_test ${LLVM_AVAILABLE_LIBS} gtest_main ) -#gtest_discover_tests(aot_stack_frame_test) \ No newline at end of file +gtest_discover_tests(aot_stack_frame_test) \ No newline at end of file diff --git a/tests/unit/aot/CMakeLists.txt b/tests/unit/aot/CMakeLists.txt index bb2216bddf..e45d4c0032 100644 --- a/tests/unit/aot/CMakeLists.txt +++ b/tests/unit/aot/CMakeLists.txt @@ -13,21 +13,18 @@ add_definitions (-DWASM_ENABLE_WAMR_COMPILER=1) add_definitions (-DWASM_ENABLE_DUMP_CALL_STACK=1) add_definitions (-DWASM_ENABLE_AOT_STACK_FRAME=1) +set (WAMR_BUILD_AOT 1) +set (WAMR_BUILD_FAST_INTERP 0) +set (WAMR_BUILD_INTERP 1) +set (WAMR_BUILD_JIT 0) set (WAMR_BUILD_LIBC_WASI 0) -set (WAMR_BUILD_APP_FRAMEWORK 1) +set (WAMR_BUILD_APP_FRAMEWORK 0) include (../unit_common.cmake) -set (LLVM_SRC_ROOT "${WAMR_ROOT_DIR}/core/deps/llvm") -if (NOT EXISTS "${LLVM_SRC_ROOT}/build") - message (FATAL_ERROR "Cannot find LLVM dir: ${LLVM_SRC_ROOT}/build") -endif () -set (CMAKE_PREFIX_PATH "${LLVM_SRC_ROOT}/build;${CMAKE_PREFIX_PATH}") find_package(LLVM REQUIRED CONFIG) include_directories(${LLVM_INCLUDE_DIRS}) add_definitions(${LLVM_DEFINITIONS}) -message(STATUS "Found LLVM ${LLVM_PACKAGE_VERSION}") -message(STATUS "Using LLVMConfig.cmake in: ${LLVM_DIR}") include (${IWASM_DIR}/compilation/iwasm_compl.cmake) @@ -39,16 +36,9 @@ set (UNIT_SOURCE ${source_all}) set (unit_test_sources ${UNIT_SOURCE} - ${PLATFORM_SHARED_SOURCE} - ${UTILS_SHARED_SOURCE} - ${MEM_ALLOC_SHARED_SOURCE} - ${NATIVE_INTERFACE_SOURCE} - ${LIBC_BUILTIN_SOURCE} - ${IWASM_COMMON_SOURCE} - ${IWASM_INTERP_SOURCE} - ${IWASM_AOT_SOURCE} + ${WAMR_RUNTIME_LIB_SOURCE} ${IWASM_COMPL_SOURCE} - ) +) # Now simply link against gtest or gtest_main as needed. Eg add_executable (aot_test ${unit_test_sources}) diff --git a/tests/unit/compilation/CMakeLists.txt b/tests/unit/compilation/CMakeLists.txt index 65a9dfbdaa..f6912122d9 100644 --- a/tests/unit/compilation/CMakeLists.txt +++ b/tests/unit/compilation/CMakeLists.txt @@ -14,22 +14,20 @@ add_definitions (-DWASM_ENABLE_DUMP_CALL_STACK=1) add_definitions (-DWASM_ENABLE_AOT_STACK_FRAME=1) set (WAMR_BUILD_LIBC_WASI 0) +set (WAMR_BUILD_LIBC_BUILTIN 1) +set (WAMR_BUILD_MULTI_MODULE 1) set (WAMR_BUILD_APP_FRAMEWORK 0) set (WAMR_BUILD_THREAD_MGR 1) set (WAMR_BUILD_AOT 1) +set (WAMR_BUILD_FAST_INTERP 0) +set (WAMR_BUILD_INTERP 1) +set (WAMR_BUILD_JIT 0) include (../unit_common.cmake) -set (LLVM_SRC_ROOT "${WAMR_ROOT_DIR}/core/deps/llvm") -if (NOT EXISTS "${LLVM_SRC_ROOT}/build") - message (FATAL_ERROR "Cannot find LLVM dir: ${LLVM_SRC_ROOT}/build") -endif () -set (CMAKE_PREFIX_PATH "${LLVM_SRC_ROOT}/build;${CMAKE_PREFIX_PATH}") find_package(LLVM REQUIRED CONFIG) include_directories(${LLVM_INCLUDE_DIRS}) add_definitions(${LLVM_DEFINITIONS}) -message(STATUS "Found LLVM ${LLVM_PACKAGE_VERSION}") -message(STATUS "Using LLVMConfig.cmake in: ${LLVM_DIR}") include (${IWASM_DIR}/compilation/iwasm_compl.cmake) @@ -40,22 +38,11 @@ file (GLOB_RECURSE source_all ${CMAKE_CURRENT_SOURCE_DIR}/*.cc) set (UNIT_SOURCE ${source_all}) set (unit_test_sources - ${UNIT_SOURCE} - ${WAMR_RUNTIME_LIB_SOURCE} - ${UNCOMMON_SHARED_SOURCE} - ${SRC_LIST} - ${PLATFORM_SHARED_SOURCE} - ${UTILS_SHARED_SOURCE} - ${MEM_ALLOC_SHARED_SOURCE} - ${LIB_HOST_AGENT_SOURCE} - ${NATIVE_INTERFACE_SOURCE} - ${LIBC_BUILTIN_SOURCE} - ${IWASM_COMMON_SOURCE} - ${IWASM_INTERP_SOURCE} - ${IWASM_AOT_SOURCE} - ${IWASM_COMPL_SOURCE} - ${WASM_APP_LIB_SOURCE_ALL} - ) + ${UNIT_SOURCE} + ${WAMR_RUNTIME_LIB_SOURCE} + ${IWASM_COMPL_SOURCE} + ${UNCOMMON_SHARED_SOURCE} +) # Now simply link against gtest or gtest_main as needed. Eg add_executable (compilation_test ${unit_test_sources}) diff --git a/tests/unit/custom-section/CMakeLists.txt b/tests/unit/custom-section/CMakeLists.txt index 747a8b1263..b57fb8bffb 100644 --- a/tests/unit/custom-section/CMakeLists.txt +++ b/tests/unit/custom-section/CMakeLists.txt @@ -2,16 +2,31 @@ # SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception cmake_minimum_required(VERSION 3.14) - project (test-custom-section) +set(WASI_SDK_DIR "/opt/wasi-sdk") +set(WASISDK_TOOLCHAIN "${WASI_SDK_DIR}/share/cmake/wasi-sdk.cmake") + +include(ExternalProject) +ExternalProject_Add( + custom-section-test-wasm-apps + SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/wasm-apps + BUILD_ALWAYS YES + CONFIGURE_COMMAND ${CMAKE_COMMAND} -S ${CMAKE_CURRENT_SOURCE_DIR}/wasm-apps -B build + -DWASI_SDK_PREFIX=${WASI_SDK_DIR} + -DCMAKE_TOOLCHAIN_FILE=${WASISDK_TOOLCHAIN} + BUILD_COMMAND ${CMAKE_COMMAND} --build build + INSTALL_COMMAND ${CMAKE_COMMAND} --install build --prefix ${CMAKE_CURRENT_BINARY_DIR}/wasm-apps +) + add_definitions (-DRUN_ON_LINUX) set (WAMR_BUILD_LIBC_WASI 0) set (WAMR_BUILD_LIBC_BUILTIN 0) -set (WAMR_BUILD_JIT 0) -set (WAMR_BUILD_LAZY_JIT 0) set (WAMR_BUILD_AOT 1) +set (WAMR_BUILD_FAST_INTERP 0) +set (WAMR_BUILD_INTERP 1) +set (WAMR_BUILD_JIT 0) add_definitions(-DWASM_ENABLE_WAMR_COMPILER=1) add_definitions (-DWASM_ENABLE_DUMP_CALL_STACK=1) @@ -22,16 +37,9 @@ set (WAMR_BUILD_LOAD_CUSTOM_SECTION 1) include (../unit_common.cmake) -set (LLVM_SRC_ROOT "${WAMR_ROOT_DIR}/core/deps/llvm") -if (NOT EXISTS "${LLVM_SRC_ROOT}/build") - message (FATAL_ERROR "Cannot find LLVM dir: ${LLVM_SRC_ROOT}/build") -endif () -set (CMAKE_PREFIX_PATH "${LLVM_SRC_ROOT}/build;${CMAKE_PREFIX_PATH}") find_package(LLVM REQUIRED CONFIG) include_directories(${LLVM_INCLUDE_DIRS}) add_definitions(${LLVM_DEFINITIONS}) -message(STATUS "Found LLVM ${LLVM_PACKAGE_VERSION}") -message(STATUS "Using LLVMConfig.cmake in: ${LLVM_DIR}") include (${IWASM_DIR}/compilation/iwasm_compl.cmake) @@ -42,20 +50,10 @@ file (GLOB_RECURSE source_all ${CMAKE_CURRENT_SOURCE_DIR}/*.cc) set (UNIT_SOURCE ${source_all}) set (unit_test_sources - ${UNIT_SOURCE} - ${PLATFORM_SHARED_SOURCE} - ${UTILS_SHARED_SOURCE} - ${MEM_ALLOC_SHARED_SOURCE} - ${NATIVE_INTERFACE_SOURCE} - ${IWASM_COMMON_SOURCE} - ${IWASM_INTERP_SOURCE} - ${IWASM_AOT_SOURCE} - ${IWASM_COMPL_SOURCE} - ${WASM_APP_LIB_SOURCE_ALL} - ) - -# Automatically build wasm-apps for this test -add_subdirectory(wasm-apps) + ${UNIT_SOURCE} + ${WAMR_RUNTIME_LIB_SOURCE} + ${IWASM_COMPL_SOURCE} +) # Now simply link against gtest or gtest_main as needed. Eg add_executable (custom_section_test ${unit_test_sources}) diff --git a/tests/unit/custom-section/wasm-apps/CMakeLists.txt b/tests/unit/custom-section/wasm-apps/CMakeLists.txt index 6455db554d..6f80d6968a 100644 --- a/tests/unit/custom-section/wasm-apps/CMakeLists.txt +++ b/tests/unit/custom-section/wasm-apps/CMakeLists.txt @@ -2,13 +2,20 @@ # SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception cmake_minimum_required(VERSION 3.14) +project(wasm-apps) -project(wasm-apps-custom-section) +add_executable(app.wasm app.c) +target_compile_options(app.wasm PUBLIC -g -nostdlib) +target_link_options(app.wasm PRIVATE + -nostdlib + LINKER:--allow-undefined + LINKER:--export-all + LINKER:--no-entry +) -# Add -g option so there will be debugger related custom sections -add_custom_target(app.wasm ALL - COMMAND /opt/wasi-sdk/bin/clang -g -nostdlib - -Wl,--no-entry,--export-all - -o ${CMAKE_CURRENT_BINARY_DIR}/app.wasm - ${CMAKE_CURRENT_LIST_DIR}/app.c +# install .wasm +set( + WASM_FILES + ${CMAKE_CURRENT_BINARY_DIR}/app.wasm ) +install(FILES ${WASM_FILES} DESTINATION .) diff --git a/tests/unit/gc/CMakeLists.txt b/tests/unit/gc/CMakeLists.txt index 6d9670dfe5..c8b865a384 100644 --- a/tests/unit/gc/CMakeLists.txt +++ b/tests/unit/gc/CMakeLists.txt @@ -21,21 +21,9 @@ file (GLOB_RECURSE source_all ${CMAKE_CURRENT_SOURCE_DIR}/*.cc) set (UNIT_SOURCE ${source_all}) set (unit_test_sources - ${UNIT_SOURCE} - ${WAMR_RUNTIME_LIB_SOURCE} - ${UNCOMMON_SHARED_SOURCE} - ${SRC_LIST} - ${PLATFORM_SHARED_SOURCE} - ${UTILS_SHARED_SOURCE} - ${MEM_ALLOC_SHARED_SOURCE} - ${LIB_HOST_AGENT_SOURCE} - ${NATIVE_INTERFACE_SOURCE} - ${LIBC_BUILTIN_SOURCE} - ${IWASM_COMMON_SOURCE} - ${IWASM_INTERP_SOURCE} - ${IWASM_AOT_SOURCE} - ${IWASM_COMPL_SOURCE} - ${WASM_APP_LIB_SOURCE_ALL} + ${UNIT_SOURCE} + ${WAMR_RUNTIME_LIB_SOURCE} + ${UNCOMMON_SHARED_SOURCE} ) add_executable (gc_test ${unit_test_sources}) @@ -48,4 +36,4 @@ add_custom_command(TARGET gc_test POST_BUILD COMMENT "Copy wasm files to directory ${CMAKE_CURRENT_BINARY_DIR}" ) -#gtest_discover_tests(gc_test) \ No newline at end of file +gtest_discover_tests(gc_test) \ No newline at end of file diff --git a/tests/unit/interpreter/CMakeLists.txt b/tests/unit/interpreter/CMakeLists.txt index f0a1d5e22a..ef65e443f7 100644 --- a/tests/unit/interpreter/CMakeLists.txt +++ b/tests/unit/interpreter/CMakeLists.txt @@ -11,9 +11,12 @@ add_definitions (-Dattr_container_malloc=malloc) add_definitions (-Dattr_container_free=free) # add_definitions (-DWASM_ENABLE_WAMR_COMPILER=1) +set(WAMR_BUILD_AOT 0) +set(WAMR_BUILD_FAST_INTERP 0) +set(WAMR_BUILD_INTERP 1) +set(WAMR_BUILD_JIT 0) set (WAMR_BUILD_LIBC_WASI 0) set (WAMR_BUILD_APP_FRAMEWORK 1) -set (WAMR_BUILD_AOT 0) include (../unit_common.cmake) @@ -24,19 +27,13 @@ file (GLOB_RECURSE source_all ${CMAKE_CURRENT_SOURCE_DIR}/*.cc) set (UNIT_SOURCE ${source_all}) set (unit_test_sources - ${UNIT_SOURCE} - ${PLATFORM_SHARED_SOURCE} - ${UTILS_SHARED_SOURCE} - ${MEM_ALLOC_SHARED_SOURCE} - ${NATIVE_INTERFACE_SOURCE} - ${LIBC_BUILTIN_SOURCE} - ${IWASM_COMMON_SOURCE} - ${IWASM_INTERP_SOURCE} - ) + ${UNIT_SOURCE} + ${WAMR_RUNTIME_LIB_SOURCE} +) # Now simply link against gtest or gtest_main as needed. Eg add_executable (interpreter_test ${unit_test_sources}) -target_link_libraries (interpreter_test ${LLVM_AVAILABLE_LIBS} gtest_main ) +target_link_libraries (interpreter_test gtest_main ) gtest_discover_tests(interpreter_test) diff --git a/tests/unit/libc-builtin/CMakeLists.txt b/tests/unit/libc-builtin/CMakeLists.txt index f39ed44444..789018c3bc 100644 --- a/tests/unit/libc-builtin/CMakeLists.txt +++ b/tests/unit/libc-builtin/CMakeLists.txt @@ -7,10 +7,15 @@ project (test-libc-builtin) add_definitions (-DRUN_ON_LINUX) -set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}") - +set (WAMR_BUILD_AOT 0) +set (WAMR_BUILD_FAST_INTERP 0) +set (WAMR_BUILD_INTERP 1) +set (WAMR_BUILD_JIT 0) +set (WAMR_BUILD_LIBC_BUILTIN 1) set (WAMR_BUILD_LIBC_WASI 0) set (WAMR_BUILD_APP_FRAMEWORK 0) +# FIXME: if removed, LibcBuiltinTest.calloc will be failed +set (WAMR_BUILD_MULTI_MODULE 1) include (../unit_common.cmake) @@ -21,9 +26,9 @@ file (GLOB_RECURSE source_all ${CMAKE_CURRENT_SOURCE_DIR}/*.cc) set (UNIT_SOURCE ${source_all}) set (unit_test_sources - ${UNIT_SOURCE} - ${WAMR_RUNTIME_LIB_SOURCE} - ) + ${UNIT_SOURCE} + ${WAMR_RUNTIME_LIB_SOURCE} +) add_executable (libc_builtin_test ${unit_test_sources}) diff --git a/tests/unit/linear-memory-aot/CMakeLists.txt b/tests/unit/linear-memory-aot/CMakeLists.txt index 02e96c6d10..b76881f7f3 100644 --- a/tests/unit/linear-memory-aot/CMakeLists.txt +++ b/tests/unit/linear-memory-aot/CMakeLists.txt @@ -12,6 +12,7 @@ set (WAMR_BUILD_APP_FRAMEWORK 0) set (WAMR_BUILD_MEMORY_PROFILING 1) set (WAMR_BUILD_INTERP 0) set (WAMR_BUILD_AOT 1) +set (WAMR_BUILD_FAST_INTERP 0) include (../unit_common.cmake) @@ -22,21 +23,10 @@ file (GLOB_RECURSE source_all ${CMAKE_CURRENT_SOURCE_DIR}/*.cc) set (UNIT_SOURCE ${source_all}) set (unit_test_sources - ${UNIT_SOURCE} - ${WAMR_RUNTIME_LIB_SOURCE} - ${UNCOMMON_SHARED_SOURCE} - ${SRC_LIST} - ${PLATFORM_SHARED_SOURCE} - ${UTILS_SHARED_SOURCE} - ${MEM_ALLOC_SHARED_SOURCE} - ${LIB_HOST_AGENT_SOURCE} - ${NATIVE_INTERFACE_SOURCE} - ${LIBC_BUILTIN_SOURCE} - ${IWASM_COMMON_SOURCE} - ${IWASM_INTERP_SOURCE} - ${IWASM_AOT_SOURCE} - ${IWASM_COMPL_SOURCE} - ${WASM_APP_LIB_SOURCE_ALL} + ${UNIT_SOURCE} + ${WAMR_RUNTIME_LIB_SOURCE} + ${UNCOMMON_SHARED_SOURCE} + ${IWASM_COMPL_SOURCE} ) # Test case: .aot file with hardware bound check. diff --git a/tests/unit/linear-memory-wasm/CMakeLists.txt b/tests/unit/linear-memory-wasm/CMakeLists.txt index a899b8fbe4..084d0c0942 100644 --- a/tests/unit/linear-memory-wasm/CMakeLists.txt +++ b/tests/unit/linear-memory-wasm/CMakeLists.txt @@ -25,18 +25,6 @@ set (unit_test_sources ${UNIT_SOURCE} ${WAMR_RUNTIME_LIB_SOURCE} ${UNCOMMON_SHARED_SOURCE} - ${SRC_LIST} - ${PLATFORM_SHARED_SOURCE} - ${UTILS_SHARED_SOURCE} - ${MEM_ALLOC_SHARED_SOURCE} - ${LIB_HOST_AGENT_SOURCE} - ${NATIVE_INTERFACE_SOURCE} - ${LIBC_BUILTIN_SOURCE} - ${IWASM_COMMON_SOURCE} - ${IWASM_INTERP_SOURCE} - ${IWASM_AOT_SOURCE} - ${IWASM_COMPL_SOURCE} - ${WASM_APP_LIB_SOURCE_ALL} ) # Test case: .wasm file with hardware bound check. diff --git a/tests/unit/linux-perf/CMakeLists.txt b/tests/unit/linux-perf/CMakeLists.txt index 572a087050..e5e2d56921 100644 --- a/tests/unit/linux-perf/CMakeLists.txt +++ b/tests/unit/linux-perf/CMakeLists.txt @@ -10,8 +10,9 @@ add_definitions (-DRUN_ON_LINUX) set (WAMR_BUILD_LIBC_WASI 0) set (WAMR_BUILD_LIBC_BUILTIN 0) set (WAMR_BUILD_JIT 0) -set (WAMR_BUILD_LAZY_JIT 0) set (WAMR_BUILD_AOT 1) +set (WAMR_BUILD_FAST_INTERP 0) +set (WAMR_BUILD_INTERP 1) set (WAMR_BUILD_MULTI_MODULE 0) set (WAMR_BUILD_LINUX_PERF 1) @@ -22,22 +23,15 @@ set (WAMR_BUILD_DUMP_CALL_STACK 1) include (../unit_common.cmake) -set (LLVM_SRC_ROOT "${WAMR_ROOT_DIR}/core/deps/llvm") -if (NOT EXISTS "${LLVM_SRC_ROOT}/build") - message (FATAL_ERROR "Cannot find LLVM dir: ${LLVM_SRC_ROOT}/build") -endif () -set (CMAKE_PREFIX_PATH "${LLVM_SRC_ROOT}/build;${CMAKE_PREFIX_PATH}") find_package(LLVM REQUIRED CONFIG) include_directories(${LLVM_INCLUDE_DIRS}) add_definitions(${LLVM_DEFINITIONS}) -message(STATUS "Found LLVM ${LLVM_PACKAGE_VERSION}") -message(STATUS "Using LLVMConfig.cmake in: ${LLVM_DIR}") include (${IWASM_DIR}/compilation/iwasm_compl.cmake) add_executable (linux_perf_test test_sort_func_ptrs.cc) target_compile_options(linux_perf_test PUBLIC -fpermissive) -target_link_libraries(linux_perf_test gtest_main ) +target_link_libraries(linux_perf_test ${LLVM_AVAILABLE_LIBS} gtest_main ) target_link_options(linux_perf_test PUBLIC LINKER:--unresolved-symbols=ignore-all diff --git a/tests/unit/memory64/CMakeLists.txt b/tests/unit/memory64/CMakeLists.txt index f3629a7c40..b19c9d9cfa 100644 --- a/tests/unit/memory64/CMakeLists.txt +++ b/tests/unit/memory64/CMakeLists.txt @@ -22,20 +22,9 @@ set(WAMR_BUILD_SHARED_MEMORY 1) # include(GoogleTest) include(../unit_common.cmake) -set(LLVM_SRC_ROOT "${WAMR_ROOT_DIR}/core/deps/llvm") - -if (NOT EXISTS "${LLVM_SRC_ROOT}/build") - message(FATAL_ERROR "Cannot find LLVM dir: ${LLVM_SRC_ROOT}/build") -endif () - -set(CMAKE_PREFIX_PATH "${LLVM_SRC_ROOT}/build;${CMAKE_PREFIX_PATH}") find_package(LLVM REQUIRED CONFIG) include_directories(${LLVM_INCLUDE_DIRS}) add_definitions(${LLVM_DEFINITIONS}) -message(STATUS "Found LLVM ${LLVM_PACKAGE_VERSION}") -message(STATUS "Using LLVMConfig.cmake in: ${LLVM_DIR}") - -include(${IWASM_DIR}/compilation/iwasm_compl.cmake) include_directories(${CMAKE_CURRENT_SOURCE_DIR}) @@ -43,14 +32,11 @@ file(GLOB_RECURSE source_all ${CMAKE_CURRENT_SOURCE_DIR}/*.cc) set(UNIT_SOURCE ${source_all}) -aux_source_directory(. SRC_LIST) - set(unit_test_sources - ${UNIT_SOURCE} - ${WAMR_RUNTIME_LIB_SOURCE} - ${UNCOMMON_SHARED_SOURCE} - ${SRC_LIST} - ) + ${UNIT_SOURCE} + ${WAMR_RUNTIME_LIB_SOURCE} + ${UNCOMMON_SHARED_SOURCE} +) # Now simply link against gtest or gtest_main as needed. Eg add_executable(memory64_test ${unit_test_sources}) diff --git a/tests/unit/running-modes/CMakeLists.txt b/tests/unit/running-modes/CMakeLists.txt index 5fc6a80bce..3a5ca4745a 100644 --- a/tests/unit/running-modes/CMakeLists.txt +++ b/tests/unit/running-modes/CMakeLists.txt @@ -5,52 +5,51 @@ cmake_minimum_required(VERSION 3.14) project(test-running-modes) -# Compile wasm modules -add_subdirectory(wasm-apps) +set(WASI_SDK_DIR "/opt/wasi-sdk") +set(WASISDK_TOOLCHAIN "${WASI_SDK_DIR}/share/cmake/wasi-sdk.cmake") + +include(ExternalProject) +ExternalProject_Add( + test-running-modes-wasm-apps + SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/wasm-apps + BUILD_ALWAYS YES + CONFIGURE_COMMAND ${CMAKE_COMMAND} -S ${CMAKE_CURRENT_SOURCE_DIR}/wasm-apps -B build + -DWASI_SDK_PREFIX=${WASI_SDK_DIR} + -DCMAKE_TOOLCHAIN_FILE=${WASISDK_TOOLCHAIN} + BUILD_COMMAND ${CMAKE_COMMAND} --build build + INSTALL_COMMAND ${CMAKE_COMMAND} --install build --prefix ${CMAKE_CURRENT_BINARY_DIR} +) add_definitions(-DRUN_ON_LINUX) +set(WAMR_BUILD_LIBC_BUILTIN 1) +set(WAMR_BUILD_MULTI_MODULE 0) set(WAMR_BUILD_LIBC_WASI 1) set(WAMR_BUILD_APP_FRAMEWORK 0) set(WAMR_BUILD_JIT 1) set(WAMR_BUILD_FAST_JIT 1) +set(WAMR_BUILD_REF_TYPES 1) # if only load this CMake other than load it as subdirectory include(../unit_common.cmake) -set(LLVM_SRC_ROOT "${WAMR_ROOT_DIR}/core/deps/llvm") - -if (NOT EXISTS "${LLVM_SRC_ROOT}/build") - message(FATAL_ERROR "Cannot find LLVM dir: ${LLVM_SRC_ROOT}/build") -endif () - -set(CMAKE_PREFIX_PATH "${LLVM_SRC_ROOT}/build;${CMAKE_PREFIX_PATH}") find_package(LLVM REQUIRED CONFIG) include_directories(${LLVM_INCLUDE_DIRS}) add_definitions(${LLVM_DEFINITIONS}) -message(STATUS "Found LLVM ${LLVM_PACKAGE_VERSION}") -message(STATUS "Using LLVMConfig.cmake in: ${LLVM_DIR}") - -include(${IWASM_DIR}/compilation/iwasm_compl.cmake) include_directories(${CMAKE_CURRENT_SOURCE_DIR}) -file(GLOB_RECURSE source_all ${CMAKE_CURRENT_SOURCE_DIR}/*.cc) - -set(UNIT_SOURCE ${source_all}) - -aux_source_directory(. SRC_LIST) +aux_source_directory(${CMAKE_CURRENT_SOURCE_DIR} SRC_LIST) set(unit_test_sources - ${UNIT_SOURCE} - ${WAMR_RUNTIME_LIB_SOURCE} - ${UNCOMMON_SHARED_SOURCE} - ${SRC_LIST} - ) + ${WAMR_RUNTIME_LIB_SOURCE} + ${UNCOMMON_SHARED_SOURCE} + ${SRC_LIST} +) # Now simply link against gtest or gtest_main as needed. Eg add_executable(wasm_running_modes_test ${unit_test_sources}) - target_link_libraries(wasm_running_modes_test ${LLVM_AVAILABLE_LIBS} gtest_main) +add_dependencies(wasm_running_modes_test test-running-modes-wasm-apps) gtest_discover_tests(wasm_running_modes_test) diff --git a/tests/unit/running-modes/wasm-apps/CMakeLists.txt b/tests/unit/running-modes/wasm-apps/CMakeLists.txt index b2f1e9c0c5..c840169379 100644 --- a/tests/unit/running-modes/wasm-apps/CMakeLists.txt +++ b/tests/unit/running-modes/wasm-apps/CMakeLists.txt @@ -4,46 +4,30 @@ cmake_minimum_required(VERSION 3.14) project(wasm-apps) -set(WAMR_ROOT_DIR ${CMAKE_CURRENT_SOURCE_DIR}/../../../..) - -set(CMAKE_SYSTEM_PROCESSOR wasm32) -set(CMAKE_SYSROOT ${WAMR_ROOT_DIR}/wamr-sdk/app/libc-builtin-sysroot) - -if (NOT DEFINED WASI_SDK_DIR) - set(WASI_SDK_DIR "/opt/wasi-sdk") -endif () - -set(CMAKE_C_FLAGS "-nostdlib -pthread -Qunused-arguments") -set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -z stack-size=8192 -nostdlib") -set(CMAKE_C_COMPILER_TARGET "wasm32") -set(CMAKE_C_COMPILER "${WASI_SDK_DIR}/bin/clang") - -set(DEFINED_SYMBOLS - "${WAMR_ROOT_DIR}/wamr-sdk/app/libc-builtin-sysroot/share/defined-symbols.txt") - -set(CMAKE_EXE_LINKER_FLAGS - "-Wl,--no-entry \ - -Wl,--initial-memory=65536 \ - -Wl,--export-all \ - -Wl,--allow-undefined" - ) - add_executable(mytest.wasm mytest.c) -target_link_libraries(mytest.wasm) +target_compile_options(mytest.wasm PUBLIC -nostdlib) +target_link_options(mytest.wasm PRIVATE + -nostdlib + LINKER:--allow-undefined + LINKER:--export-all + LINKER:--initial-memory=131072 + LINKER:--no-entry +) add_executable(hello.wasm hello.c) -target_link_libraries(hello.wasm) - -add_custom_command(TARGET hello.wasm POST_BUILD - COMMAND ${CMAKE_COMMAND} -E copy - ${CMAKE_CURRENT_BINARY_DIR}/hello.wasm - ${CMAKE_CURRENT_BINARY_DIR}/../ - COMMENT "Copy hello.wasm to the same directory of google test" - ) - -add_custom_command(TARGET mytest.wasm POST_BUILD - COMMAND ${CMAKE_COMMAND} -E copy - ${CMAKE_CURRENT_BINARY_DIR}/mytest.wasm - ${CMAKE_CURRENT_BINARY_DIR}/../ - COMMENT "Copy mytest.wasm to the same directory of google test" - ) +target_compile_options(hello.wasm PUBLIC -nostdlib) +target_link_options(hello.wasm PRIVATE + -nostdlib + LINKER:--allow-undefined + LINKER:--export-all + LINKER:--initial-memory=131072 + LINKER:--no-entry +) + +# install .wasm +set( + WASM_FILES + ${CMAKE_CURRENT_BINARY_DIR}/hello.wasm + ${CMAKE_CURRENT_BINARY_DIR}/mytest.wasm +) +install(FILES ${WASM_FILES} DESTINATION .) diff --git a/tests/unit/runtime-common/CMakeLists.txt b/tests/unit/runtime-common/CMakeLists.txt index 21e5a917f2..9ef07ff50c 100644 --- a/tests/unit/runtime-common/CMakeLists.txt +++ b/tests/unit/runtime-common/CMakeLists.txt @@ -7,23 +7,20 @@ project(test-runtime-common) add_definitions(-DRUN_ON_LINUX) -set(WAMR_BUILD_LIBC_WASI 0) -set(WAMR_BUILD_APP_FRAMEWORK 0) +set (WAMR_BUILD_AOT 1) +set (WAMR_BUILD_FAST_INTERP 0) +set (WAMR_BUILD_INTERP 1) +set (WAMR_BUILD_JIT 0) +set (WAMR_BUILD_LIBC_WASI 0) +set (WAMR_BUILD_LIBC_BUILTIN 1) +set (WAMR_BUILD_APP_FRAMEWORK 0) +set (WAMR_BUILD_MULTI_MODULE 1) include(../unit_common.cmake) -set(LLVM_SRC_ROOT "${WAMR_ROOT_DIR}/core/deps/llvm") - -if(NOT EXISTS "${LLVM_SRC_ROOT}/build") - message(FATAL_ERROR "Cannot find LLVM dir: ${LLVM_SRC_ROOT}/build") -endif() - -set(CMAKE_PREFIX_PATH "${LLVM_SRC_ROOT}/build;${CMAKE_PREFIX_PATH}") find_package(LLVM REQUIRED CONFIG) include_directories(${LLVM_INCLUDE_DIRS}) add_definitions(${LLVM_DEFINITIONS}) -message(STATUS "Found LLVM ${LLVM_PACKAGE_VERSION}") -message(STATUS "Using LLVMConfig.cmake in: ${LLVM_DIR}") include_directories(${CMAKE_CURRENT_SOURCE_DIR}) @@ -31,13 +28,10 @@ file(GLOB_RECURSE source_all ${CMAKE_CURRENT_SOURCE_DIR}/*.cc) set(UNIT_SOURCE ${source_all}) -aux_source_directory(. SRC_LIST) - set(unit_test_sources ${UNIT_SOURCE} ${WAMR_RUNTIME_LIB_SOURCE} ${UNCOMMON_SHARED_SOURCE} - ${SRC_LIST} ) add_executable(runtime_common_test ${unit_test_sources}) @@ -45,11 +39,8 @@ add_executable(runtime_common_test ${unit_test_sources}) target_link_libraries(runtime_common_test ${LLVM_AVAILABLE_LIBS} gtest_main) # Ensure that aot compiled is completed before linear_memory_test_aot is built -set(dummy_output "${CMAKE_CURRENT_BINARY_DIR}/dummy_output") - -add_custom_command(OUTPUT ${dummy_output} +add_custom_command(OUTPUT ${CMAKE_CURRENT_LIST_DIR}/wasm-apps/main.aot COMMAND ./build_aot.sh - COMMAND ${CMAKE_COMMAND} -E touch ${dummy_output} WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/build_aot.sh COMMENT "Executing script to compile aot files" @@ -58,15 +49,15 @@ add_custom_command(OUTPUT ${dummy_output} add_custom_target( BuildAot ALL - DEPENDS ${dummy_output} + DEPENDS ${CMAKE_CURRENT_LIST_DIR}/wasm-apps/main.aot ) add_dependencies(runtime_common_test BuildAot) add_custom_command(TARGET runtime_common_test POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy - ${CMAKE_CURRENT_LIST_DIR}/wasm-apps/main.wasm ${CMAKE_CURRENT_LIST_DIR}/wasm-apps/main.aot - ${CMAKE_CURRENT_BINARY_DIR} + ${CMAKE_CURRENT_LIST_DIR}/wasm-apps/main.wasm ${CMAKE_CURRENT_LIST_DIR}/wasm-apps/main.aot + ${CMAKE_CURRENT_BINARY_DIR} COMMENT "Copy main.wasm and main.aot to the directory: build/runtime-common." ) diff --git a/tests/unit/runtime-common/wasm_runtime_common_test.cc b/tests/unit/runtime-common/wasm_runtime_common_test.cc index 15a02673b2..b1282091c5 100644 --- a/tests/unit/runtime-common/wasm_runtime_common_test.cc +++ b/tests/unit/runtime-common/wasm_runtime_common_test.cc @@ -381,18 +381,6 @@ TEST_F(wasm_runtime_common_test_suite, functions_on_wasm_module) exec_env, (WASMFunctionInstanceCommon *)(&func_test_1), 0, nullptr, 1, arguments)); -#if 0 - WASMFunctionInstance func_test; - WASMFunctionImport func_import_test; - WASMType *func_type_1 = nullptr; - func_import_test.func_type = func_type; - func_test.u.func_import = &func_import_test; - func_test.is_import_func = true; - func_type_1 = wasm_runtime_get_function_type(&func_test, - wasm_module_inst->module_type); - EXPECT_NE(func_type_1, nullptr); -#endif - EXPECT_EQ(true, wasm_runtime_create_exec_env_singleton(wasm_module_inst)); EXPECT_NE(nullptr, wasm_runtime_get_exec_env_singleton(wasm_module_inst)); diff --git a/tests/unit/shared-heap/CMakeLists.txt b/tests/unit/shared-heap/CMakeLists.txt index fa7067918a..e1e7a1a9a3 100644 --- a/tests/unit/shared-heap/CMakeLists.txt +++ b/tests/unit/shared-heap/CMakeLists.txt @@ -29,19 +29,6 @@ endif () # if only load this CMake other than load it as subdirectory include(../unit_common.cmake) -set(LLVM_SRC_ROOT "${WAMR_ROOT_DIR}/core/deps/llvm") - -if (NOT EXISTS "${LLVM_SRC_ROOT}/build") - message(FATAL_ERROR "Cannot find LLVM dir: ${LLVM_SRC_ROOT}/build") -endif () - -set(CMAKE_PREFIX_PATH "${LLVM_SRC_ROOT}/build;${CMAKE_PREFIX_PATH}") -find_package(LLVM REQUIRED CONFIG) -include_directories(${LLVM_INCLUDE_DIRS}) -add_definitions(${LLVM_DEFINITIONS}) -message(STATUS "Found LLVM ${LLVM_PACKAGE_VERSION}") -message(STATUS "Using LLVMConfig.cmake in: ${LLVM_DIR}") - include(${IWASM_DIR}/compilation/iwasm_compl.cmake) include_directories(${CMAKE_CURRENT_SOURCE_DIR}) @@ -50,18 +37,15 @@ file(GLOB_RECURSE source_all ${CMAKE_CURRENT_SOURCE_DIR}/*.cc) set(UNIT_SOURCE ${source_all}) -aux_source_directory(. SRC_LIST) - set(unit_test_sources - ${UNIT_SOURCE} - ${WAMR_RUNTIME_LIB_SOURCE} - ${UNCOMMON_SHARED_SOURCE} - ${SRC_LIST} - ) + ${UNIT_SOURCE} + ${WAMR_RUNTIME_LIB_SOURCE} + ${UNCOMMON_SHARED_SOURCE} +) # Now simply link against gtest or gtest_main as needed. Eg add_executable(shared_heap_test ${unit_test_sources}) -target_link_libraries(shared_heap_test ${LLVM_AVAILABLE_LIBS} gtest_main) +target_link_libraries(shared_heap_test gtest_main) gtest_discover_tests(shared_heap_test) diff --git a/tests/unit/shared-utils/CMakeLists.txt b/tests/unit/shared-utils/CMakeLists.txt index 47b6b835ba..c6f250e6df 100644 --- a/tests/unit/shared-utils/CMakeLists.txt +++ b/tests/unit/shared-utils/CMakeLists.txt @@ -7,6 +7,10 @@ project (test-shared-utils) add_definitions (-DRUN_ON_LINUX) +set (WAMR_BUILD_AOT 0) +set (WAMR_BUILD_FAST_INTERP 0) +set (WAMR_BUILD_INTERP 1) +set (WAMR_BUILD_JIT 0) set (WAMR_BUILD_LIBC_WASI 0) set (WAMR_BUILD_APP_FRAMEWORK 0) @@ -19,8 +23,8 @@ file (GLOB_RECURSE source_all ${CMAKE_CURRENT_SOURCE_DIR}/*.cc) set (UNIT_SOURCE ${source_all}) set (unit_test_sources - ${UNIT_SOURCE} - ${WAMR_RUNTIME_LIB_SOURCE} + ${UNIT_SOURCE} + ${WAMR_RUNTIME_LIB_SOURCE} ) add_executable (shared_utils_test ${unit_test_sources}) diff --git a/tests/unit/unit_common.cmake b/tests/unit/unit_common.cmake index 66c50b7e8c..53e9ae50df 100644 --- a/tests/unit/unit_common.cmake +++ b/tests/unit/unit_common.cmake @@ -1,26 +1,14 @@ # Copyright (C) 2019 Intel Corporation. All rights reserved. # SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -# Yes. To solve the compatibility issue with CMAKE (>= 4.0), we need to update -# our `cmake_minimum_required()` to 3.5. However, there are CMakeLists.txt -# from 3rd parties that we should not alter. Therefore, in addition to -# changing the `cmake_minimum_required()`, we should also add a configuration -# here that is compatible with earlier versions. -set(CMAKE_POLICY_VERSION_MINIMUM 3.5 FORCE) - if (NOT DEFINED WAMR_BUILD_PLATFORM) set (WAMR_BUILD_PLATFORM "linux") endif () -set (UNIT_ROOT_DIR ${CMAKE_CURRENT_LIST_DIR}) - -include_directories(${UNIT_ROOT_DIR}) - enable_language (ASM) -# Reset default linker flags -set (CMAKE_SHARED_LIBRARY_LINK_C_FLAGS "") -set (CMAKE_SHARED_LIBRARY_LINK_CXX_FLAGS "") +# Usually, test cases should identify their unique +# complation flags to implement their test plan # Set WAMR_BUILD_TARGET, currently values supported: # "X86_64", "AMD_64", "X86_32", "ARM_32", "MIPS_32", "XTENSA_32" @@ -34,52 +22,6 @@ if (NOT DEFINED WAMR_BUILD_TARGET) endif () endif () -if (NOT CMAKE_BUILD_TYPE) - set (CMAKE_BUILD_TYPE Debug) -endif () - -if (NOT DEFINED WAMR_BUILD_INTERP) - # Enable Interpreter by default - set (WAMR_BUILD_INTERP 1) -endif () - -if (NOT DEFINED WAMR_BUILD_AOT) - # Enable AOT by default. - set (WAMR_BUILD_AOT 1) -endif () - -if (NOT DEFINED WAMR_BUILD_JIT) - # Disable JIT by default. - set (WAMR_BUILD_JIT 0) -endif () - -if (NOT DEFINED WAMR_BUILD_LIBC_BUILTIN) - # Enable libc builtin support by default - set (WAMR_BUILD_LIBC_BUILTIN 1) -endif () - -if (NOT DEFINED WAMR_BUILD_LIBC_WASI) - # Enable libc wasi support by default - set (WAMR_BUILD_LIBC_WASI 1) -endif () - -if (NOT DEFINED WAMR_BUILD_MULTI_MODULE) - set (WAMR_BUILD_MULTI_MODULE 1) -endif() - -if (NOT DEFINED WAMR_BUILD_APP_FRAMEWORK) - set (WAMR_BUILD_APP_FRAMEWORK 1) -endif () - -if (COLLECT_CODE_COVERAGE EQUAL 1) - set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fprofile-arcs -ftest-coverage") - set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fprofile-arcs -ftest-coverage") -endif () - -set (CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,--gc-sections") -set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -std=gnu99 -ffunction-sections -fdata-sections \ - -Wall -Wno-unused-parameter -Wno-pedantic") - set (WAMR_ROOT_DIR ${CMAKE_CURRENT_LIST_DIR}/../..) # include the build config template file @@ -90,23 +32,20 @@ include_directories (${SHARED_DIR}/include include (${SHARED_DIR}/utils/uncommon/shared_uncommon.cmake) -if (NOT (GOOGLETEST_INCLUDED EQUAL 1)) -# Prevent overriding the parent project's compiler/linker -# settings on Windows -set (gtest_force_shared_crt ON CACHE BOOL "" FORCE) - -# Fetch Google test -include (FetchContent) -FetchContent_Declare ( - googletest - URL https://github.com/google/googletest/archive/03597a01ee50ed33e9dfd640b249b4be3799d395.zip -) -FetchContent_MakeAvailable (googletest) - -endif() - # Add helper classes include_directories(${CMAKE_CURRENT_LIST_DIR}/common) -message ("unit_common.cmake included") +# config_common.cmake only sets up the llvm environment when +# JIT is enabled. but in unit tests, we need llvm environment +# for aot compilation. +if (NOT DEFINED LLVM_DIR) + set (LLVM_SRC_ROOT "${WAMR_ROOT_DIR}/core/deps/llvm") + set (LLVM_BUILD_ROOT "${LLVM_SRC_ROOT}/build") + if (NOT EXISTS "${LLVM_BUILD_ROOT}") + message (FATAL_ERROR "Cannot find LLVM dir: ${LLVM_BUILD_ROOT}") + endif () + set (CMAKE_PREFIX_PATH "${LLVM_BUILD_ROOT};${CMAKE_PREFIX_PATH}") + set (LLVM_DIR ${LLVM_BUILD_ROOT}/lib/cmake/llvm) +endif () +message(STATUS "unit_common.cmake included") diff --git a/tests/unit/wasm-c-api/CMakeLists.txt b/tests/unit/wasm-c-api/CMakeLists.txt index 95cbfbd544..3150c93254 100644 --- a/tests/unit/wasm-c-api/CMakeLists.txt +++ b/tests/unit/wasm-c-api/CMakeLists.txt @@ -4,14 +4,8 @@ cmake_minimum_required (VERSION 3.14) project (wasm_c_api_test) -################ runtime settings ################ -set(CMAKE_BUILD_TYPE Debug) set(WAMR_BUILD_PLATFORM "linux") -# Resetdefault linker flags -set(CMAKE_SHARED_LIBRARY_LINK_C_FLAGS "") -set(CMAKE_SHARED_LIBRARY_LINK_CXX_FLAGS "") - # WAMR features switch if (NOT DEFINED WAMR_BUILD_TARGET) set(WAMR_BUILD_TARGET "X86_64") @@ -23,49 +17,8 @@ set(WAMR_BUILD_LIBC_BUILTIN 1) set(WAMR_BUILD_LIBC_WASI 0) set(WAMR_BUILD_FAST_INTERP 0) -# compiling and linking flags -set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,--gc-sections -pie -fPIE") - -# build out vmlib -# hard code path here -set(WAMR_ROOT_DIR ${CMAKE_CURRENT_LIST_DIR}/../../..) -include (${WAMR_ROOT_DIR}/build-scripts/runtime_lib.cmake) - -add_library(vmlib STATIC ${WAMR_RUNTIME_LIB_SOURCE}) -################################################ - -################ unit test related ################ - -# Yes. To solve the compatibility issue with CMAKE (>= 4.0), we need to update -# our `cmake_minimum_required()` to 3.5. However, there are CMakeLists.txt -# from 3rd parties that we should not alter. Therefore, in addition to -# changing the `cmake_minimum_required()`, we should also add a configuration -# here that is compatible with earlier versions. -set(CMAKE_POLICY_VERSION_MINIMUM 3.5 FORCE) - -# Add googletest directly to our build. This defines -# the gtest and gtest_main targets. - -if (NOT (GOOGLETEST_INCLUDED EQUAL 1)) -# Prevent overriding the parent project's compiler/linker -# settings on Windows -set (gtest_force_shared_crt ON CACHE BOOL "" FORCE) - -# Fetch Google test -include (FetchContent) -FetchContent_Declare ( - googletest - URL https://github.com/google/googletest/archive/03597a01ee50ed33e9dfd640b249b4be3799d395.zip -) -FetchContent_MakeAvailable (googletest) -endif() - -enable_testing() - -add_executable(wasm_c_api_test - basic.cc -) - -target_link_libraries(wasm_c_api_test vmlib gtest_main) +include (../unit_common.cmake) +add_executable(wasm_c_api_test basic.cc ${WAMR_RUNTIME_LIB_SOURCE}) +target_link_libraries(wasm_c_api_test gtest_main) gtest_discover_tests(wasm_c_api_test) diff --git a/tests/unit/wasm-vm/CMakeLists.txt b/tests/unit/wasm-vm/CMakeLists.txt index 6242a48b99..431b945450 100644 --- a/tests/unit/wasm-vm/CMakeLists.txt +++ b/tests/unit/wasm-vm/CMakeLists.txt @@ -7,14 +7,21 @@ project (test-wasm-vm) add_definitions (-DRUN_ON_LINUX) +set(WAMR_BUILD_AOT 0) +set(WAMR_BUILD_FAST_INTERP 0) +set(WAMR_BUILD_INTERP 1) +set(WAMR_BUILD_JIT 0) +set(WAMR_BUILD_LIBC_BUILTIN 1) + add_definitions (-Dattr_container_malloc=malloc) add_definitions (-Dattr_container_free=free) -set (WAMR_BUILD_APP_FRAMEWORK 1) -set (CMAKE_BUILD_TYPE Release) - include (../unit_common.cmake) +find_package(LLVM REQUIRED CONFIG) +include_directories(${LLVM_INCLUDE_DIRS}) +add_definitions(${LLVM_DEFINITIONS}) + include_directories (${CMAKE_CURRENT_SOURCE_DIR}) file (GLOB_RECURSE source_all ${CMAKE_CURRENT_SOURCE_DIR}/*.cc) @@ -22,21 +29,10 @@ file (GLOB_RECURSE source_all ${CMAKE_CURRENT_SOURCE_DIR}/*.cc) set (UNIT_SOURCE ${source_all}) set (unit_test_sources - ${UNIT_SOURCE} - ${PLATFORM_SHARED_SOURCE} - ${UTILS_SHARED_SOURCE} - ${MEM_ALLOC_SHARED_SOURCE} - ${LIB_HOST_AGENT_SOURCE} - ${NATIVE_INTERFACE_SOURCE} - ${LIBC_BUILTIN_SOURCE} - ${LIBC_WASI_SOURCE} - ${IWASM_COMMON_SOURCE} - ${IWASM_INTERP_SOURCE} - ${IWASM_AOT_SOURCE} - ${IWASM_COMPL_SOURCE} - ${WASM_APP_LIB_SOURCE_ALL} - ${UNCOMMON_SHARED_SOURCE} - ) + ${UNIT_SOURCE} + ${WAMR_RUNTIME_LIB_SOURCE} + ${UNCOMMON_SHARED_SOURCE} +) # Now simply link against gtest or gtest_main as needed. Eg add_executable(wasm_vm_test ${unit_test_sources}) diff --git a/tests/wamr-test-suites/spec-test-script/collect_coverage.sh b/tests/wamr-test-suites/spec-test-script/collect_coverage.sh index 0091e76496..12bee733a4 100755 --- a/tests/wamr-test-suites/spec-test-script/collect_coverage.sh +++ b/tests/wamr-test-suites/spec-test-script/collect_coverage.sh @@ -28,10 +28,12 @@ echo "Start to collect code coverage of ${SRC_COV_DIR} .." pushd ${SRC_COV_DIR} > /dev/null 2>&1 # collect all code coverage data -lcov -q -o ${SRC_TEMP_COV_FILE} -c -d . --rc lcov_branch_coverage=1 +# for lcov 2.x: ignore-errors mismatch,negative +lcov -q -o ${SRC_TEMP_COV_FILE} -c -d . --rc lcov_branch_coverage=1 --rc geninfo_unexecuted_blocks=1 # extract code coverage data of WAMR source files +# for lcov 2.x: ignore-errors unused lcov -q -r ${SRC_TEMP_COV_FILE} -o ${SRC_TEMP_COV_FILE} \ - -rc lcov_branch_coverage=1 \ + -rc lcov_branch_coverage=1\ "*/usr/*" "*/_deps/*" "*/deps/*" "*/tests/unit/*" \ "*/llvm/include/*" "*/include/llvm/*" "*/samples/*" \ "*/test-tools/*" "*/tests/standalone/*" "*/tests/*" diff --git a/tests/wamr-test-suites/test_wamr.sh b/tests/wamr-test-suites/test_wamr.sh index bf621172ab..b42d1503d3 100755 --- a/tests/wamr-test-suites/test_wamr.sh +++ b/tests/wamr-test-suites/test_wamr.sh @@ -39,8 +39,8 @@ function help() echo "-F set the firmware path used by qemu" echo "-C enable code coverage collect" echo "-j set the platform to test" - echo "-T set the sanitizer(s) used during testing. It can be either a comma-separated list - (e.g., ubsan, asan) or a single option + echo "-T set the sanitizer(s) used during testing. It can be either a comma-separated list + (e.g., ubsan, asan) or a single option (e.g., ubsan, tsan, asan, posan)." echo "-A use the specified wamrc command instead of building it" echo "-N enable extended const expression feature" @@ -329,14 +329,14 @@ function unit_test() echo "Now start unit tests" cd ${WORK_DIR} - rm -fr unittest-build && mkdir unittest-build - cd unittest-build + rm -fr unittest-build echo "Build unit test" touch ${REPORT_DIR}/unit_test_report.txt - cmake ${WORK_DIR}/../../unit -DCOLLECT_CODE_COVERAGE=${COLLECT_CODE_COVERAGE} - make -j - make test | tee -a ${REPORT_DIR}/unit_test_report.txt + cmake -S ${WORK_DIR}/../../unit -B unittest-build \ + -DCOLLECT_CODE_COVERAGE=${COLLECT_CODE_COVERAGE} + cmake --build unittest-build + ctest --test-dir unittest-build --output-on-failure | tee -a ${REPORT_DIR}/unit_test_report.txt echo "Finish unit tests" } @@ -504,7 +504,7 @@ function spec_test() git reset --hard 8d4f6aa2b00a8e7c0174410028625c6a176db8a1 # ignore import table cases git apply --ignore-whitespace ../../spec-test-script/extended_const.patch || exit 1 - + elif [[ ${ENABLE_MEMORY64} == 1 ]]; then echo "checkout spec for memory64 proposal" @@ -1188,7 +1188,15 @@ function trigger() } # if collect code coverage, ignore -s, test all test cases. -if [[ $TEST_CASE_ARR ]];then +if [[ $TEST_CASE_ARR == "unit" ]];then + # unit test cases are designed with specific compilation flags + # and run under specific modes. + # There is no need to loop through all running modes in this script. + unit_test || (echo "TEST FAILED"; exit 1) + collect_coverage unit + echo "JUST SKIP UNIT TEST NOW" +elif [[ $TEST_CASE_ARR == "spec" ]];then + # loop through all running modes trigger || (echo "TEST FAILED"; exit 1) else # test all suite, ignore polybench and libsodium because of long time cost @@ -1201,6 +1209,7 @@ else TEST_CASE_ARR+=("libsodium") fi ' + # loop through all running modes trigger || (echo "TEST FAILED"; exit 1) # Add more suites here fi From f13bc80d268852798f5fc1a20c0e5ed553fbe14e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 5 Nov 2025 07:22:09 +0800 Subject: [PATCH 099/103] build(deps): Bump github/codeql-action from 4.31.0 to 4.31.2 (#4691) Bumps [github/codeql-action](https://github.com/github/codeql-action) from 4.31.0 to 4.31.2. - [Release notes](https://github.com/github/codeql-action/releases) - [Commits](https://github.com/github/codeql-action/compare/v4.31.0...v4.31.2) --- updated-dependencies: - dependency-name: github/codeql-action dependency-version: 4.31.2 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/codeql.yml | 6 +++--- .github/workflows/supply_chain.yml | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml index 94bde8132f..7b3f8db2b0 100644 --- a/.github/workflows/codeql.yml +++ b/.github/workflows/codeql.yml @@ -53,7 +53,7 @@ jobs: # Initializes the CodeQL tools for scanning. - name: Initialize CodeQL - uses: github/codeql-action/init@v4.31.0 + uses: github/codeql-action/init@v4.31.2 with: languages: ${{ matrix.language }} @@ -70,7 +70,7 @@ jobs: - run: | ./.github/scripts/codeql_buildscript.sh - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@v4.31.0 + uses: github/codeql-action/analyze@v4.31.2 with: category: "/language:${{matrix.language}}" upload: false @@ -99,7 +99,7 @@ jobs: output: ${{ steps.step1.outputs.sarif-output }}/cpp.sarif - name: Upload CodeQL results to code scanning - uses: github/codeql-action/upload-sarif@v4.31.0 + uses: github/codeql-action/upload-sarif@v4.31.2 with: sarif_file: ${{ steps.step1.outputs.sarif-output }} category: "/language:${{matrix.language}}" diff --git a/.github/workflows/supply_chain.yml b/.github/workflows/supply_chain.yml index 795938f89a..eea85cdf3e 100644 --- a/.github/workflows/supply_chain.yml +++ b/.github/workflows/supply_chain.yml @@ -60,6 +60,6 @@ jobs: # Upload the results to GitHub's code scanning dashboard. - name: "Upload to code-scanning" - uses: github/codeql-action/upload-sarif@4e0b2cd8144ac9869cf8b34acc9a106efea83a8c + uses: github/codeql-action/upload-sarif@338146ca93283a2901a142d408241096146019b5 with: sarif_file: results.sarif From 4b42cfdbce1b724137eea3f76868f42b36b4d51c Mon Sep 17 00:00:00 2001 From: Joe Polny Date: Tue, 4 Nov 2025 19:10:02 -0500 Subject: [PATCH 100/103] fix: remove stack size check from exec_env_check (#4688) As per [this blogpost](https://bytecodealliance.github.io/wamr.dev/blog/understand-the-wamr-stacks/) WAMR does not require a WASM stack in AoT/JIT mode, but `wasm_runtime_exec_env_check` still always expects the size to be > 0 --- core/iwasm/common/wasm_runtime_common.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/iwasm/common/wasm_runtime_common.c b/core/iwasm/common/wasm_runtime_common.c index 5c832a64e8..e6bde73637 100644 --- a/core/iwasm/common/wasm_runtime_common.c +++ b/core/iwasm/common/wasm_runtime_common.c @@ -582,7 +582,7 @@ wasm_runtime_env_init(void) static bool wasm_runtime_exec_env_check(WASMExecEnv *exec_env) { - return exec_env && exec_env->module_inst && exec_env->wasm_stack_size > 0 + return exec_env && exec_env->module_inst && exec_env->wasm_stack.top_boundary == exec_env->wasm_stack.bottom + exec_env->wasm_stack_size && exec_env->wasm_stack.top <= exec_env->wasm_stack.top_boundary; From 7898af9f21c5f0623c1b555bbd952b158cc9acc4 Mon Sep 17 00:00:00 2001 From: TianlongLiang <111852609+TianlongLiang@users.noreply.github.com> Date: Tue, 11 Nov 2025 16:22:45 +0800 Subject: [PATCH 101/103] fix bug and add unit test case for runtime api when shared heap is enabled (#4695) --- core/iwasm/common/wasm_memory.c | 8 ++-- core/iwasm/common/wasm_memory.h | 2 +- core/iwasm/common/wasm_shared_memory.c | 6 ++- tests/unit/shared-heap/shared_heap_test.cc | 56 ++++++++++++++++++++++ 4 files changed, 66 insertions(+), 6 deletions(-) diff --git a/core/iwasm/common/wasm_memory.c b/core/iwasm/common/wasm_memory.c index 04e3b9976f..10c651bc94 100644 --- a/core/iwasm/common/wasm_memory.c +++ b/core/iwasm/common/wasm_memory.c @@ -616,12 +616,12 @@ wasm_runtime_get_shared_heap(WASMModuleInstanceCommon *module_inst_comm) bool is_app_addr_in_shared_heap(WASMModuleInstanceCommon *module_inst, - bool is_memory64, uint64 app_offset, uint32 bytes) + bool is_memory64, uint64 app_offset, uint64 bytes) { WASMSharedHeap *heap = get_shared_heap(module_inst), *cur; uint64 shared_heap_start, shared_heap_end; - if (!heap) { + if (!heap || bytes > APP_HEAP_SIZE_MAX) { goto fail; } @@ -665,12 +665,12 @@ is_app_addr_in_shared_heap(WASMModuleInstanceCommon *module_inst, static bool is_native_addr_in_shared_heap(WASMModuleInstanceCommon *module_inst, - bool is_memory64, uint8 *addr, uint32 bytes) + bool is_memory64, uint8 *addr, uint64 bytes) { WASMSharedHeap *cur, *heap = get_shared_heap(module_inst); uintptr_t base_addr, addr_int, end_addr; - if (!heap) { + if (!heap || bytes > APP_HEAP_SIZE_MAX) { goto fail; } diff --git a/core/iwasm/common/wasm_memory.h b/core/iwasm/common/wasm_memory.h index 48bd2179fe..b79ed4a6cb 100644 --- a/core/iwasm/common/wasm_memory.h +++ b/core/iwasm/common/wasm_memory.h @@ -84,7 +84,7 @@ SET_LINEAR_MEMORY_SIZE(WASMMemoryInstance *memory, uint64 size) #if WASM_ENABLE_SHARED_HEAP != 0 bool is_app_addr_in_shared_heap(WASMModuleInstanceCommon *module_inst, - bool is_memory64, uint64 app_offset, uint32 bytes); + bool is_memory64, uint64 app_offset, uint64 bytes); WASMSharedHeap * wasm_runtime_create_shared_heap(SharedHeapInitArgs *init_args); diff --git a/core/iwasm/common/wasm_shared_memory.c b/core/iwasm/common/wasm_shared_memory.c index 2027a57200..c1aa18f5c3 100644 --- a/core/iwasm/common/wasm_shared_memory.c +++ b/core/iwasm/common/wasm_shared_memory.c @@ -249,10 +249,14 @@ map_try_release_wait_info(HashMap *wait_hash_map, AtomicWaitInfo *wait_info, #if WASM_ENABLE_SHARED_HEAP != 0 static bool is_native_addr_in_shared_heap(WASMModuleInstanceCommon *module_inst, - uint8 *addr, uint32 bytes) + uint8 *addr, uint64 bytes) { WASMSharedHeap *shared_heap = NULL; + if (bytes > APP_HEAP_SIZE_MAX) { + return false; + } + #if WASM_ENABLE_INTERP != 0 if (module_inst->module_type == Wasm_Module_Bytecode) { shared_heap = ((WASMModuleInstance *)module_inst)->e->shared_heap; diff --git a/tests/unit/shared-heap/shared_heap_test.cc b/tests/unit/shared-heap/shared_heap_test.cc index 47d2eb3e82..434b4c3899 100644 --- a/tests/unit/shared-heap/shared_heap_test.cc +++ b/tests/unit/shared-heap/shared_heap_test.cc @@ -217,6 +217,62 @@ TEST_F(shared_heap_test, test_preallocated_shared_heap_malloc_fail) EXPECT_EQ(0, argv[0]); } +TEST_F(shared_heap_test, test_preallocated_shared_runtime_api) +{ + struct ret_env tmp_module_env; + SharedHeapInitArgs args = { 0 }; + WASMSharedHeap *shared_heap = nullptr; + uint32 argv[1] = { 0 }; + void *native_ptr; + uint64 offset, size; + bool ret; + + args.size = 0x4000; + shared_heap = wasm_runtime_create_shared_heap(&args); + + if (!shared_heap) { + FAIL() << "Failed to create shared heap"; + } + + if (!load_wasm("test.wasm", 0, tmp_module_env)) { + FAIL() << "Failed to load wasm file\n"; + } + + if (!wasm_runtime_attach_shared_heap(tmp_module_env.wasm_module_inst, + shared_heap)) { + ADD_FAILURE() << "Failed to attach shared heap\n"; + goto fail1; + } + + offset = wasm_runtime_shared_heap_malloc(tmp_module_env.wasm_module_inst, + 32, &native_ptr); + if (!offset) { + ADD_FAILURE() << "Failed to attach shared heap\n"; + goto fail2; + } + + size = (uint64_t)UINT32_MAX + 0x2000; + printf("offset %lx size: %lx\n", offset, size); + ASSERT_EQ(false, wasm_runtime_validate_app_addr( + tmp_module_env.wasm_module_inst, offset, size)); + + ASSERT_EQ(NULL, wasm_runtime_addr_app_to_native( + tmp_module_env.wasm_module_inst, offset + size)); + + size = (uint64_t)10; + ASSERT_EQ(true, wasm_runtime_validate_app_addr( + tmp_module_env.wasm_module_inst, offset, size)); + + ASSERT_EQ(native_ptr + size, + wasm_runtime_addr_app_to_native(tmp_module_env.wasm_module_inst, + offset + size)); + +fail2: + wasm_runtime_detach_shared_heap(tmp_module_env.wasm_module_inst); +fail1: + destroy_module_env(tmp_module_env); +} + static void create_test_shared_heap(uint8 *preallocated_buf, size_t size, WASMSharedHeap **shared_heap_res) From 951684c8dd5ee3cf06db5826e82810659de09ecd Mon Sep 17 00:00:00 2001 From: "liang.he" Date: Fri, 14 Nov 2025 17:48:28 +0800 Subject: [PATCH 102/103] Use a customized codeql configration (#4207) - Specifying directories to scan - Refactor build script for WAMR project - add functions for wamrc and iwasm builds - streamline options handling - include LLVM installation steps. - Filter out source code related to dependencies, testing, and wasm applications - Exclude unimportant issues and coding style problems --- .github/codeql/codeql_config.yml | 46 +++ .github/scripts/codeql_buildscript.sh | 411 +++++++------------------- .github/workflows/codeql.yml | 189 ++++++------ 3 files changed, 258 insertions(+), 388 deletions(-) create mode 100644 .github/codeql/codeql_config.yml diff --git a/.github/codeql/codeql_config.yml b/.github/codeql/codeql_config.yml new file mode 100644 index 0000000000..3da712c645 --- /dev/null +++ b/.github/codeql/codeql_config.yml @@ -0,0 +1,46 @@ +# Copyright (C) 2019 Intel Corporation. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +paths: + - .github + - core/iwasm + - core/shared/platform/common/ + - core/shared/platform/include/ + - core/shared/platform/linux/ + - product-mini/platforms/common/ + - product-mini/platforms/linux/ + # TODO: add other platforms back if able to do cross-compilation + # - product-mini/platforms/ + # TODO: add samples back after buildscript modification + # - need to ignore workloads and wasm-apps + # - samples + - wamr-compiler/ +paths-ignore: + # always ignore build + - '**/build/**' + - '**/test*/**' + - '**/wasm-app*/**' + - core/deps/ + # platform specific + - core/iwasm/aot/arch/aot_reloc_aarch64.c + - core/iwasm/aot/arch/aot_reloc_arc.c + - core/iwasm/aot/arch/aot_reloc_arm.c + - core/iwasm/aot/arch/aot_reloc_dummy.c + - core/iwasm/aot/arch/aot_reloc_mips.c + - core/iwasm/aot/arch/aot_reloc_riscv.c + - core/iwasm/aot/arch/aot_reloc_thumb.c + - core/iwasm/aot/arch/aot_reloc_xtensa.c + - core/iwasm/libraries/lib-rats/ + - core/iwasm/libraries/lib-socket/ + - core/iwasm/libraries/lib-wasi-threads/*-test/ + - core/shared/platform/common/freertos/ + - core/shared/platform/common/math/ + #TODO: add me back if lldb libraries installed + - core/iwasm/compilation/debug/ + # spend disk space and slow + - core/iwasm/libraries/wasi-nn/src/wasi_nn_tflite* + #TODO: add me back if openvino installed + - core/iwasm/libraries/wasi-nn/src/wasi_nn_openvino* + # for wasm + - core/iwasm/libraries/wasi-nn/include/wasi_nn.h + # reference + - core/iwasm/common/arch/invokeNative_general.c diff --git a/.github/scripts/codeql_buildscript.sh b/.github/scripts/codeql_buildscript.sh index 388f3680d3..706ff5b787 100755 --- a/.github/scripts/codeql_buildscript.sh +++ b/.github/scripts/codeql_buildscript.sh @@ -5,308 +5,117 @@ # SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception # -sudo apt update +# This script is used to build the WAMR project for CodeQL analysis. -sudo apt install -y build-essential cmake g++-multilib libgcc-12-dev lib32gcc-12-dev ccache ninja-build +# Pre-requisites +sudo apt -qq update +sudo apt install -y -qq build-essential cmake g++-multilib libgcc-12-dev lib32gcc-12-dev ccache ninja-build -WAMR_DIR=${PWD} - -# TODO: use pre-built llvm binary to build wamrc to -# avoid static code analysing for llvm -: ' -# build wamrc -cd ${WAMR_DIR}/wamr-compiler -./build_llvm.sh -rm -fr build && mkdir build && cd build -cmake .. -make -j -if [[ $? != 0 ]]; then - echo "Failed to build wamrc!" - exit 1; -fi -' - -# build iwasm with default features enabled -cd ${WAMR_DIR}/product-mini/platforms/linux -rm -fr build && mkdir build && cd build -cmake .. -make -j -if [[ $? != 0 ]]; then - echo "Failed to build iwasm with default features enabled!" - exit 1; -fi - -# build iwasm with default features enabled on x86_32 -cd ${WAMR_DIR}/product-mini/platforms/linux -rm -fr build && mkdir build && cd build -cmake .. -DWAMR_BUILD_TARGET=X86_32 -make -j -if [[ $? != 0 ]]; then - echo "Failed to build iwasm with default features enabled on x86_32!" - exit 1; -fi - -# build iwasm with classic interpreter enabled -cd ${WAMR_DIR}/product-mini/platforms/linux -rm -rf build && mkdir build && cd build -cmake .. -DCMAKE_BUILD_TYPE=Debug -DWAMR_BUILD_FAST_INTERP=0 -make -j -if [[ $? != 0 ]]; then - echo "Failed to build iwasm with classic interpreter enabled!" - exit 1; -fi - -# build iwasm with extra features enabled -cd ${WAMR_DIR}/product-mini/platforms/linux -rm -fr build && mkdir build && cd build -cmake .. -DCMAKE_BUILD_TYPE=Debug \ - -DWAMR_BUILD_LIB_PTHREAD=1 -DWAMR_BUILD_LIB_PTHREAD_SEMAPHORE=1 \ - -DWAMR_BUILD_MULTI_MODULE=1 -DWAMR_BUILD_SIMD=1 \ - -DWAMR_BUILD_TAIL_CALL=1 -DWAMR_BUILD_REF_TYPES=1 \ - -DWAMR_BUILD_CUSTOM_NAME_SECTION=1 -DWAMR_BUILD_MEMORY_PROFILING=1 \ - -DWAMR_BUILD_PERF_PROFILING=1 -DWAMR_BUILD_DUMP_CALL_STACK=1 \ - -DWAMR_BUILD_LOAD_CUSTOM_SECTION=1 -make -j -if [[ $? != 0 ]]; then - echo "Failed to build wamrc iwasm with extra features enabled!" - exit 1; -fi - -# build iwasm with global heap pool enabled -cd ${WAMR_DIR}/product-mini/platforms/linux -rm -fr build && mkdir build && cd build -cmake .. -DCMAKE_BUILD_TYPE=Debug \ - -DWAMR_BUILD_ALLOC_WITH_USER_DATA=1 \ - -DWAMR_DISABLE_STACK_HW_BOUND_CHECK=1 \ - -DWAMR_BUILD_GLOBAL_HEAP_POOL=1 \ - -DWAMR_BUILD_GLOBAL_HEAP_SIZE=131072 -make -j -if [[ $? != 0 ]]; then - echo "Failed to build iwasm with global heap pool enabled!" - exit 1; -fi - -# build iwasm with wasi-threads enabled -cd ${WAMR_DIR}/product-mini/platforms/linux -rm -fr build && mkdir build && cd build -cmake .. -DCMAKE_BUILD_TYPE=Debug -DWAMR_BUILD_LIB_WASI_THREADS=1 -make -j -if [[ $? != 0 ]]; then - echo "Failed to build iwasm with wasi-threads enabled!" - exit 1; -fi - -# build iwasm with GC enabled -cd ${WAMR_DIR}/product-mini/platforms/linux -rm -rf build && mkdir build && cd build -cmake .. -DCMAKE_BUILD_TYPE=Debug -DWAMR_BUILD_GC=1 -make -j -if [[ $? != 0 ]]; then - echo "Failed to build iwasm with GC enabled!" - exit 1; -fi - -# build iwasm with exception handling enabled -cd ${WAMR_DIR}/product-mini/platforms/linux -rm -rf build && mkdir build && cd build -cmake .. -DCMAKE_BUILD_TYPE=Debug -DWAMR_BUILD_EXCE_HANDLING=1 -make -j -if [[ $? != 0 ]]; then - echo "Failed to build iwasm with exception handling enabled!" - exit 1; -fi - -# build iwasm with memory64 enabled -cd ${WAMR_DIR}/product-mini/platforms/linux -rm -rf build && mkdir build && cd build -cmake .. -DCMAKE_BUILD_TYPE=Debug -DWAMR_BUILD_MEMORY64=1 -make -j -if [[ $? != 0 ]]; then - echo "Failed to build iwasm with memory64 enabled!" - exit 1; -fi - -# build iwasm with multi-memory enabled -cd ${WAMR_DIR}/product-mini/platforms/linux -rm -rf build && mkdir build && cd build -cmake .. -DCMAKE_BUILD_TYPE=Debug -DWAMR_BUILD_MULTI_MEMORY=1 -make -j -if [[ $? != 0 ]]; then - echo "Failed to build iwasm with multi-memory enabled!" - exit 1; -fi - -# build iwasm with hardware boundary check disabled -cd ${WAMR_DIR}/product-mini/platforms/linux -rm -rf build && mkdir build && cd build -cmake .. -DCMAKE_BUILD_TYPE=Debug -DWAMR_DISABLE_HW_BOUND_CHECK=1 -make -j -if [[ $? != 0 ]]; then - echo "Failed to build iwasm with hardware boundary check disabled!" - exit 1; -fi - -# build iwasm with quick AOT entry disabled -cd ${WAMR_DIR}/product-mini/platforms/linux -rm -rf build && mkdir build && cd build -cmake .. -DCMAKE_BUILD_TYPE=Debug -DWAMR_BUILD_QUICK_AOT_ENTRY=0 -make -j -if [[ $? != 0 ]]; then - echo "Failed to build iwasm with quick AOT entry disabled!" - exit 1; -fi +LLVM_VER=18.1.8 +pushd /opt +sudo wget --progress=dot:giga -O clang+llvm-x86_64-linux-gnu.tar.xz https://github.com/llvm/llvm-project/releases/download/llvmorg-${LLVM_VER}/clang+llvm-${LLVM_VER}-x86_64-linux-gnu-ubuntu-18.04.tar.xz \ + && tar -xf clang+llvm-x86_64-linux-gnu.tar.xz \ + && mv clang+llvm-${LLVM_VER}-x86_64-linux-gnu-ubuntu-18.04 llvm-${LLVM_VER} +popd -# build iwasm with wakeup of blocking operations disabled -cd ${WAMR_DIR}/product-mini/platforms/linux -rm -rf build && mkdir build && cd build -cmake .. -DCMAKE_BUILD_TYPE=Debug -DWAMR_DISABLE_WAKEUP_BLOCKING_OP=1 -make -j -if [[ $? != 0 ]]; then - echo "Failed to build iwasm with wakeup of blocking operations disabled!" - exit 1; -fi +# libtinfo.so.5 for /opt/llvm-18.1.8/lib/libomptarget.rtl.amdgpu.so.18.1 +sudo apt -qq update +wget http://security.ubuntu.com/ubuntu/pool/universe/n/ncurses/libtinfo5_6.3-2ubuntu0.1_amd64.deb +sudo apt install -y -qq ./libtinfo5_6.3-2ubuntu0.1_amd64.deb -# build iwasm with module instance context disabled -cd ${WAMR_DIR}/product-mini/platforms/linux -rm -rf build && mkdir build && cd build -cmake .. -DCMAKE_BUILD_TYPE=Debug -DWAMR_BUILD_MODULE_INST_CONTEXT=0 \ - -DWAMR_BUILD_LIBC_BUILTIN=0 -DWAMR_BUILD_LIBC_WASI=0 -make -j -if [[ $? != 0 ]]; then - echo "Failed to build iwasm with module instance context disabled!" - exit 1; -fi - -# build iwasm with libc-uvwasi enabled -cd ${WAMR_DIR}/product-mini/platforms/linux -rm -fr build && mkdir build && cd build -cmake .. -DCMAKE_BUILD_TYPE=Debug -DWAMR_BUILD_LIBC_UVWASI=1 -make -j -if [[ $? != 0 ]]; then - echo "Failed to build iwasm with libc-uvwasi enabled!" - exit 1; -fi - -# build iwasm with fast jit lazy mode enabled -cd ${WAMR_DIR}/product-mini/platforms/linux -rm -rf build && mkdir build && cd build -cmake .. -DCMAKE_BUILD_TYPE=Debug -DWAMR_BUILD_FAST_JIT=1 -DWAMR_BUILD_FAST_JIT_DUMP=1 -make -j -if [[ $? != 0 ]]; then - echo "Failed to build iwasm with fast jit lazy mode enabled!" - exit 1; -fi - -# build iwasm with fast jit eager mode enabled -cd ${WAMR_DIR}/product-mini/platforms/linux -rm -rf build && mkdir build && cd build -cmake .. -DCMAKE_BUILD_TYPE=Debug -DWAMR_BUILD_FAST_JIT=1 -DWAMR_BUILD_FAST_JIT_DUMP=1 -make -j -if [[ $? != 0 ]]; then - echo "Failed to build iwasm with fast jit eager mode enabled!" - exit 1; -fi - -# TODO: use pre-built llvm binary to build llvm-jit and multi-tier-jit -: ' -# build iwasm with llvm jit lazy mode enabled -cd ${WAMR_DIR}/product-mini/platforms/linux -rm -rf build && mkdir build && cd build -cmake .. -DCMAKE_BUILD_TYPE=Debug -DWAMR_BUILD_JIT=1 -make -j -if [[ $? != 0 ]]; then - echo "Failed to build llvm jit lazy mode enabled!" - exit 1; -fi - -# build iwasm with llvm jit eager mode enabled -cd ${WAMR_DIR}/product-mini/platforms/linux -rm -rf build && mkdir build && cd build -cmake .. -DCMAKE_BUILD_TYPE=Debug -DWAMR_BUILD_JIT=1 -DWAMR_BUILD_LAZY_JIT=0 -make -j -if [[ $? != 0 ]]; then - echo "Failed to build llvm jit eager mode enabled!" - exit 1; -fi - -# build iwasm with multi-tier jit enabled -cd ${WAMR_DIR}/product-mini/platforms/linux -rm -rf build && mkdir build && cd build -cmake .. -DCMAKE_BUILD_TYPE=Debug -DWAMR_BUILD_FAST_JIT=1 -DWAMR_BUILD_JIT=1 \ - -DWAMR_BUILD_FAST_JIT_DUMP=1 -make -j -if [[ $? != 0 ]]; then - echo "Failed to build iwasm with multi-tier jit enabled!" - exit 1; -fi -' - -# build iwasm with wasm mini-loader enabled -cd ${WAMR_DIR}/product-mini/platforms/linux -rm -rf build && mkdir build && cd build -cmake .. -DCMAKE_BUILD_TYPE=Debug -DWAMR_BUILD_MINI_LOADER=1 -make -j -if [[ $? != 0 ]]; then - echo "Failed to build with wasm mini-loader enabled!" - exit 1; -fi - -# build iwasm with source debugging enabled -cd ${WAMR_DIR}/product-mini/platforms/linux -rm -rf build && mkdir build && cd build -cmake .. -DCMAKE_BUILD_TYPE=Debug -DWAMR_BUILD_DEBUG_INTERP=1 -DWAMR_BUILD_DEBUG_AOT=1 -make -j -if [[ $? != 0 ]]; then - echo "Failed to build iwasm with source debugging enabled!" - exit 1; -fi - -# build iwasm with AOT static PGO enabled -cd ${WAMR_DIR}/product-mini/platforms/linux -rm -rf build && mkdir build && cd build -cmake .. -DCMAKE_BUILD_TYPE=Debug -DWAMR_BUILD_STATIC_PGO=1 -make -j -if [[ $? != 0 ]]; then - echo "Failed to build iwasm with AOT static PGO enabled!" - exit 1; -fi - -# build iwasm with configurable bounds checks enabled -cd ${WAMR_DIR}/product-mini/platforms/linux -rm -rf build && mkdir build && cd build -cmake .. -DCMAKE_BUILD_TYPE=Debug -DWAMR_CONFIGURABLE_BOUNDS_CHECKS=1 -make -j -if [[ $? != 0 ]]; then - echo "Failed to build iwasm with configurable bounds checks enabled!" - exit 1; -fi - -# build iwasm with linux perf support enabled -cd ${WAMR_DIR}/product-mini/platforms/linux/ -rm -rf build && mkdir build && cd build -cmake .. -DCMAKE_BUILD_TYPE=Debug -DWAMR_BUILD_LINUX_PERF=1 -make -j -if [[ $? != 0 ]]; then - echo "Failed to build iwasm with linux perf support enabled!" - exit 1; -fi - -# build iwasm with shared heap enabled -cd ${WAMR_DIR}/product-mini/platforms/linux -rm -rf build && mkdir build && cd build -cmake .. -DCMAKE_BUILD_TYPE=Debug -DWAMR_BUILD_SHARED_HEAP=1 -make -j -if [[ $? != 0 ]]; then - echo "Failed to build iwasm with shared heap enabled!" - exit 1; -fi - -# build iwasm with dynamic aot debug enabled -cd ${WAMR_DIR}/product-mini/platforms/linux -rm -rf build && mkdir build && cd build -cmake .. -DCMAKE_BUILD_TYPE=Debug -DWAMR_BUILD_DYNAMIC_AOT_DEBUG=1 -make -j -if [[ $? != 0 ]]; then - echo "Failed to build iwasm dynamic aot debug enabled!" - exit 1; -fi +# Start the build process +WAMR_DIR=${PWD} +LLVM_DIR=/opt/llvm-${LLVM_VER}/lib/cmake/llvm + +# Function to build wamrc +build_wamrc() { + local options="$1" + echo "Building wamrc with options: $options" + + pushd ${WAMR_DIR}/wamr-compiler + rm -rf build + cmake -S . -B build \ + -G Ninja \ + -DCMAKE_BUILD_TYPE=Debug \ + -DWAMR_BUILD_WITH_CUSTOM_LLVM=1 -DLLVM_DIR=${LLVM_DIR} \ + $options + cmake --build build --target wamrc --parallel + if [[ $? != 0 ]]; then + echo "Failed to build wamrc with options: $options" + exit 1 + fi + popd +} + +# Function to build iwasm +build_iwasm() { + local options="$1" + echo "Building iwasm with options: $options" + + pushd ${WAMR_DIR}/product-mini/platforms/linux + rm -rf build + cmake -S . -B build \ + -G Ninja \ + -DCMAKE_BUILD_TYPE=Debug \ + -DLLVM_DIR=${LLVM_DIR} \ + $options + cmake --build build --target iwasm --parallel + if [[ $? != 0 ]]; then + echo "Failed to build iwasm with options: $options" + exit 1 + fi + popd +} + +# List of compilation options for wamrc +wamrc_options_list=( + #default + "" +) + +# List of compilation options for iwasm +iwasm_options_list=( + #default + "" + # +classic interp + "-DWAMR_BUILD_FAST_INTERP=0" + # +llvm jit + fast jit + "-DWAMR_BUILD_JIT=1 -DWAMR_BUILD_FAST_JIT=1 -DWAMR_BUILD_FAST_JIT_DUMP=1" + # + "-DWAMR_BUILD_TARGET=X86_32" + # + # libraries + "-DWAMR_BUILD_LIBC_BUILTIN=0 -DWAMR_BUILD_LIBC_UVWASI=1 -DWAMR_BUILD_LIBC_EMCC=1" + "-DWAMR_BUILD_THREAD_MGR=1 -DWAMR_BUILD_LIB_PTHREAD=1 -DWAMR_BUILD_SHARED_MEMORY=1 -DWAMR_BUILD_LIB_PTHREAD_SEMAPHORE=1" + "-DWAMR_BUILD_THREAD_MGR=1 -DWAMR_BUILD_LIB_WASI_THREADS=1 -DWAMR_BUILD_SHARED_MEMORY=1 -DWAMR_BUILD_LIB_PTHREAD_SEMAPHORE=1" + "-DWAMR_BUILD_WASI_NN=1 -DWAMR_BUILD_WASI_NN_LLAMACPP=1" + # + # Wasm specs + "-DWAMR_BUILD_GC=1 -DWAMR_BUILD_EXCE_HANDLING=1 -DWAMR_BUILD_STRINGREF=1 -DWAMR_STRINGREF_IMPL_SOURCE=STUB" + "-DWAMR_BUILD_MEMORY64=1 -DWAMR_BUILD_MULTI_MEMORY=1" + # + # WARM features + "-DWAMR_BUILD_MULTI_MODULE=1 -DWAMR_BUILD_MINI_LOADER=1 -DWAMR_BUILD_SHARED_HEAP=1" + "-DWAMR_DISABLE_HW_BOUND_CHECK=1" + "-DWAMR_CONFIGURABLE_BOUNDS_CHECKS=1" + # - Debug + "-DWAMR_BUILD_DEBUG_INTERP=1 -DWAMR_BUILD_DEBUG_AOT=1 -DWAMR_BUILD_DYNAMIC_AOT_DEBUG=1" + # - developer options + "-DWAMR_BUILD_CUSTOM_NAME_SECTION=1 -DWAMR_BUILD_LOAD_CUSTOM_SECTION=1 -DWAMR_BUILD_DUMP_CALL_STACK=1 -DWAMR_BUILD_LINUX_PERF=1 -DWAMR_BUILD_AOT_VALIDATOR=1 -DWAMR_BUILD_MEMORY_PROFILING=1 -DWAMR_BUILD_PERF_PROFILING=1" + # - global heap + "-DWAMR_BUILD_ALLOC_WITH_USER_DATA=1 -DWAMR_BUILD_GLOBAL_HEAP_POOL=1 -DWAMR_BUILD_GLOBAL_HEAP_SIZE=131072" + "-DWAMR_BUILD_QUICK_AOT_ENTRY=0 -DWAMR_DISABLE_WAKEUP_BLOCKING_OP=1 -DWAMR_BUILD_MODULE_INST_CONTEXT=0" + # - pgo + "-DWAMR_BUILD_STATIC_PGO=1" + # TODO: SGX specifics. +) + +# Loop through all iwasm options and build +for options in "${iwasm_options_list[@]}"; do + build_iwasm "$options" +done + +# Loop through all wamrc options and build +for options in "${wamrc_options_list[@]}"; do + build_wamrc "$options" +done diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml index 7b3f8db2b0..292123aa31 100644 --- a/.github/workflows/codeql.yml +++ b/.github/workflows/codeql.yml @@ -1,29 +1,24 @@ -# For most projects, this workflow file will not need changing; you simply need -# to commit it to your repository. -# -# You may wish to alter this file to override the set of languages analyzed, -# or to provide custom queries or build logic. -# +# Copyright (C) 2019 Intel Corporation. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception + name: "CodeQL" on: - #pull_request: - # types: - # - opened - # branches: '*' - #push: - # branches: [ "main" ] - # midnight UTC + # run on every push to the feature-development branch + # the main branch is covered by below cron plan + push: + branches: + - dev/** + # midnight UTC on the latest commit on the main branch schedule: - - cron: '0 0 * * *' + - cron: "0 0 * * *" # allow to be triggered manually workflow_dispatch: -permissions: - contents: read - jobs: analyze: + # only run this job if the repository is not a fork + # if want to run this job on a fork, please remove the if condition if: github.repository == 'bytecodealliance/wasm-micro-runtime' name: Analyze # Runner size impacts CodeQL analysis time. To learn more, please see: @@ -31,14 +26,15 @@ jobs: # - https://gh.io/supported-runners-and-hardware-resources # - https://gh.io/using-larger-runners # Consider using larger runners for possible analysis time improvements. - runs-on: ${{ (matrix.language == 'swift' && 'macos-13') || 'ubuntu-22.04' }} - timeout-minutes: ${{ (matrix.language == 'swift' && 120) || 360 }} + # But it is not free, so please be aware of the cost. + runs-on: ubuntu-22.04 + timeout-minutes: 360 strategy: fail-fast: false matrix: - language: [ 'cpp' ] - # CodeQL supports [ 'cpp', 'csharp', 'go', 'java', 'javascript', 'python', 'ruby', 'swift' ] + #TODO: add actions + language: ["cpp"] permissions: contents: read @@ -46,76 +42,95 @@ jobs: security-events: write steps: - - name: Checkout repository - uses: actions/checkout@v5 - with: - submodules: recursive - - # Initializes the CodeQL tools for scanning. - - name: Initialize CodeQL - uses: github/codeql-action/init@v4.31.2 - with: - languages: ${{ matrix.language }} - - # For more details on CodeQL's query packs, refer to: https://docs.github.com/en/code-security/code-scanning/automatically-scanning-your-code-for-vulnerabilities-and-errors/configuring-code-scanning#using-queries-in-ql-packs - # queries: security-extended,security-and-quality - queries: security-and-quality + - name: Checkout repository + uses: actions/checkout@v3 + with: + submodules: recursive - # Command-line programs to run using the OS shell. - # See https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idstepsrun + # Initializes the CodeQL tools for scanning. + - name: Initialize CodeQL + uses: github/codeql-action/init@v4.31.2 + with: + languages: ${{ matrix.language }} + # For more details on CodeQL's query packs, refer to: https://docs.github.com/en/code-security/code-scanning/automatically-scanning-your-code-for-vulnerabilities-and-errors/configuring-code-scanning#using-queries-in-ql-packs + # queries: security-extended,security-and-quality + queries: security-and-quality + config-file: ./.github/codeql/codeql_config.yml - # If the Autobuild fails above, remove it and uncomment the following three lines. - # modify them (or add more) to build your code if your project, please refer to the EXAMPLE below for guidance. + - run: | + ./.github/scripts/codeql_buildscript.sh - - run: | - ./.github/scripts/codeql_buildscript.sh - - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@v4.31.2 - with: - category: "/language:${{matrix.language}}" - upload: false - id: step1 + - name: Perform CodeQL Analysis + uses: github/codeql-action/analyze@v3.29.1 + with: + category: "/language:${{matrix.language}}" + upload: false + id: step1 - # Filter out rules with low severity or high false positve rate - # Also filter out warnings in third-party code - - name: Filter out unwanted errors and warnings - uses: advanced-security/filter-sarif@v1 - with: - patterns: | - -**:cpp/path-injection - -**:cpp/world-writable-file-creation - -**:cpp/poorly-documented-function - -**:cpp/potentially-dangerous-function - -**:cpp/use-of-goto - -**:cpp/integer-multiplication-cast-to-long - -**:cpp/comparison-with-wider-type - -**:cpp/leap-year/* - -**:cpp/ambiguously-signed-bit-field - -**:cpp/suspicious-pointer-scaling - -**:cpp/suspicious-pointer-scaling-void - -**:cpp/unsigned-comparison-zero - -**/cmake*/Modules/** - input: ${{ steps.step1.outputs.sarif-output }}/cpp.sarif - output: ${{ steps.step1.outputs.sarif-output }}/cpp.sarif + # - cpp/alloca-in-loop is about touch_pages() which is intended to + # - cpp/command-line-injection is about bh_system() which is used to + # - cpp/path-injection is used in bh_read_file_to_buffer() to load a .wasm. + # or operate a stack usage file which is not sensitive or generate a .aot + # - cpp/suspicious-pointer-scaling + # - wasm_runtime_invoke_native() used to trivial registers + # - cpp/uncontrolled-process-operation is about dlopen() which is used by + # native libraries registrations. + # - cpp/world-writable-file-creation is about fopen() a temporary file + # for perf-PID.map or .aot(wamrc). The permission isn't sensitive. + # file. + # + # execute customized compiler + - name: Filter out unwanted errors and warnings + uses: advanced-security/filter-sarif@v1 + with: + patterns: | + ## Exclude files and directories + -**/build/** + -**/core/deps/** + -**/cmake*/Modules/** + -**/test*/** + -**/wasm-app*/** + ## Exclude rules 1. Related to formatting, style + -**:cpp/commented-out-code + -**:cpp/complex-condition + -**:cpp/empty-if + -**:cpp/fixme-comment + -**:cpp/include-non-header + -**:cpp/long-switch + -**:cpp/poorly-documented-function + -**:cpp/trivial-switch + -**:cpp/unused-local-variable + -**:cpp/unused-static-function + -**:cpp/unused-static-variable + -**:cpp/use-of-goto + ## Exclude rules 2. Related to special usage of APIs + -**:cpp/alloca-in-loop + -**:cpp/command-line-injection + -**:cpp/path-injection + -core/iwasm/common/wasm_runtime_common.c:cpp/suspicious-pointer-scaling + -**:cpp/uncontrolled-process-operation + -**:cpp/world-writable-file-creation + input: ${{ steps.step1.outputs.sarif-output }}/cpp.sarif + output: ${{ steps.step1.outputs.sarif-output }}/cpp.sarif - - name: Upload CodeQL results to code scanning - uses: github/codeql-action/upload-sarif@v4.31.2 - with: - sarif_file: ${{ steps.step1.outputs.sarif-output }} - category: "/language:${{matrix.language}}" + - name: Upload CodeQL results to code scanning + uses: github/codeql-action/upload-sarif@v4.31.2 + with: + sarif_file: ${{ steps.step1.outputs.sarif-output }} + category: "/language:${{matrix.language}}" - - name: Upload CodeQL results as an artifact - if: success() || failure() - uses: actions/upload-artifact@v5 - with: - name: codeql-results - path: ${{ steps.step1.outputs.sarif-output }} - retention-days: 10 + - name: Upload CodeQL results as an artifact + if: success() || failure() + uses: actions/upload-artifact@v4.6.2 + with: + name: codeql-results + path: ${{ steps.step1.outputs.sarif-output }} + retention-days: 10 - - name: Fail if an error is found - run: | - ./.github/scripts/codeql_fail_on_error.py \ - ${{ steps.step1.outputs.sarif-output }}/cpp.sarif - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - GITHUB_REPOSITORY: ${{ github.repository }} + - name: Fail if an error is found + run: | + ./.github/scripts/codeql_fail_on_error.py \ + ${{ steps.step1.outputs.sarif-output }}/cpp.sarif + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + GITHUB_REPOSITORY: ${{ github.repository }} From 9033f42d74b5c25d48c6a1a3d7c4bc2a3e762e71 Mon Sep 17 00:00:00 2001 From: StepSecurity Bot Date: Mon, 17 Nov 2025 03:04:16 +0000 Subject: [PATCH 103/103] [StepSecurity] Apply security best practices Signed-off-by: StepSecurity Bot --- .github/dependabot.yml | 55 ++++++++++++++++ .github/workflows/build_docker_images.yml | 15 +++-- .github/workflows/build_iwasm_release.yml | 13 ++-- .github/workflows/build_llvm_libraries.yml | 15 +++-- .github/workflows/build_wamr_lldb.yml | 15 +++-- .github/workflows/build_wamr_sdk.yml | 11 +++- .github/workflows/build_wamr_vscode_ext.yml | 13 ++-- .../workflows/build_wamr_wasi_extensions.yml | 9 ++- .github/workflows/build_wamrc.yml | 13 ++-- .github/workflows/check_version_h.yml | 7 +- .github/workflows/codeql.yml | 20 ++++-- .github/workflows/coding_guidelines.yml | 7 +- .../compilation_on_android_ubuntu.yml | 65 ++++++++++++++----- .github/workflows/compilation_on_macos.yml | 36 +++++++--- .github/workflows/compilation_on_nuttx.yml | 13 ++-- .github/workflows/compilation_on_sgx.yml | 25 +++++-- .github/workflows/compilation_on_windows.yml | 23 +++++-- .github/workflows/compilation_on_zephyr.yml | 9 ++- .github/workflows/create_tag.yml | 7 +- .github/workflows/dependency-review.yml | 27 ++++++++ .github/workflows/hadolint_dockerfiles.yml | 7 +- .github/workflows/nightly_run.yml | 50 +++++++++++--- .github/workflows/release_process.yml | 9 ++- .../reuse_latest_release_binaries.yml | 11 +++- .github/workflows/spec_test_on_nuttx.yml | 15 +++-- .github/workflows/supply_chain.yml | 5 ++ .github/workflows/wamr_wasi_extensions.yml | 9 ++- .pre-commit-config.yaml | 30 +++++++++ .../platforms/zephyr/simple/Dockerfile | 2 +- .../WASM-Debug-Server/Docker/Dockerfile | 4 +- .../wamr-ide/WASM-Toolchain/Docker/Dockerfile | 4 +- .../fuzz/wasm-mutator-fuzz/portal/Dockerfile | 4 +- .../fuzz/wasm-mutator-fuzz/server/Dockerfile | 2 +- 33 files changed, 440 insertions(+), 110 deletions(-) create mode 100644 .github/workflows/dependency-review.yml create mode 100644 .pre-commit-config.yaml diff --git a/.github/dependabot.yml b/.github/dependabot.yml index 0676cf7417..b8b6309c6b 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -33,3 +33,58 @@ updates: directory: "/language-bindings/python/wamr-api" schedule: interval: "weekly" + +- package-ecosystem: pip + directory: /core/iwasm/libraries/wasi-nn/test + schedule: + interval: daily + +- package-ecosystem: gomod + directory: /language-bindings/go + schedule: + interval: daily + +- package-ecosystem: docker + directory: /product-mini/platforms/zephyr/simple + schedule: + interval: daily + +- package-ecosystem: nuget + directory: /samples/sgx-ra/non-sgx-verify/csharp + schedule: + interval: daily + +- package-ecosystem: npm + directory: /test-tools/wamr-ide/VSCode-Extension + schedule: + interval: daily + +- package-ecosystem: docker + directory: /test-tools/wamr-ide/WASM-Debug-Server/Docker + schedule: + interval: daily + +- package-ecosystem: docker + directory: /test-tools/wamr-ide/WASM-Toolchain/Docker + schedule: + interval: daily + +- package-ecosystem: docker + directory: /tests/fuzz/wasm-mutator-fuzz/portal + schedule: + interval: daily + +- package-ecosystem: npm + directory: /tests/fuzz/wasm-mutator-fuzz/portal + schedule: + interval: daily + +- package-ecosystem: docker + directory: /tests/fuzz/wasm-mutator-fuzz/server + schedule: + interval: daily + +- package-ecosystem: pip + directory: /tests/fuzz/wasm-mutator-fuzz/server + schedule: + interval: daily diff --git a/.github/workflows/build_docker_images.yml b/.github/workflows/build_docker_images.yml index fed9d4b3eb..8ed2b31cf8 100644 --- a/.github/workflows/build_docker_images.yml +++ b/.github/workflows/build_docker_images.yml @@ -25,8 +25,13 @@ jobs: contents: write # for uploading release artifacts steps: + - name: Harden the runner (Audit all outbound calls) + uses: step-security/harden-runner@95d9a5deda9de15063e7595e9719c11c38c90ae2 # v2.13.2 + with: + egress-policy: audit + - name: Checkout repository - uses: actions/checkout@v5 + uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 - name: Build and save Docker image(wasm-debug-server:${{ inputs.ver_num }}) to tar file run: | @@ -41,7 +46,7 @@ jobs: working-directory: test-tools/wamr-ide/WASM-Debug-Server/Docker - name: upload release tar.gz - uses: actions/upload-release-asset@v1 + uses: actions/upload-release-asset@e8f9f06c4b078e705bd2ea027f0926603fc9b4d5 # v1.0.2 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} with: @@ -51,7 +56,7 @@ jobs: asset_content_type: application/x-gzip - name: upload release zip - uses: actions/upload-release-asset@v1 + uses: actions/upload-release-asset@e8f9f06c4b078e705bd2ea027f0926603fc9b4d5 # v1.0.2 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} with: @@ -73,7 +78,7 @@ jobs: working-directory: test-tools/wamr-ide/WASM-Toolchain/Docker - name: upload release tar.gz - uses: actions/upload-release-asset@v1 + uses: actions/upload-release-asset@e8f9f06c4b078e705bd2ea027f0926603fc9b4d5 # v1.0.2 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} with: @@ -83,7 +88,7 @@ jobs: asset_content_type: application/x-gzip - name: upload release zip - uses: actions/upload-release-asset@v1 + uses: actions/upload-release-asset@e8f9f06c4b078e705bd2ea027f0926603fc9b4d5 # v1.0.2 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} with: diff --git a/.github/workflows/build_iwasm_release.yml b/.github/workflows/build_iwasm_release.yml index 0ecd48bf1c..707470d375 100644 --- a/.github/workflows/build_iwasm_release.yml +++ b/.github/workflows/build_iwasm_release.yml @@ -104,11 +104,16 @@ jobs: contents: write # for uploading release artifacts steps: - - uses: actions/checkout@v5 + - name: Harden the runner (Audit all outbound calls) + uses: step-security/harden-runner@95d9a5deda9de15063e7595e9719c11c38c90ae2 # v2.13.2 + with: + egress-policy: audit + + - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 - name: get cached LLVM libraries id: retrieve_llvm_libs - uses: actions/cache@v4 + uses: actions/cache@0057852bfaa89a56745cba8c7296529d2fc39830 # v4.3.0 with: path: | ./core/deps/llvm/build/bin @@ -167,7 +172,7 @@ jobs: working-directory: ${{ inputs.cwd }}/build - name: upload release tar.gz - uses: actions/upload-release-asset@v1 + uses: actions/upload-release-asset@e8f9f06c4b078e705bd2ea027f0926603fc9b4d5 # v1.0.2 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} with: @@ -177,7 +182,7 @@ jobs: asset_content_type: application/x-gzip - name: upload release zip - uses: actions/upload-release-asset@v1 + uses: actions/upload-release-asset@e8f9f06c4b078e705bd2ea027f0926603fc9b4d5 # v1.0.2 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} with: diff --git a/.github/workflows/build_llvm_libraries.yml b/.github/workflows/build_llvm_libraries.yml index 54f8781a44..0ec5f21d4d 100644 --- a/.github/workflows/build_llvm_libraries.yml +++ b/.github/workflows/build_llvm_libraries.yml @@ -44,8 +44,13 @@ jobs: actions: write # for uploading cached artifact steps: + - name: Harden the runner (Audit all outbound calls) + uses: step-security/harden-runner@95d9a5deda9de15063e7595e9719c11c38c90ae2 # v2.13.2 + with: + egress-policy: audit + - name: checkout - uses: actions/checkout@v5 + uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 - name: install dependencies for non macos-14 if: inputs.os != 'macos-14' @@ -79,7 +84,7 @@ jobs: - name: Cache LLVM libraries id: retrieve_llvm_libs - uses: actions/cache@v4 + uses: actions/cache@0057852bfaa89a56745cba8c7296529d2fc39830 # v4.3.0 with: path: | ./core/deps/llvm/build/bin @@ -89,7 +94,7 @@ jobs: ./core/deps/llvm/build/share key: ${{ steps.create_lib_cache_key.outputs.key}} - - uses: actions/cache@v4 + - uses: actions/cache@0057852bfaa89a56745cba8c7296529d2fc39830 # v4.3.0 with: path: ~/.cache/ccache key: 0-ccache-${{ inputs.os }}-${{ steps.get_last_commit.outputs.last_commit }} @@ -101,7 +106,7 @@ jobs: - run: sudo apt install -y ccache ninja-build if: steps.retrieve_llvm_libs.outputs.cache-hit != 'true' && startsWith(inputs.os, 'ubuntu') && inputs.container_image == '' - - uses: actions/cache@v4 + - uses: actions/cache@0057852bfaa89a56745cba8c7296529d2fc39830 # v4.3.0 with: path: ~/Library/Caches/ccache key: 0-ccache-${{ inputs.os }}-${{ steps.get_last_commit.outputs.last_commit }} @@ -112,7 +117,7 @@ jobs: - run: brew install ccache ninja if: steps.retrieve_llvm_libs.outputs.cache-hit != 'true' && startsWith(inputs.os, 'macos') - - uses: actions/cache@v4 + - uses: actions/cache@0057852bfaa89a56745cba8c7296529d2fc39830 # v4.3.0 with: path: ~/.cache/ccache key: 0-ccache-${{ inputs.os }}-${{ steps.get_last_commit.outputs.last_commit }} diff --git a/.github/workflows/build_wamr_lldb.yml b/.github/workflows/build_wamr_lldb.yml index 8c259d3009..9494e2d818 100644 --- a/.github/workflows/build_wamr_lldb.yml +++ b/.github/workflows/build_wamr_lldb.yml @@ -55,7 +55,12 @@ jobs: contents: write # for uploading release artifacts steps: - - uses: actions/checkout@v5 + - name: Harden the runner (Audit all outbound calls) + uses: step-security/harden-runner@95d9a5deda9de15063e7595e9719c11c38c90ae2 # v2.13.2 + with: + egress-policy: audit + + - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 - name: download and install wasi-sdk run: | @@ -68,7 +73,7 @@ jobs: - name: Cache build id: lldb_build_cache - uses: actions/cache@v4 + uses: actions/cache@0057852bfaa89a56745cba8c7296529d2fc39830 # v4.3.0 with: path: | ./core/deps/llvm-project/build/bin @@ -82,7 +87,7 @@ jobs: - name: setup xcode macos if: steps.lldb_build_cache.outputs.cache-hit != 'true' && contains(inputs.runner, 'macos') - uses: maxim-lobanov/setup-xcode@v1 + uses: maxim-lobanov/setup-xcode@60606e260d2fc5762a71e64e74b2174e8ea3c8bd # v1.6.0 with: xcode-version: latest-stable @@ -249,7 +254,7 @@ jobs: working-directory: core/deps/llvm-project - name: upload release tar.gz - uses: actions/upload-release-asset@v1 + uses: actions/upload-release-asset@e8f9f06c4b078e705bd2ea027f0926603fc9b4d5 # v1.0.2 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} with: @@ -259,7 +264,7 @@ jobs: asset_content_type: application/x-gzip - name: upload release zip - uses: actions/upload-release-asset@v1 + uses: actions/upload-release-asset@e8f9f06c4b078e705bd2ea027f0926603fc9b4d5 # v1.0.2 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} with: diff --git a/.github/workflows/build_wamr_sdk.yml b/.github/workflows/build_wamr_sdk.yml index c3faeaa6d0..ff8026c850 100644 --- a/.github/workflows/build_wamr_sdk.yml +++ b/.github/workflows/build_wamr_sdk.yml @@ -45,7 +45,12 @@ jobs: contents: write # for uploading release artifacts steps: - - uses: actions/checkout@v5 + - name: Harden the runner (Audit all outbound calls) + uses: step-security/harden-runner@95d9a5deda9de15063e7595e9719c11c38c90ae2 # v2.13.2 + with: + egress-policy: audit + + - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 - name: download wamr-app-framework run: | @@ -84,7 +89,7 @@ jobs: working-directory: wamr-sdk - name: upload release tar.gz - uses: actions/upload-release-asset@v1 + uses: actions/upload-release-asset@e8f9f06c4b078e705bd2ea027f0926603fc9b4d5 # v1.0.2 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} with: @@ -94,7 +99,7 @@ jobs: asset_content_type: application/x-gzip - name: upload release zip - uses: actions/upload-release-asset@v1 + uses: actions/upload-release-asset@e8f9f06c4b078e705bd2ea027f0926603fc9b4d5 # v1.0.2 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} with: diff --git a/.github/workflows/build_wamr_vscode_ext.yml b/.github/workflows/build_wamr_vscode_ext.yml index 1b4f3fc5d8..ee96d7e140 100644 --- a/.github/workflows/build_wamr_vscode_ext.yml +++ b/.github/workflows/build_wamr_vscode_ext.yml @@ -24,10 +24,15 @@ jobs: contents: write # for uploading release artifacts steps: - - uses: actions/checkout@v5 + - name: Harden the runner (Audit all outbound calls) + uses: step-security/harden-runner@95d9a5deda9de15063e7595e9719c11c38c90ae2 # v2.13.2 + with: + egress-policy: audit + + - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 - name: Use Node.js 18.x - uses: actions/setup-node@v6 + uses: actions/setup-node@2028fbc5c25fe9cf00d9f06a71cc4710d4507903 # v6.0.0 with: node-version: 18.x @@ -59,7 +64,7 @@ jobs: working-directory: test-tools/wamr-ide/VSCode-Extension - name: upload release tar.gz - uses: actions/upload-release-asset@v1 + uses: actions/upload-release-asset@e8f9f06c4b078e705bd2ea027f0926603fc9b4d5 # v1.0.2 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} with: @@ -69,7 +74,7 @@ jobs: asset_content_type: application/x-gzip - name: upload release zip - uses: actions/upload-release-asset@v1 + uses: actions/upload-release-asset@e8f9f06c4b078e705bd2ea027f0926603fc9b4d5 # v1.0.2 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} with: diff --git a/.github/workflows/build_wamr_wasi_extensions.yml b/.github/workflows/build_wamr_wasi_extensions.yml index 82b611e39e..66271f541e 100644 --- a/.github/workflows/build_wamr_wasi_extensions.yml +++ b/.github/workflows/build_wamr_wasi_extensions.yml @@ -27,8 +27,13 @@ jobs: matrix: os: [ubuntu-22.04] steps: + - name: Harden the runner (Audit all outbound calls) + uses: step-security/harden-runner@95d9a5deda9de15063e7595e9719c11c38c90ae2 # v2.13.2 + with: + egress-policy: audit + - name: checkout - uses: actions/checkout@v5 + uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 - name: install-wasi-sdk-wabt uses: ./.github/actions/install-wasi-sdk-wabt @@ -47,7 +52,7 @@ jobs: working-directory: wamr-wasi-extensions/dist - name: Upload release zip - uses: actions/upload-release-asset@v1 + uses: actions/upload-release-asset@e8f9f06c4b078e705bd2ea027f0926603fc9b4d5 # v1.0.2 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} with: diff --git a/.github/workflows/build_wamrc.yml b/.github/workflows/build_wamrc.yml index d74805c3cd..4d3fbb1e2a 100644 --- a/.github/workflows/build_wamrc.yml +++ b/.github/workflows/build_wamrc.yml @@ -41,11 +41,16 @@ jobs: contents: write # for uploading release artifacts steps: - - uses: actions/checkout@v5 + - name: Harden the runner (Audit all outbound calls) + uses: step-security/harden-runner@95d9a5deda9de15063e7595e9719c11c38c90ae2 # v2.13.2 + with: + egress-policy: audit + + - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 - name: get cached LLVM libraries id: retrieve_llvm_libs - uses: actions/cache@v4 + uses: actions/cache@0057852bfaa89a56745cba8c7296529d2fc39830 # v4.3.0 with: path: | ./core/deps/llvm/build/bin @@ -104,7 +109,7 @@ jobs: - name: upload release tar.gz if: inputs.release - uses: actions/upload-release-asset@v1 + uses: actions/upload-release-asset@e8f9f06c4b078e705bd2ea027f0926603fc9b4d5 # v1.0.2 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} with: @@ -115,7 +120,7 @@ jobs: - name: upload release zip if: inputs.release - uses: actions/upload-release-asset@v1 + uses: actions/upload-release-asset@e8f9f06c4b078e705bd2ea027f0926603fc9b4d5 # v1.0.2 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} with: diff --git a/.github/workflows/check_version_h.yml b/.github/workflows/check_version_h.yml index 98d89f814b..acbd90d005 100644 --- a/.github/workflows/check_version_h.yml +++ b/.github/workflows/check_version_h.yml @@ -13,8 +13,13 @@ jobs: runs-on: ubuntu-latest steps: + - name: Harden the runner (Audit all outbound calls) + uses: step-security/harden-runner@95d9a5deda9de15063e7595e9719c11c38c90ae2 # v2.13.2 + with: + egress-policy: audit + - name: checkout - uses: actions/checkout@v5 + uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 - name: cmake execute to generate version.h run: cmake -B build_version -S . diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml index 292123aa31..510d8074c1 100644 --- a/.github/workflows/codeql.yml +++ b/.github/workflows/codeql.yml @@ -15,6 +15,9 @@ on: # allow to be triggered manually workflow_dispatch: +permissions: + contents: read + jobs: analyze: # only run this job if the repository is not a fork @@ -42,14 +45,19 @@ jobs: security-events: write steps: + - name: Harden the runner (Audit all outbound calls) + uses: step-security/harden-runner@95d9a5deda9de15063e7595e9719c11c38c90ae2 # v2.13.2 + with: + egress-policy: audit + - name: Checkout repository - uses: actions/checkout@v3 + uses: actions/checkout@f43a0e5ff2bd294095638e18286ca9a3d1956744 # v3.6.0 with: submodules: recursive # Initializes the CodeQL tools for scanning. - name: Initialize CodeQL - uses: github/codeql-action/init@v4.31.2 + uses: github/codeql-action/init@0499de31b99561a6d14a36a5f662c2a54f91beee # v4.31.2 with: languages: ${{ matrix.language }} # For more details on CodeQL's query packs, refer to: https://docs.github.com/en/code-security/code-scanning/automatically-scanning-your-code-for-vulnerabilities-and-errors/configuring-code-scanning#using-queries-in-ql-packs @@ -61,7 +69,7 @@ jobs: ./.github/scripts/codeql_buildscript.sh - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@v3.29.1 + uses: github/codeql-action/analyze@39edc492dbe16b1465b0cafca41432d857bdb31a # v3.29.1 with: category: "/language:${{matrix.language}}" upload: false @@ -81,7 +89,7 @@ jobs: # # execute customized compiler - name: Filter out unwanted errors and warnings - uses: advanced-security/filter-sarif@v1 + uses: advanced-security/filter-sarif@f3b8118a9349d88f7b1c0c488476411145b6270d # v1.0.1 with: patterns: | ## Exclude files and directories @@ -114,14 +122,14 @@ jobs: output: ${{ steps.step1.outputs.sarif-output }}/cpp.sarif - name: Upload CodeQL results to code scanning - uses: github/codeql-action/upload-sarif@v4.31.2 + uses: github/codeql-action/upload-sarif@0499de31b99561a6d14a36a5f662c2a54f91beee # v4.31.2 with: sarif_file: ${{ steps.step1.outputs.sarif-output }} category: "/language:${{matrix.language}}" - name: Upload CodeQL results as an artifact if: success() || failure() - uses: actions/upload-artifact@v4.6.2 + uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2 with: name: codeql-results path: ${{ steps.step1.outputs.sarif-output }} diff --git a/.github/workflows/coding_guidelines.yml b/.github/workflows/coding_guidelines.yml index 4feaf33957..e601f24ae7 100644 --- a/.github/workflows/coding_guidelines.yml +++ b/.github/workflows/coding_guidelines.yml @@ -21,8 +21,13 @@ jobs: compliance_job: runs-on: ubuntu-22.04 steps: + - name: Harden the runner (Audit all outbound calls) + uses: step-security/harden-runner@95d9a5deda9de15063e7595e9719c11c38c90ae2 # v2.13.2 + with: + egress-policy: audit + - name: checkout - uses: actions/checkout@v5 + uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 with: fetch-depth: 0 diff --git a/.github/workflows/compilation_on_android_ubuntu.yml b/.github/workflows/compilation_on_android_ubuntu.yml index 3d888d4aa3..414d1ad09e 100644 --- a/.github/workflows/compilation_on_android_ubuntu.yml +++ b/.github/workflows/compilation_on_android_ubuntu.yml @@ -100,14 +100,19 @@ jobs: - os: ubuntu-22.04 llvm_cache_key: ${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }} steps: + - name: Harden the runner (Audit all outbound calls) + uses: step-security/harden-runner@95d9a5deda9de15063e7595e9719c11c38c90ae2 # v2.13.2 + with: + egress-policy: audit + - name: checkout - uses: actions/checkout@v5 + uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 # since jobs.id can't contain the dot character # it is hard to use `format` to assemble the cache key - name: Get LLVM libraries id: retrieve_llvm_libs - uses: actions/cache@v4 + uses: actions/cache@0057852bfaa89a56745cba8c7296529d2fc39830 # v4.3.0 with: path: | ./core/deps/llvm/build/bin @@ -269,14 +274,19 @@ jobs: - os: ubuntu-22.04 llvm_cache_key: ${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }} steps: + - name: Harden the runner (Audit all outbound calls) + uses: step-security/harden-runner@95d9a5deda9de15063e7595e9719c11c38c90ae2 # v2.13.2 + with: + egress-policy: audit + - name: checkout - uses: actions/checkout@v5 + uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 # only download llvm cache when needed - name: Get LLVM libraries id: retrieve_llvm_libs if: endsWith(matrix.make_options_run_mode, '_JIT_BUILD_OPTIONS') - uses: actions/cache@v4 + uses: actions/cache@0057852bfaa89a56745cba8c7296529d2fc39830 # v4.3.0 with: path: | ./core/deps/llvm/build/bin @@ -327,12 +337,17 @@ jobs: llvm_cache_key: ${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }} steps: + - name: Harden the runner (Audit all outbound calls) + uses: step-security/harden-runner@95d9a5deda9de15063e7595e9719c11c38c90ae2 # v2.13.2 + with: + egress-policy: audit + - name: checkout - uses: actions/checkout@v5 + uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 - name: Get LLVM libraries id: retrieve_llvm_libs - uses: actions/cache@v4 + uses: actions/cache@0057852bfaa89a56745cba8c7296529d2fc39830 # v4.3.0 with: path: | ./core/deps/llvm/build/bin @@ -385,12 +400,17 @@ jobs: llvm_cache_key: ${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }} steps: + - name: Harden the runner (Audit all outbound calls) + uses: step-security/harden-runner@95d9a5deda9de15063e7595e9719c11c38c90ae2 # v2.13.2 + with: + egress-policy: audit + - name: checkout - uses: actions/checkout@v5 + uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 - name: Get LLVM libraries id: retrieve_llvm_libs - uses: actions/cache@v4 + uses: actions/cache@0057852bfaa89a56745cba8c7296529d2fc39830 # v4.3.0 with: path: | ./core/deps/llvm/build/bin @@ -441,13 +461,18 @@ jobs: llvm_cache_key: ${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }} steps: + - name: Harden the runner (Audit all outbound calls) + uses: step-security/harden-runner@95d9a5deda9de15063e7595e9719c11c38c90ae2 # v2.13.2 + with: + egress-policy: audit + - name: checkout - uses: actions/checkout@v5 + uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 - name: Get LLVM libraries id: retrieve_llvm_libs if: (!endsWith(matrix.make_options, '_INTERP_BUILD_OPTIONS')) - uses: actions/cache@v4 + uses: actions/cache@0057852bfaa89a56745cba8c7296529d2fc39830 # v4.3.0 with: path: | ./core/deps/llvm/build/bin @@ -503,12 +528,17 @@ jobs: llvm_cache_key: ${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }} steps: + - name: Harden the runner (Audit all outbound calls) + uses: step-security/harden-runner@95d9a5deda9de15063e7595e9719c11c38c90ae2 # v2.13.2 + with: + egress-policy: audit + - name: checkout - uses: actions/checkout@v5 + uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 - name: Get LLVM libraries id: retrieve_llvm_libs - uses: actions/cache@v4 + uses: actions/cache@0057852bfaa89a56745cba8c7296529d2fc39830 # v4.3.0 with: path: | ./core/deps/llvm/build/bin @@ -674,11 +704,16 @@ jobs: test_option: $WAMR_COMPILER_TEST_OPTIONS steps: + - name: Harden the runner (Audit all outbound calls) + uses: step-security/harden-runner@95d9a5deda9de15063e7595e9719c11c38c90ae2 # v2.13.2 + with: + egress-policy: audit + - name: checkout - uses: actions/checkout@v5 + uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 - name: Set-up OCaml - uses: ocaml/setup-ocaml@v3 + uses: ocaml/setup-ocaml@ddef532293b85980b315344506def8eb09917e2c # v3.4.6 if: matrix.test_option == '$GC_TEST_OPTIONS' with: ocaml-compiler: 4.13 @@ -709,7 +744,7 @@ jobs: - name: Get LLVM libraries if: env.USE_LLVM == 'true' id: retrieve_llvm_libs - uses: actions/cache@v4 + uses: actions/cache@0057852bfaa89a56745cba8c7296529d2fc39830 # v4.3.0 with: path: | ./core/deps/llvm/build/bin diff --git a/.github/workflows/compilation_on_macos.yml b/.github/workflows/compilation_on_macos.yml index 912bf7dea7..d8a178ba6b 100644 --- a/.github/workflows/compilation_on_macos.yml +++ b/.github/workflows/compilation_on_macos.yml @@ -85,12 +85,17 @@ jobs: - os: macos-13 llvm_cache_key: ${{ needs.build_llvm_libraries_on_intel_macos.outputs.cache_key }} steps: + - name: Harden the runner (Audit all outbound calls) + uses: step-security/harden-runner@95d9a5deda9de15063e7595e9719c11c38c90ae2 # v2.13.2 + with: + egress-policy: audit + - name: checkout - uses: actions/checkout@v5 + uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 - name: Get LLVM libraries id: retrieve_llvm_libs - uses: actions/cache@v4 + uses: actions/cache@0057852bfaa89a56745cba8c7296529d2fc39830 # v4.3.0 with: path: | ./core/deps/llvm/build/bin @@ -189,14 +194,19 @@ jobs: - os: macos-13 llvm_cache_key: ${{ needs.build_llvm_libraries_on_intel_macos.outputs.cache_key }} steps: + - name: Harden the runner (Audit all outbound calls) + uses: step-security/harden-runner@95d9a5deda9de15063e7595e9719c11c38c90ae2 # v2.13.2 + with: + egress-policy: audit + - name: checkout - uses: actions/checkout@v5 + uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 # only download llvm cache when needed - name: Get LLVM libraries id: retrieve_llvm_libs if: endsWith(matrix.make_options_run_mode, '_JIT_BUILD_OPTIONS') - uses: actions/cache@v4 + uses: actions/cache@0057852bfaa89a56745cba8c7296529d2fc39830 # v4.3.0 with: path: | ./core/deps/llvm/build/bin @@ -242,13 +252,18 @@ jobs: llvm_cache_key: ${{ needs.build_llvm_libraries_on_intel_macos.outputs.cache_key }} steps: + - name: Harden the runner (Audit all outbound calls) + uses: step-security/harden-runner@95d9a5deda9de15063e7595e9719c11c38c90ae2 # v2.13.2 + with: + egress-policy: audit + - name: checkout - uses: actions/checkout@v5 + uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 - name: Get LLVM libraries id: retrieve_llvm_libs if: (!endsWith(matrix.make_options, '_INTERP_BUILD_OPTIONS')) - uses: actions/cache@v4 + uses: actions/cache@0057852bfaa89a56745cba8c7296529d2fc39830 # v4.3.0 with: path: | ./core/deps/llvm/build/bin @@ -300,8 +315,13 @@ jobs: - os: macos-14 llvm_cache_key: ${{ needs.build_llvm_libraries_on_arm_macos.outputs.cache_key }} steps: + - name: Harden the runner (Audit all outbound calls) + uses: step-security/harden-runner@95d9a5deda9de15063e7595e9719c11c38c90ae2 # v2.13.2 + with: + egress-policy: audit + - name: checkout - uses: actions/checkout@v5 + uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 - name: install-wasi-sdk-wabt uses: ./.github/actions/install-wasi-sdk-wabt @@ -356,7 +376,7 @@ jobs: - name: Get LLVM libraries id: retrieve_llvm_libs - uses: actions/cache@v4 + uses: actions/cache@0057852bfaa89a56745cba8c7296529d2fc39830 # v4.3.0 with: path: | ./core/deps/llvm/build/bin diff --git a/.github/workflows/compilation_on_nuttx.yml b/.github/workflows/compilation_on_nuttx.yml index 4e164fc82b..1e9c490cea 100644 --- a/.github/workflows/compilation_on_nuttx.yml +++ b/.github/workflows/compilation_on_nuttx.yml @@ -84,22 +84,27 @@ jobs: - "CONFIG_INTERPRETERS_WAMR_AOT CONFIG_INTERPRETERS_WAMR_CLASSIC CONFIG_INTERPRETERS_WAMR_LIBC_WASI" steps: + - name: Harden the runner (Audit all outbound calls) + uses: step-security/harden-runner@95d9a5deda9de15063e7595e9719c11c38c90ae2 # v2.13.2 + with: + egress-policy: audit + - name: Checkout NuttX - uses: actions/checkout@v5 + uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 with: repository: apache/nuttx ref: releases/12.9 path: nuttx - name: Checkout NuttX Apps - uses: actions/checkout@v5 + uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 with: repository: apache/nuttx-apps ref: releases/12.9 path: apps - name: Checkout WAMR - uses: actions/checkout@v5 + uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 with: repository: ${{ github.repository }} path: apps/interpreters/wamr/wamr @@ -122,7 +127,7 @@ jobs: run: make -j$(nproc) EXTRAFLAGS=-Werror - name: Checkout Bloaty - uses: actions/checkout@v5 + uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 with: repository: google/bloaty submodules: recursive diff --git a/.github/workflows/compilation_on_sgx.yml b/.github/workflows/compilation_on_sgx.yml index aa95f94699..3bcd16eb15 100644 --- a/.github/workflows/compilation_on_sgx.yml +++ b/.github/workflows/compilation_on_sgx.yml @@ -115,8 +115,13 @@ jobs: - make_options_run_mode: $AOT_BUILD_OPTIONS make_options_feature: "-DWAMR_BUILD_MINI_LOADER=1" steps: + - name: Harden the runner (Audit all outbound calls) + uses: step-security/harden-runner@95d9a5deda9de15063e7595e9719c11c38c90ae2 # v2.13.2 + with: + egress-policy: audit + - name: checkout - uses: actions/checkout@v5 + uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 - name: install SGX SDK and necessary libraries uses: ./.github/actions/install-linux-sgx @@ -158,8 +163,13 @@ jobs: llvm_cache_key: ${{ needs.build_llvm_libraries.outputs.cache_key }} steps: + - name: Harden the runner (Audit all outbound calls) + uses: step-security/harden-runner@95d9a5deda9de15063e7595e9719c11c38c90ae2 # v2.13.2 + with: + egress-policy: audit + - name: checkout - uses: actions/checkout@v5 + uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 - name: install-wasi-sdk-wabt uses: ./.github/actions/install-wasi-sdk-wabt @@ -183,7 +193,7 @@ jobs: - name: Get LLVM libraries if: matrix.iwasm_make_options_run_mode == '$AOT_BUILD_OPTIONS' id: retrieve_llvm_libs - uses: actions/cache@v4 + uses: actions/cache@0057852bfaa89a56745cba8c7296529d2fc39830 # v4.3.0 with: path: | ./core/deps/llvm/build/bin @@ -254,13 +264,18 @@ jobs: llvm_cache_key: ${{ needs.build_llvm_libraries.outputs.cache_key }} steps: + - name: Harden the runner (Audit all outbound calls) + uses: step-security/harden-runner@95d9a5deda9de15063e7595e9719c11c38c90ae2 # v2.13.2 + with: + egress-policy: audit + - name: checkout - uses: actions/checkout@v5 + uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 - name: Get LLVM libraries if: matrix.running_mode == 'aot' id: retrieve_llvm_libs - uses: actions/cache@v4 + uses: actions/cache@0057852bfaa89a56745cba8c7296529d2fc39830 # v4.3.0 with: path: | ./core/deps/llvm/build/bin diff --git a/.github/workflows/compilation_on_windows.yml b/.github/workflows/compilation_on_windows.yml index 003a6ba988..aa5280de04 100644 --- a/.github/workflows/compilation_on_windows.yml +++ b/.github/workflows/compilation_on_windows.yml @@ -85,7 +85,12 @@ jobs: "-DWAMR_BUILD_LIBC_UVWASI=0 -DWAMR_BUILD_LIBC_WASI=1", ] steps: - - uses: actions/checkout@v5 + - name: Harden the runner (Audit all outbound calls) + uses: step-security/harden-runner@95d9a5deda9de15063e7595e9719c11c38c90ae2 # v2.13.2 + with: + egress-policy: audit + + - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 - name: clone uvwasi library if: ${{ !contains(matrix.build_options, '-DWAMR_BUILD_LIBC_UVWASI=0') }} @@ -108,14 +113,19 @@ jobs: - os: windows-2022 llvm_cache_key: ${{ needs.build_llvm_libraries_on_windows.outputs.cache_key }} steps: + - name: Harden the runner (Audit all outbound calls) + uses: step-security/harden-runner@95d9a5deda9de15063e7595e9719c11c38c90ae2 # v2.13.2 + with: + egress-policy: audit + - name: checkout - uses: actions/checkout@v5 + uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 # since jobs.id can't contain the dot character # it is hard to use `format` to assemble the cache key - name: Get LLVM libraries id: retrieve_llvm_libs - uses: actions/cache@v4 + uses: actions/cache@0057852bfaa89a56745cba8c7296529d2fc39830 # v4.3.0 with: path: | ./core/deps/llvm/build/bin @@ -150,8 +160,13 @@ jobs: $WASI_TEST_OPTIONS, ] steps: + - name: Harden the runner (Audit all outbound calls) + uses: step-security/harden-runner@95d9a5deda9de15063e7595e9719c11c38c90ae2 # v2.13.2 + with: + egress-policy: audit + - name: checkout - uses: actions/checkout@v5 + uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 - name: download and install wasi-sdk if: matrix.test_option == '$WASI_TEST_OPTIONS' diff --git a/.github/workflows/compilation_on_zephyr.yml b/.github/workflows/compilation_on_zephyr.yml index 06ff334f1e..899adda4df 100644 --- a/.github/workflows/compilation_on_zephyr.yml +++ b/.github/workflows/compilation_on_zephyr.yml @@ -79,8 +79,13 @@ jobs: # ├─── vendor/ # └─── application/ --> DUMMY. keep west_lite.yml here + - name: Harden the runner (Audit all outbound calls) + uses: step-security/harden-runner@95d9a5deda9de15063e7595e9719c11c38c90ae2 # v2.13.2 + with: + egress-policy: audit + - name: Checkout code - uses: actions/checkout@v5 + uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 with: path: modules/wasm-micro-runtime @@ -91,7 +96,7 @@ jobs: cp modules/wasm-micro-runtime/product-mini/platforms/zephyr/simple/west_lite.yml application/west_lite.yml - name: Setup Zephyr project - uses: zephyrproject-rtos/action-zephyr-setup@v1 + uses: zephyrproject-rtos/action-zephyr-setup@c125c5ebeeadbd727fa740b407f862734af1e52a # v1.0.9 with: app-path: application manifest-file-name: west_lite.yml diff --git a/.github/workflows/create_tag.yml b/.github/workflows/create_tag.yml index dcb2937495..681e9a3b3a 100644 --- a/.github/workflows/create_tag.yml +++ b/.github/workflows/create_tag.yml @@ -29,7 +29,12 @@ jobs: contents: write # create and push tags steps: - - uses: actions/checkout@v5 + - name: Harden the runner (Audit all outbound calls) + uses: step-security/harden-runner@95d9a5deda9de15063e7595e9719c11c38c90ae2 # v2.13.2 + with: + egress-policy: audit + + - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 # Full git history is needed to get a proper list of commits and tags with: fetch-depth: 0 diff --git a/.github/workflows/dependency-review.yml b/.github/workflows/dependency-review.yml new file mode 100644 index 0000000000..973c6fd11a --- /dev/null +++ b/.github/workflows/dependency-review.yml @@ -0,0 +1,27 @@ +# Dependency Review Action +# +# This Action will scan dependency manifest files that change as part of a Pull Request, +# surfacing known-vulnerable versions of the packages declared or updated in the PR. +# Once installed, if the workflow run is marked as required, +# PRs introducing known-vulnerable packages will be blocked from merging. +# +# Source repository: https://github.com/actions/dependency-review-action +name: 'Dependency Review' +on: [pull_request] + +permissions: + contents: read + +jobs: + dependency-review: + runs-on: ubuntu-latest + steps: + - name: Harden the runner (Audit all outbound calls) + uses: step-security/harden-runner@95d9a5deda9de15063e7595e9719c11c38c90ae2 # v2.13.2 + with: + egress-policy: audit + + - name: 'Checkout Repository' + uses: actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955 # v4.3.0 + - name: 'Dependency Review' + uses: actions/dependency-review-action@3c4e3dcb1aa7874d2c16be7d79418e9b7efd6261 # v4.8.2 diff --git a/.github/workflows/hadolint_dockerfiles.yml b/.github/workflows/hadolint_dockerfiles.yml index e43cd10372..04aa355313 100644 --- a/.github/workflows/hadolint_dockerfiles.yml +++ b/.github/workflows/hadolint_dockerfiles.yml @@ -36,8 +36,13 @@ jobs: runs-on: ubuntu-22.04 steps: + - name: Harden the runner (Audit all outbound calls) + uses: step-security/harden-runner@95d9a5deda9de15063e7595e9719c11c38c90ae2 # v2.13.2 + with: + egress-policy: audit + - name: Checkout repository - uses: actions/checkout@v5 + uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 # on default, hadolint will fail on warnings and errors - name: Run hadolint on dockerfiles diff --git a/.github/workflows/nightly_run.yml b/.github/workflows/nightly_run.yml index 58532aac85..a913c676f1 100644 --- a/.github/workflows/nightly_run.yml +++ b/.github/workflows/nightly_run.yml @@ -66,14 +66,19 @@ jobs: - os: ubuntu-22.04 llvm_cache_key: ${{ needs.build_llvm_libraries_on_ubuntu.outputs.cache_key }} steps: + - name: Harden the runner (Audit all outbound calls) + uses: step-security/harden-runner@95d9a5deda9de15063e7595e9719c11c38c90ae2 # v2.13.2 + with: + egress-policy: audit + - name: checkout - uses: actions/checkout@v5 + uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 # since jobs.id can't contain the dot character # it is hard to use `format` to assemble the cache key - name: Get LLVM libraries id: retrieve_llvm_libs - uses: actions/cache@v4 + uses: actions/cache@0057852bfaa89a56745cba8c7296529d2fc39830 # v4.3.0 with: path: | ./core/deps/llvm/build/bin @@ -232,14 +237,19 @@ jobs: llvm_cache_key: ${{ needs.build_llvm_libraries_on_ubuntu.outputs.cache_key }} steps: + - name: Harden the runner (Audit all outbound calls) + uses: step-security/harden-runner@95d9a5deda9de15063e7595e9719c11c38c90ae2 # v2.13.2 + with: + egress-policy: audit + - name: checkout - uses: actions/checkout@v5 + uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 # only download llvm cache when needed - name: Get LLVM libraries id: retrieve_llvm_libs if: endsWith(matrix.make_options_run_mode, '_JIT_BUILD_OPTIONS') - uses: actions/cache@v4 + uses: actions/cache@0057852bfaa89a56745cba8c7296529d2fc39830 # v4.3.0 with: path: | ./core/deps/llvm/build/bin @@ -340,6 +350,11 @@ jobs: - make_options_run_mode: $FAST_JIT_BUILD_OPTIONS make_options_feature: "-DWAMR_BUILD_MULTI_MEMORY=1" steps: + - name: Harden the runner (Audit all outbound calls) + uses: step-security/harden-runner@95d9a5deda9de15063e7595e9719c11c38c90ae2 # v2.13.2 + with: + egress-policy: audit + - name: Install dependencies run: | apt update && apt install -y make g++-4.8 gcc-4.8 wget git @@ -386,13 +401,18 @@ jobs: - make_options: $MULTI_TIER_JIT_BUILD_OPTIONS sanitizer: asan steps: + - name: Harden the runner (Audit all outbound calls) + uses: step-security/harden-runner@95d9a5deda9de15063e7595e9719c11c38c90ae2 # v2.13.2 + with: + egress-policy: audit + - name: checkout - uses: actions/checkout@v5 + uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 - name: Get LLVM libraries id: retrieve_llvm_libs if: (!endsWith(matrix.make_options, '_INTERP_BUILD_OPTIONS')) - uses: actions/cache@v4 + uses: actions/cache@0057852bfaa89a56745cba8c7296529d2fc39830 # v4.3.0 with: path: | ./core/deps/llvm/build/bin @@ -439,8 +459,13 @@ jobs: - os: ubuntu-22.04 llvm_cache_key: ${{ needs.build_llvm_libraries_on_ubuntu.outputs.cache_key }} steps: + - name: Harden the runner (Audit all outbound calls) + uses: step-security/harden-runner@95d9a5deda9de15063e7595e9719c11c38c90ae2 # v2.13.2 + with: + egress-policy: audit + - name: checkout - uses: actions/checkout@v5 + uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 - name: install-wasi-sdk-wabt uses: ./.github/actions/install-wasi-sdk-wabt @@ -449,7 +474,7 @@ jobs: - name: Get LLVM libraries id: retrieve_llvm_libs - uses: actions/cache@v4 + uses: actions/cache@0057852bfaa89a56745cba8c7296529d2fc39830 # v4.3.0 with: path: | ./core/deps/llvm/build/bin @@ -633,8 +658,13 @@ jobs: - running_mode: "fast-interp" sanitizer: ubsan steps: + - name: Harden the runner (Audit all outbound calls) + uses: step-security/harden-runner@95d9a5deda9de15063e7595e9719c11c38c90ae2 # v2.13.2 + with: + egress-policy: audit + - name: checkout - uses: actions/checkout@v5 + uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 - name: install-wasi-sdk-wabt if: matrix.test_option == '$WASI_TEST_OPTIONS' @@ -663,7 +693,7 @@ jobs: - name: Get LLVM libraries if: env.USE_LLVM == 'true' id: retrieve_llvm_libs - uses: actions/cache@v4 + uses: actions/cache@0057852bfaa89a56745cba8c7296529d2fc39830 # v4.3.0 with: path: | ./core/deps/llvm/build/bin diff --git a/.github/workflows/release_process.yml b/.github/workflows/release_process.yml index 621f8c2f89..c5862447ee 100644 --- a/.github/workflows/release_process.yml +++ b/.github/workflows/release_process.yml @@ -55,7 +55,12 @@ jobs: outputs: upload_url: ${{ steps.create_release.outputs.upload_url }} steps: - - uses: actions/checkout@v5 + - name: Harden the runner (Audit all outbound calls) + uses: step-security/harden-runner@95d9a5deda9de15063e7595e9719c11c38c90ae2 # v2.13.2 + with: + egress-policy: audit + + - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 - name: prepare the release note run: | @@ -66,7 +71,7 @@ jobs: - name: create a release id: create_release - uses: actions/create-release@v1 + uses: actions/create-release@0cb9c9b65d5d1901c1f53e5e66eaf4afd303e70e # v1.1.4 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} with: diff --git a/.github/workflows/reuse_latest_release_binaries.yml b/.github/workflows/reuse_latest_release_binaries.yml index 7c34cb6183..a39f026276 100644 --- a/.github/workflows/reuse_latest_release_binaries.yml +++ b/.github/workflows/reuse_latest_release_binaries.yml @@ -34,7 +34,12 @@ jobs: contents: write # for creating realease and uploading release artifacts steps: - - uses: actions/checkout@v5 + - name: Harden the runner (Audit all outbound calls) + uses: step-security/harden-runner@95d9a5deda9de15063e7595e9719c11c38c90ae2 # v2.13.2 + with: + egress-policy: audit + + - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 # Full git history is needed to get a proper list of commits and tags with: fetch-depth: 0 @@ -53,7 +58,7 @@ jobs: - name: upload release tar.gz if: steps.try_reuse.outputs.result == 'hit' - uses: actions/upload-release-asset@v1 + uses: actions/upload-release-asset@e8f9f06c4b078e705bd2ea027f0926603fc9b4d5 # v1.0.2 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} with: @@ -64,7 +69,7 @@ jobs: - name: upload release zip if: steps.try_reuse.outputs.result == 'hit' - uses: actions/upload-release-asset@v1 + uses: actions/upload-release-asset@e8f9f06c4b078e705bd2ea027f0926603fc9b4d5 # v1.0.2 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} with: diff --git a/.github/workflows/spec_test_on_nuttx.yml b/.github/workflows/spec_test_on_nuttx.yml index 9cf34d2ac3..f42fa9a1bd 100644 --- a/.github/workflows/spec_test_on_nuttx.yml +++ b/.github/workflows/spec_test_on_nuttx.yml @@ -142,22 +142,27 @@ jobs: steps: # Note: we use an unreleased version nuttx for xtensa because # 12.4 doesn't contain necessary esp32s3 changes. + - name: Harden the runner (Audit all outbound calls) + uses: step-security/harden-runner@95d9a5deda9de15063e7595e9719c11c38c90ae2 # v2.13.2 + with: + egress-policy: audit + - name: Checkout NuttX - uses: actions/checkout@v5 + uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 with: repository: apache/nuttx ref: ${{ matrix.target_config.target == 'xtensa' && '985d395b025cf2012b22f6bb4461959fa6d87645' || 'releases/12.9' }} path: nuttx - name: Checkout NuttX Apps - uses: actions/checkout@v5 + uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 with: repository: apache/nuttx-apps ref: ${{ matrix.target_config.target == 'xtensa' && '2ef3eb25c0cec944b13792185f7e5d5a05990d5f' || 'releases/12.9' }} path: apps - name: Checkout WAMR - uses: actions/checkout@v5 + uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 with: repository: ${{ github.repository }} path: apps/interpreters/wamr/wamr @@ -165,7 +170,7 @@ jobs: - name: Get LLVM libraries if: contains(matrix.wamr_test_option.mode, 'aot') id: retrieve_llvm_libs - uses: actions/cache@v4 + uses: actions/cache@0057852bfaa89a56745cba8c7296529d2fc39830 # v4.3.0 with: path: | ./core/deps/llvm/build/bin @@ -329,7 +334,7 @@ jobs: - name: upload the log if: always() - uses: actions/upload-artifact@v5 + uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5.0.0 with: name: spec-test-log-${{ github.run_id }}-${{ strategy.job-index }}-${{ matrix.target_config.target }} path: log diff --git a/.github/workflows/supply_chain.yml b/.github/workflows/supply_chain.yml index eea85cdf3e..ebfa6edbfe 100644 --- a/.github/workflows/supply_chain.yml +++ b/.github/workflows/supply_chain.yml @@ -33,6 +33,11 @@ jobs: id-token: write steps: + - name: Harden the runner (Audit all outbound calls) + uses: step-security/harden-runner@95d9a5deda9de15063e7595e9719c11c38c90ae2 # v2.13.2 + with: + egress-policy: audit + - name: "Checkout code" uses: actions/checkout@ff7abcd0c3c05ccf6adc123a8cd1fd4fb30fb493 # v3.1.0 with: diff --git a/.github/workflows/wamr_wasi_extensions.yml b/.github/workflows/wamr_wasi_extensions.yml index 4c8c2b737f..a5ab194925 100644 --- a/.github/workflows/wamr_wasi_extensions.yml +++ b/.github/workflows/wamr_wasi_extensions.yml @@ -29,8 +29,13 @@ jobs: matrix: os: [ubuntu-22.04, macos-13, macos-14] steps: + - name: Harden the runner (Audit all outbound calls) + uses: step-security/harden-runner@95d9a5deda9de15063e7595e9719c11c38c90ae2 # v2.13.2 + with: + egress-policy: audit + - name: checkout - uses: actions/checkout@v5 + uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 - name: install-wasi-sdk-wabt uses: ./.github/actions/install-wasi-sdk-wabt @@ -50,7 +55,7 @@ jobs: - name: Upload artifacts if: matrix.os == 'macos-14' - uses: actions/upload-artifact@v5 + uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5.0.0 with: name: wamr-wasi-extensions path: wamr-wasi-extensions/dist diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml new file mode 100644 index 0000000000..073326191a --- /dev/null +++ b/.pre-commit-config.yaml @@ -0,0 +1,30 @@ +repos: +- repo: https://github.com/gitleaks/gitleaks + rev: v8.16.3 + hooks: + - id: gitleaks +- repo: https://github.com/golangci/golangci-lint + rev: v1.52.2 + hooks: + - id: golangci-lint +- repo: https://github.com/jumanjihouse/pre-commit-hooks + rev: 3.0.0 + hooks: + - id: shellcheck +- repo: https://github.com/pocc/pre-commit-hooks + rev: v1.3.5 + hooks: + - id: cpplint +- repo: https://github.com/pre-commit/mirrors-eslint + rev: v8.38.0 + hooks: + - id: eslint +- repo: https://github.com/pre-commit/pre-commit-hooks + rev: v4.4.0 + hooks: + - id: end-of-file-fixer + - id: trailing-whitespace +- repo: https://github.com/pylint-dev/pylint + rev: v2.17.2 + hooks: + - id: pylint diff --git a/product-mini/platforms/zephyr/simple/Dockerfile b/product-mini/platforms/zephyr/simple/Dockerfile index 73171cfea7..8b12e5e347 100644 --- a/product-mini/platforms/zephyr/simple/Dockerfile +++ b/product-mini/platforms/zephyr/simple/Dockerfile @@ -19,7 +19,7 @@ # If you modify this file, you may need to sync the modifications to the # .github/actions/setup-zephyr/action.yml -FROM ghcr.io/zephyrproject-rtos/ci-base:v0.26-branch +FROM ghcr.io/zephyrproject-rtos/ci-base:v0.26-branch@sha256:12f44f069809167ed9d3f1160ca0dbb5a5e9118df37f78092f790b29fb06d962 ARG DEBIAN_FRONTEND=noninteractive ENV TZ=Asian/Shanghai diff --git a/test-tools/wamr-ide/WASM-Debug-Server/Docker/Dockerfile b/test-tools/wamr-ide/WASM-Debug-Server/Docker/Dockerfile index 8165bd5f5f..08f94366a7 100644 --- a/test-tools/wamr-ide/WASM-Debug-Server/Docker/Dockerfile +++ b/test-tools/wamr-ide/WASM-Debug-Server/Docker/Dockerfile @@ -1,7 +1,7 @@ # Copyright (C) 2019 Intel Corporation. All rights reserved. # SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -FROM gcc:12.2.0 AS BASE +FROM gcc:12.2.0@sha256:a3e091325c0af43bc9c1c576ddd155351d5b16438124421188bb4b4fcacc1452 AS BASE ## set work directory WORKDIR /root/ @@ -21,7 +21,7 @@ RUN cmake .. -DWAMR_BUILD_DEBUG_INTERP=1 \ && cp /root/wasm-micro-runtime/product-mini/platforms/linux/build/iwasm /root/iwasm \ && rm -fr /root/wasm-micro-runtime -FROM ubuntu:22.04 +FROM ubuntu:22.04@sha256:104ae83764a5119017b8e8d6218fa0832b09df65aae7d5a6de29a85d813da2fb # COPY files from BASE image COPY --from=BASE /root/iwasm /root COPY --from=BASE /root/debug.sh /root diff --git a/test-tools/wamr-ide/WASM-Toolchain/Docker/Dockerfile b/test-tools/wamr-ide/WASM-Toolchain/Docker/Dockerfile index cd8da38d91..335122b8cd 100644 --- a/test-tools/wamr-ide/WASM-Toolchain/Docker/Dockerfile +++ b/test-tools/wamr-ide/WASM-Toolchain/Docker/Dockerfile @@ -2,7 +2,7 @@ # SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception ## Build docker image that consists of gcc, cmake, wasi-sdk & zephyr sdk -FROM gcc:12.2.0 AS BASE +FROM gcc:12.2.0@sha256:a3e091325c0af43bc9c1c576ddd155351d5b16438124421188bb4b4fcacc1452 AS BASE ## set work directory WORKDIR /root/ @@ -48,7 +48,7 @@ RUN cmake .. \ && rm -fr /root/wasm-micro-runtime # ## STAGE 2 -FROM ubuntu:22.04 +FROM ubuntu:22.04@sha256:104ae83764a5119017b8e8d6218fa0832b09df65aae7d5a6de29a85d813da2fb ENV HOME_DIR=/home/wasm-toolchain RUN mkdir -p /opt/wasi-sdk \ diff --git a/tests/fuzz/wasm-mutator-fuzz/portal/Dockerfile b/tests/fuzz/wasm-mutator-fuzz/portal/Dockerfile index 877f479115..cd67b88464 100644 --- a/tests/fuzz/wasm-mutator-fuzz/portal/Dockerfile +++ b/tests/fuzz/wasm-mutator-fuzz/portal/Dockerfile @@ -1,4 +1,4 @@ -FROM node:16 as builder +FROM node:16@sha256:f77a1aef2da8d83e45ec990f45df50f1a286c5fe8bbfb8c6e4246c6389705c0b as builder WORKDIR /portal COPY . . @@ -13,7 +13,7 @@ RUN npm install && chmod +x node_modules/.bin/tsc \ && chmod +x node_modules/.bin/vite \ && npm run build -FROM nginx:alpine +FROM nginx:alpine@sha256:b3c656d55d7ad751196f21b7fd2e8d4da9cb430e32f646adcf92441b72f82b14 WORKDIR /portal COPY --from=builder /portal/dist/ /usr/share/nginx/html/ RUN rm /etc/nginx/conf.d/default.conf diff --git a/tests/fuzz/wasm-mutator-fuzz/server/Dockerfile b/tests/fuzz/wasm-mutator-fuzz/server/Dockerfile index 881bce3be2..10bddcf5a4 100644 --- a/tests/fuzz/wasm-mutator-fuzz/server/Dockerfile +++ b/tests/fuzz/wasm-mutator-fuzz/server/Dockerfile @@ -1,4 +1,4 @@ -FROM ubuntu:20.04 +FROM ubuntu:20.04@sha256:8feb4d8ca5354def3d8fce243717141ce31e2c428701f6682bd2fafe15388214 WORKDIR /wamr-test/tests/fuzz/wasm-mutator-fuzz/server COPY ./tests/fuzz/wasm-mutator-fuzz/server/requirements.txt /requirements.txt