What changed, and why it matters
This commit adds a new graphical simulator for the BitBox02 hardware wallet using the LVGL UI library. It is a large development-only change that introduces simulator code, vendored Rust dependencies, and build configuration updates. There is no indication it fixes a security bug or introduces a security vulnerability in the firmware itself.
No security action required. Treat as normal development/QA infrastructure change. Review simulator code for correctness and supply-chain trust of vendored crates during routine audit, but this commit does not present a security issue.
Security signals we found
No strong security signals were identified.
Evidence from the diff
The commit ‘simulator: LVGL init’ initializes a graphical simulator for the BitBox02 device. It adds an LVGL submodule, new Rust crates (bitbox-lvgl-sys, bitbox-lvgl, bitbox03 simulator modules), a simulator test binary, and vendored third-party Rust crates (cmake, crc32fast, log, num_enum, png-decoder, rustversion, tracing, tracing-core). The Makefile is updated to clean the Rust target directory. The changes are build/test infrastructure and simulator UI code, not firmware security fixes or runtime security changes.
Changed components
simulatorexternal/lvglsrc/rust/bitbox-lvgl-syssrc/rust/bitbox-lvglsrc/rust/bitbox03test/simulator-graphical-bb03external/vendor/*Inspect captured patch +109811 / −108
diff --git a/.gitmodules b/.gitmodules
index 1fd61b4..5bafc55 100644
--- a/.gitmodules
+++ b/.gitmodules
@@ -13,3 +13,6 @@
[submodule "src/rust/bitbox-secp256k1/depend/secp256k1-zkp"]
path = src/rust/bitbox-secp256k1/depend/secp256k1-zkp
url = https://github.com/BitBoxSwiss/secp256k1-zkp.git
+[submodule "external/lvgl"]
+ path = external/lvgl
+ url = https://github.com/BitBoxSwiss/lvgl
diff --git a/Makefile b/Makefile
index 9bf7c67..32356a2 100644
--- a/Makefile
+++ b/Makefile
@@ -180,7 +180,7 @@ prepare-tidy: | build build-build
$(MAKE) -C build rust-cbindgen
$(MAKE) -C build-build rust-cbindgen
clean:
- rm -rf build build-build build-debug build-build-noasan
+ rm -rf build build-build build-debug build-build-noasan src/rust/target
# When you vendor rust libs avoid duplicates
vendor-rust-deps:
diff --git a/external/vendor/cmake/.cargo-checksum.json b/external/vendor/cmake/.cargo-checksum.json
new file mode 100644
index 0000000..c3f7e70
--- /dev/null
+++ b/external/vendor/cmake/.cargo-checksum.json
@@ -0,0 +1 @@
+{"files":{".cargo_vcs_info.json":"df350497fbe889272d120e403f3be3d1dd8b69d84827e7a4e539ab2f4dd1f544",".github/dependabot.yml":"d04c9b0253b2bbae886b59a11399ea260397b460cd9f5712d692d1c85f8ec090",".github/workflows/main.yml":"46ce9367bb4cdeec903b2274b32339d5e8399ed3afa5f6dacd5ae55d7afa8443",".github/workflows/publish.yml":"7125d7f9471bfb8c4e3768cdb94f8e046914a6dc74b4f60ed42c8a0dc950739f",".release-plz.toml":"2a4f7567c3f1fc47377888514276612130b6998f4a30a165891e6a8d2f57b6c3","CHANGELOG.md":"bdaa1449bc2298828849d2faa6e459f28fe5eaa3838c77412bf5abd9b45f7bdd","Cargo.lock":"5d6509cdd18c0011e0a3230e30654b2f67baf4e85706775478e3f44bd387d2a0","Cargo.toml":"a7a284f3f7a1613137b4103b5866d5ac0dc29aac58ef2ad8528f5a65405601fd","Cargo.toml.orig":"44cce6aaf504ce10a5c8bc0e3326a021ac2c1650d5ac45588b3c046b489cfc0c","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"378f5840b258e2779c39418f3f2d7b2ba96f1c7917dd6be0713f88305dbda397","README.md":"7bdc22c92fda3b54f01aab154e4897e441816ff7473127ab5ddeb203f870aa7a","src/lib.rs":"e7bd0089c62b73fa193b2843005c2ee9787dad2c88f9ed87ebf9e8554cae84dc"},"package":"e7caa3f9de89ddbe2c607f4101924c5abec803763ae9534e4f4d7d8f84aa81f0"}
\ No newline at end of file
diff --git a/external/vendor/cmake/.cargo_vcs_info.json b/external/vendor/cmake/.cargo_vcs_info.json
new file mode 100644
index 0000000..514d63e
--- /dev/null
+++ b/external/vendor/cmake/.cargo_vcs_info.json
@@ -0,0 +1,6 @@
+{
+ "git": {
+ "sha1": "fd56c5a6b4ecda8815c863eb5b12d7b3f0391197"
+ },
+ "path_in_vcs": ""
+}
\ No newline at end of file
diff --git a/external/vendor/cmake/.github/dependabot.yml b/external/vendor/cmake/.github/dependabot.yml
new file mode 100644
index 0000000..7377d37
--- /dev/null
+++ b/external/vendor/cmake/.github/dependabot.yml
@@ -0,0 +1,8 @@
+version: 2
+updates:
+- package-ecosystem: cargo
+ directory: "/"
+ schedule:
+ interval: daily
+ time: "08:00"
+ open-pull-requests-limit: 10
diff --git a/external/vendor/cmake/.github/workflows/main.yml b/external/vendor/cmake/.github/workflows/main.yml
new file mode 100644
index 0000000..67ff451
--- /dev/null
+++ b/external/vendor/cmake/.github/workflows/main.yml
@@ -0,0 +1,156 @@
+name: CI
+on: [push, pull_request]
+
+env:
+ RUSTDOCFLAGS: -D warnings
+ RUSTFLAGS: -D warnings
+
+jobs:
+ clippy:
+ name: clippy
+ runs-on: ubuntu-latest
+ steps:
+ - uses: actions/checkout@v4
+ - name: Install Rust
+ run: |
+ rustup update beta --no-self-update
+ rustup default beta
+ rustup component add clippy
+ - uses: Swatinem/rust-cache@v2
+ - run: cargo clippy --all-features --all-targets -- -D warnings
+
+ test:
+ name: Test
+ runs-on: ${{ matrix.os }}
+ strategy:
+ matrix:
+ os: [ubuntu-latest, macos-latest, windows-latest]
+ rust: ["1.70", stable, beta, nightly]
+ steps:
+ - uses: actions/checkout@v4
+ - name: Install Rust
+ run: |
+ rustup update ${{ matrix.rust }} --no-self-update
+ rustup default ${{ matrix.rust }}
+ - uses: Swatinem/rust-cache@v2
+ - run: cargo test
+ - name: Integration test
+ run: cargo test --manifest-path test-crate/Cargo.toml
+
+ cross_compile_test:
+ name: Test Cross Compile - ${{ matrix.platform.target }}
+ needs: [ test ]
+ runs-on: ubuntu-latest
+ strategy:
+ fail-fast: false
+ matrix:
+ platform:
+ # Testable
+ - target: aarch64-unknown-linux-gnu
+ test: true
+ - target: arm-unknown-linux-gnueabihf
+ test: true
+ - target: powerpc-unknown-linux-gnu
+ test: true
+ - target: s390x-unknown-linux-gnu
+ test: true
+ - target: x86_64-unknown-linux-musl
+ test: true
+ - target: aarch64-unknown-linux-musl
+ test: true
+ # Build only
+ - target: x86_64-pc-solaris
+ test: false
+ - target: x86_64-pc-windows-gnu
+ test: false
+ # FIXME: build fails, see <https://github.com/rust-lang/cmake-rs/issues/211>
+ # - target: x86_64-unknown-freebsd
+ # test: false
+ - target: x86_64-unknown-netbsd
+ test: false
+ - target: x86_64-unknown-illumos
+ test: false
+ steps:
+ - uses: actions/checkout@master
+ - name: Install Rust
+ run: |
+ rustup update stable --no-self-update
+ rustup default stable
+ rustup target add ${{ matrix.platform.target }}
+ - uses: taiki-e/install-action@v2
+ with:
+ tool: cross
+ - uses: Swatinem/rust-cache@v2
+ - name: cross test
+ run: cross test -vv --target ${{ matrix.platform.target }}
+ working-directory: test-crate
+ if: ${{ matrix.platform.test }}
+ - name: cross build
+ run: cross build -vv --target ${{ matrix.platform.target }}
+ working-directory: test-crate
+ if: ${{ !matrix.platform.test }}
+
+ ios_cross_compile_test:
+ name: Test Cross Compile - ${{ matrix.platform.target }}
+ needs: [ test ]
+ runs-on: macos-latest
+ strategy:
+ fail-fast: false
+ matrix:
+ platform:
+ - target: aarch64-apple-ios
+ steps:
+ - uses: actions/checkout@v4
+ - name: Install Rust
+ run: |
+ rustup update stable --no-self-update
+ rustup default stable
+ rustup target add ${{ matrix.platform.target }}
+ - uses: Swatinem/rust-cache@v2
+ - name: build
+ run: cargo build -vv --target ${{ matrix.platform.target }}
+ working-directory: test-crate
+ env:
+ # If this isn't specified the default is iOS 7, for which zlib-ng will not compile due to the lack of thread-local storage.
+ IPHONEOS_DEPLOYMENT_TARGET: 16
+
+ rustfmt:
+ name: Rustfmt
+ runs-on: ubuntu-latest
+ steps:
+ - uses: actions/checkout@master
+ - name: Install Rust
+ run: |
+ rustup update stable --no-self-update
+ rustup default stable
+ rustup component add rustfmt
+ - run: cargo fmt --all -- --check
+
+ doc:
+ name: docs
+ runs-on: ubuntu-latest
+ steps:
+ - uses: actions/checkout@v4
+ - run: |
+ rustup update nightly --no-self-update
+ rustup default nightly
+ - uses: Swatinem/rust-cache@v2
+ - run: cargo doc
+
+ success:
+ needs:
+ - clippy
+ - test
+ - cross_compile_test
+ - ios_cross_compile_test
+ - rustfmt
+ - doc
+ runs-on: ubuntu-latest
+ # GitHub branch protection is exceedingly silly and treats "jobs skipped because a dependency
+ # failed" as success. So we have to do some contortions to ensure the job fails if any of its
+ # dependencies fails.
+ if: always() # make sure this is never "skipped"
+ steps:
+ # Manually check the status of all dependencies. `if: failure()` does not work.
+ - name: check if any dependency failed
+ run: jq --exit-status 'all(.result == "success")' <<< '${{ toJson(needs) }}'
diff --git a/external/vendor/cmake/.github/workflows/publish.yml b/external/vendor/cmake/.github/workflows/publish.yml
new file mode 100644
index 0000000..c492e66
--- /dev/null
+++ b/external/vendor/cmake/.github/workflows/publish.yml
@@ -0,0 +1,27 @@
+name: Release-plz
+
+permissions:
+ pull-requests: write
+ contents: write
+
+on:
+ push:
+ branches:
+ - master
+
+jobs:
+ release-plz:
+ name: Release-plz
+ runs-on: ubuntu-latest
+ steps:
+ - name: Checkout repository
+ uses: actions/checkout@v4
+ with:
+ fetch-depth: 0
+ - name: Install Rust (rustup)
+ run: rustup update stable --no-self-update && rustup default stable
+ - name: Run release-plz
+ uses: MarcoIeni/release-plz-action@v0.5
+ env:
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+ CARGO_REGISTRY_TOKEN: ${{ secrets.CARGO_REGISTRY_TOKEN }}
diff --git a/external/vendor/cmake/.release-plz.toml b/external/vendor/cmake/.release-plz.toml
new file mode 100644
index 0000000..8868315
--- /dev/null
+++ b/external/vendor/cmake/.release-plz.toml
@@ -0,0 +1,2 @@
+[workspace]
+git_tag_name = "v{{ version }}"
diff --git a/external/vendor/cmake/CHANGELOG.md b/external/vendor/cmake/CHANGELOG.md
new file mode 100644
index 0000000..59d78bc
--- /dev/null
+++ b/external/vendor/cmake/CHANGELOG.md
@@ -0,0 +1,39 @@
+# Changelog
+
+## [Unreleased]
+
+## [0.1.54](https://github.com/rust-lang/cmake-rs/compare/v0.1.53...v0.1.54) - 2025-02-10
+
+### Other
+
+- Remove workaround for broken `cc-rs` versions ([#235](https://github.com/rust-lang/cmake-rs/pull/235))
+- Be more precise in the description of `register_dep` ([#238](https://github.com/rust-lang/cmake-rs/pull/238))
+
+## [0.1.53](https://github.com/rust-lang/cmake-rs/compare/v0.1.52...v0.1.53) - 2025-01-27
+
+### Other
+
+- Disable broken Make jobserver support on OSX to fix parallel builds ([#229](https://github.com/rust-lang/cmake-rs/pull/229))
+
+## [0.1.52](https://github.com/rust-lang/cmake-rs/compare/v0.1.51...v0.1.52) - 2024-11-25
+
+### Other
+
+- Expose cc-rs no_default_flags for hassle-free cross-compilation ([#225](https://github.com/rust-lang/cmake-rs/pull/225))
+- Add a `success` job to CI
+- Change `--build` to use an absolute path
+- Merge pull request [#195](https://github.com/rust-lang/cmake-rs/pull/195) from meowtec/feat/improve-fail-hint
+- Improve hint for cmake not installed in Linux (code 127)
+
+## [0.1.51](https://github.com/rust-lang/cmake-rs/compare/v0.1.50...v0.1.51) - 2024-08-15
+
+### Added
+
+- Add JOM generator support ([#183](https://github.com/rust-lang/cmake-rs/pull/183))
+- Improve visionOS support ([#209](https://github.com/rust-lang/cmake-rs/pull/209))
+- Use `Generic` for bare-metal systems ([#187](https://github.com/rust-lang/cmake-rs/pull/187))
+
+### Fixed
+
+- Fix cross compilation on android armv7 and x86 ([#186](https://github.com/rust-lang/cmake-rs/pull/186))
+
diff --git a/external/vendor/cmake/Cargo.lock b/external/vendor/cmake/Cargo.lock
new file mode 100644
index 0000000..03f6392
--- /dev/null
+++ b/external/vendor/cmake/Cargo.lock
@@ -0,0 +1,25 @@
+# This file is automatically @generated by Cargo.
+# It is not intended for manual editing.
+version = 4
+
+[[package]]
+name = "cc"
+version = "1.2.13"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c7777341816418c02e033934a09f20dc0ccaf65a5201ef8a450ae0105a573fda"
+dependencies = [
+ "shlex",
+]
+
+[[package]]
+name = "cmake"
+version = "0.1.54"
+dependencies = [
+ "cc",
+]
+
+[[package]]
+name = "shlex"
+version = "1.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64"
diff --git a/external/vendor/cmake/Cargo.toml b/external/vendor/cmake/Cargo.toml
new file mode 100644
index 0000000..16b9604
--- /dev/null
+++ b/external/vendor/cmake/Cargo.toml
@@ -0,0 +1,39 @@
+# THIS FILE IS AUTOMATICALLY GENERATED BY CARGO
+#
+# When uploading crates to the registry Cargo will automatically
+# "normalize" Cargo.toml files for maximal compatibility
+# with all versions of Cargo and also rewrite `path` dependencies
+# to registry (e.g., crates.io) dependencies.
+#
+# If you are reading this file be aware that the original Cargo.toml
+# will likely look very different (and much more reasonable).
+# See Cargo.toml.orig for the original contents.
+
+[package]
+edition = "2021"
+name = "cmake"
+version = "0.1.54"
+authors = ["Alex Crichton <alex@alexcrichton.com>"]
+build = false
+autolib = false
+autobins = false
+autoexamples = false
+autotests = false
+autobenches = false
+description = """
+A build dependency for running `cmake` to build a native library
+"""
+homepage = "https://github.com/rust-lang/cmake-rs"
+documentation = "https://docs.rs/cmake"
+readme = "README.md"
+keywords = ["build-dependencies"]
+categories = ["development-tools::build-utils"]
+license = "MIT OR Apache-2.0"
+repository = "https://github.com/rust-lang/cmake-rs"
+
+[lib]
+name = "cmake"
+path = "src/lib.rs"
+
+[dependencies.cc]
+version = "1.1.0"
diff --git a/external/vendor/cmake/Cargo.toml.orig b/external/vendor/cmake/Cargo.toml.orig
new file mode 100644
index 0000000..7d4d9fc
--- /dev/null
+++ b/external/vendor/cmake/Cargo.toml.orig
@@ -0,0 +1,18 @@
+[package]
+name = "cmake"
+version = "0.1.54"
+authors = ["Alex Crichton <alex@alexcrichton.com>"]
+license = "MIT OR Apache-2.0"
+readme = "README.md"
+keywords = ["build-dependencies"]
+repository = "https://github.com/rust-lang/cmake-rs"
+homepage = "https://github.com/rust-lang/cmake-rs"
+documentation = "https://docs.rs/cmake"
+description = """
+A build dependency for running `cmake` to build a native library
+"""
+categories = ["development-tools::build-utils"]
+edition = "2021"
+
+[dependencies]
+cc = "1.1.0"
diff --git a/external/vendor/cmake/LICENSE-APACHE b/external/vendor/cmake/LICENSE-APACHE
new file mode 100644
index 0000000..16fe87b
--- /dev/null
+++ b/external/vendor/cmake/LICENSE-APACHE
@@ -0,0 +1,201 @@
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+END OF TERMS AND CONDITIONS
+
+APPENDIX: How to apply the Apache License to your work.
+
+ To apply the Apache License to your work, attach the following
+ boilerplate notice, with the fields enclosed by brackets "[]"
+ replaced with your own identifying information. (Don't include
+ the brackets!) The text should be enclosed in the appropriate
+ comment syntax for the file format. We also recommend that a
+ file or class name and description of purpose be included on the
+ same "printed page" as the copyright notice for easier
+ identification within third-party archives.
+
+Copyright [yyyy] [name of copyright owner]
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
diff --git a/external/vendor/cmake/LICENSE-MIT b/external/vendor/cmake/LICENSE-MIT
new file mode 100644
index 0000000..39e0ed6
--- /dev/null
+++ b/external/vendor/cmake/LICENSE-MIT
@@ -0,0 +1,25 @@
+Copyright (c) 2014 Alex Crichton
+
+Permission is hereby granted, free of charge, to any
+person obtaining a copy of this software and associated
+documentation files (the "Software"), to deal in the
+Software without restriction, including without
+limitation the rights to use, copy, modify, merge,
+publish, distribute, sublicense, and/or sell copies of
+the Software, and to permit persons to whom the Software
+is furnished to do so, subject to the following
+conditions:
+
+The above copyright notice and this permission notice
+shall be included in all copies or substantial portions
+of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF
+ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
+TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
+PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
+SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR
+IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+DEALINGS IN THE SOFTWARE.
diff --git a/external/vendor/cmake/README.md b/external/vendor/cmake/README.md
new file mode 100644
index 0000000..fd51bee
--- /dev/null
+++ b/external/vendor/cmake/README.md
@@ -0,0 +1,32 @@
+# cmake
+
+[Documentation](https://docs.rs/cmake)
+
+A build dependency for running the `cmake` build tool to compile a native
+library.
+
+```toml
+# Cargo.toml
+[build-dependencies]
+cmake = "0.1"
+```
+
+The CMake executable is assumed to be `cmake` unless the `CMAKE`
+environmental variable is set.
+
+# License
+
+This project is licensed under either of
+
+ * Apache License, Version 2.0, ([LICENSE-APACHE](LICENSE-APACHE) or
+ https://www.apache.org/licenses/LICENSE-2.0)
+ * MIT license ([LICENSE-MIT](LICENSE-MIT) or
+ https://opensource.org/licenses/MIT)
+
+at your option.
+
+### Contribution
+
+Unless you explicitly state otherwise, any contribution intentionally submitted
+for inclusion in cmake by you, as defined in the Apache-2.0 license, shall be
+dual licensed as above, without any additional terms or conditions.
diff --git a/external/vendor/cmake/src/lib.rs b/external/vendor/cmake/src/lib.rs
new file mode 100644
index 0000000..57d4a43
--- /dev/null
+++ b/external/vendor/cmake/src/lib.rs
@@ -0,0 +1,1160 @@
+//! A build dependency for running `cmake` to build a native library
+//!
+//! This crate provides some necessary boilerplate and shim support for running
+//! the system `cmake` command to build a native library. It will add
+//! appropriate cflags for building code to link into Rust, handle cross
+//! compilation, and use the necessary generator for the platform being
+//! targeted.
+//!
+//! The builder-style configuration allows for various variables and such to be
+//! passed down into the build as well.
+//!
+//! ## Installation
+//!
+//! Add this to your `Cargo.toml`:
+//!
+//! ```toml
+//! [build-dependencies]
+//! cmake = "0.1"
+//! ```
+//!
+//! ## Examples
+//!
+//! ```no_run
+//! use cmake;
+//!
+//! // Builds the project in the directory located in `libfoo`, installing it
+//! // into $OUT_DIR
+//! let dst = cmake::build("libfoo");
+//!
+//! println!("cargo:rustc-link-search=native={}", dst.display());
+//! println!("cargo:rustc-link-lib=static=foo");
+//! ```
+//!
+//! ```no_run
+//! use cmake::Config;
+//!
+//! let dst = Config::new("libfoo")
+//! .define("FOO", "BAR")
+//! .cflag("-foo")
+//! .build();
+//! println!("cargo:rustc-link-search=native={}", dst.display());
+//! println!("cargo:rustc-link-lib=static=foo");
+//! ```
+
+#![deny(missing_docs)]
+
+extern crate cc;
+
+use std::collections::HashMap;
+use std::env;
+use std::ffi::{OsStr, OsString};
+use std::fs::{self, File};
+use std::io::prelude::*;
+use std::io::ErrorKind;
+use std::path::{Path, PathBuf};
+use std::process::Command;
+
+/// Builder style configuration for a pending CMake build.
+pub struct Config {
+ path: PathBuf,
+ generator: Option<OsString>,
+ generator_toolset: Option<OsString>,
+ cflags: OsString,
+ cxxflags: OsString,
+ asmflags: OsString,
+ defines: Vec<(OsString, OsString)>,
+ deps: Vec<String>,
+ target: Option<String>,
+ host: Option<String>,
+ out_dir: Option<PathBuf>,
+ profile: Option<String>,
+ configure_args: Vec<OsString>,
+ build_args: Vec<OsString>,
+ cmake_target: Option<String>,
+ env: Vec<(OsString, OsString)>,
+ static_crt: Option<bool>,
+ uses_cxx11: bool,
+ always_configure: bool,
+ no_build_target: bool,
+ no_default_flags: bool,
+ verbose_cmake: bool,
+ verbose_make: bool,
+ pic: Option<bool>,
+ c_cfg: Option<cc::Build>,
+ cxx_cfg: Option<cc::Build>,
+ env_cache: HashMap<String, Option<OsString>>,
+}
+
+/// Builds the native library rooted at `path` with the default cmake options.
+/// This will return the directory in which the library was installed.
+///
+/// # Examples
+///
+/// ```no_run
+/// use cmake;
+///
+/// // Builds the project in the directory located in `libfoo`, installing it
+/// // into $OUT_DIR
+/// let dst = cmake::build("libfoo");
+///
+/// println!("cargo:rustc-link-search=native={}", dst.display());
+/// println!("cargo:rustc-link-lib=static=foo");
+/// ```
+///
+pub fn build<P: AsRef<Path>>(path: P) -> PathBuf {
+ Config::new(path.as_ref()).build()
+}
+
+impl Config {
+ /// Return explicitly set profile or infer `CMAKE_BUILD_TYPE` from Rust's compilation profile.
+ ///
+ /// * if `opt-level=0` then `CMAKE_BUILD_TYPE=Debug`,
+ /// * if `opt-level={1,2,3}` and:
+ /// * `debug=false` then `CMAKE_BUILD_TYPE=Release`
+ /// * otherwise `CMAKE_BUILD_TYPE=RelWithDebInfo`
+ /// * if `opt-level={s,z}` then `CMAKE_BUILD_TYPE=MinSizeRel`
+ pub fn get_profile(&self) -> &str {
+ if let Some(profile) = self.profile.as_ref() {
+ profile
+ } else {
+ // Determine Rust's profile, optimization level, and debug info:
+ #[derive(PartialEq)]
+ enum RustProfile {
+ Debug,
+ Release,
+ }
+ #[derive(PartialEq, Debug)]
+ enum OptLevel {
+ Debug,
+ Release,
+ Size,
+ }
+
+ let rust_profile = match &getenv_unwrap("PROFILE")[..] {
+ "debug" => RustProfile::Debug,
+ "release" | "bench" => RustProfile::Release,
+ unknown => {
+ eprintln!(
+ "Warning: unknown Rust profile={}; defaulting to a release build.",
+ unknown
+ );
+ RustProfile::Release
+ }
+ };
+
+ let opt_level = match &getenv_unwrap("OPT_LEVEL")[..] {
+ "0" => OptLevel::Debug,
+ "1" | "2" | "3" => OptLevel::Release,
+ "s" | "z" => OptLevel::Size,
+ unknown => {
+ let default_opt_level = match rust_profile {
+ RustProfile::Debug => OptLevel::Debug,
+ RustProfile::Release => OptLevel::Release,
+ };
+ eprintln!(
+ "Warning: unknown opt-level={}; defaulting to a {:?} build.",
+ unknown, default_opt_level
+ );
+ default_opt_level
+ }
+ };
+
+ let debug_info: bool = match &getenv_unwrap("DEBUG")[..] {
+ "false" => false,
+ "true" => true,
+ unknown => {
+ eprintln!("Warning: unknown debug={}; defaulting to `true`.", unknown);
+ true
+ }
+ };
+
+ match (opt_level, debug_info) {
+ (OptLevel::Debug, _) => "Debug",
+ (OptLevel::Release, false) => "Release",
+ (OptLevel::Release, true) => "RelWithDebInfo",
+ (OptLevel::Size, _) => "MinSizeRel",
+ }
+ }
+ }
+
+ /// Creates a new blank set of configuration to build the project specified
+ /// at the path `path`.
+ pub fn new<P: AsRef<Path>>(path: P) -> Config {
+ Config {
+ path: env::current_dir().unwrap().join(path),
+ generator: None,
+ generator_toolset: None,
+ no_default_flags: false,
+ cflags: OsString::new(),
+ cxxflags: OsString::new(),
+ asmflags: OsString::new(),
+ defines: Vec::new(),
+ deps: Vec::new(),
+ profile: None,
+ out_dir: None,
+ target: None,
+ host: None,
+ configure_args: Vec::new(),
+ build_args: Vec::new(),
+ cmake_target: None,
+ env: Vec::new(),
+ static_crt: None,
+ uses_cxx11: false,
+ always_configure: true,
+ no_build_target: false,
+ verbose_cmake: false,
+ verbose_make: false,
+ pic: None,
+ c_cfg: None,
+ cxx_cfg: None,
+ env_cache: HashMap::new(),
+ }
+ }
+
+ /// Sets flag for PIC. Otherwise use cc::Build platform default
+ pub fn pic(&mut self, explicit_flag: bool) -> &mut Config {
+ self.pic = Some(explicit_flag);
+ self
+ }
+
+ /// Sets the build-tool generator (`-G`) for this compilation.
+ ///
+ /// If unset, this crate will use the `CMAKE_GENERATOR` environment variable
+ /// if set. Otherwise, it will guess the best generator to use based on the
+ /// build target.
+ pub fn generator<T: AsRef<OsStr>>(&mut self, generator: T) -> &mut Config {
+ self.generator = Some(generator.as_ref().to_owned());
+ self
+ }
+
+ /// Sets the toolset name (-T) if supported by generator.
+ /// Can be used to compile with Clang/LLVM instead of msvc when Visual Studio generator is selected.
+ ///
+ /// If unset, will use the default toolset of the selected generator.
+ pub fn generator_toolset<T: AsRef<OsStr>>(&mut self, toolset_name: T) -> &mut Config {
+ self.generator_toolset = Some(toolset_name.as_ref().to_owned());
+ self
+ }
+
+ /// Adds a custom flag to pass down to the C compiler, supplementing those
+ /// that this library already passes.
+ pub fn cflag<P: AsRef<OsStr>>(&mut self, flag: P) -> &mut Config {
+ self.cflags.push(" ");
+ self.cflags.push(flag.as_ref());
+ self
+ }
+
+ /// Adds a custom flag to pass down to the C++ compiler, supplementing those
+ /// that this library already passes.
+ pub fn cxxflag<P: AsRef<OsStr>>(&mut self, flag: P) -> &mut Config {
+ self.cxxflags.push(" ");
+ self.cxxflags.push(flag.as_ref());
+ self
+ }
+
+ /// Adds a custom flag to pass down to the ASM compiler, supplementing those
+ /// that this library already passes.
+ pub fn asmflag<P: AsRef<OsStr>>(&mut self, flag: P) -> &mut Config {
+ self.asmflags.push(" ");
+ self.asmflags.push(flag.as_ref());
+ self
+ }
+
+ /// Adds a new `-D` flag to pass to cmake during the generation step.
+ pub fn define<K, V>(&mut self, k: K, v: V) -> &mut Config
+ where
+ K: AsRef<OsStr>,
+ V: AsRef<OsStr>,
+ {
+ self.defines
+ .push((k.as_ref().to_owned(), v.as_ref().to_owned()));
+ self
+ }
+
+ /// Registers a dependency for this compilation on the native library built
+ /// by Cargo previously.
+ ///
+ /// This registration will update the `CMAKE_PREFIX_PATH` environment
+ /// variable for the [`build`][Self::build] system generation step. The
+ /// path will be updated to include the content of the environment
+ /// variable `DEP_XXX_ROOT`, where `XXX` is replaced with the uppercased
+ /// value of `dep` (if that variable exists).
+ pub fn register_dep(&mut self, dep: &str) -> &mut Config {
+ self.deps.push(dep.to_string());
+ self
+ }
+
+ /// Sets the target triple for this compilation.
+ ///
+ /// This is automatically scraped from `$TARGET` which is set for Cargo
+ /// build scripts so it's not necessary to call this from a build script.
+ pub fn target(&mut self, target: &str) -> &mut Config {
+ self.target = Some(target.to_string());
+ self
+ }
+
+ /// Disables the cmake target option for this compilation.
+ ///
+ /// Note that this isn't related to the target triple passed to the compiler!
+ pub fn no_build_target(&mut self, no_build_target: bool) -> &mut Config {
+ self.no_build_target = no_build_target;
+ self
+ }
+
+ /// Disables the generation of default compiler flags. The default compiler
+ /// flags may cause conflicts in some cross compiling scenarios.
+ pub fn no_default_flags(&mut self, no_default_flags: bool) -> &mut Config {
+ self.no_default_flags = no_default_flags;
+ self
+ }
+
+ /// Sets the host triple for this compilation.
+ ///
+ /// This is automatically scraped from `$HOST` which is set for Cargo
+ /// build scripts so it's not necessary to call this from a build script.
+ pub fn host(&mut self, host: &str) -> &mut Config {
+ self.host = Some(host.to_string());
+ self
+ }
+
+ /// Sets the output directory for this compilation.
+ ///
+ /// This is automatically scraped from `$OUT_DIR` which is set for Cargo
+ /// build scripts so it's not necessary to call this from a build script.
+ pub fn out_dir<P: AsRef<Path>>(&mut self, out: P) -> &mut Config {
+ self.out_dir = Some(out.as_ref().to_path_buf());
+ self
+ }
+
+ /// Sets the `CMAKE_BUILD_TYPE=build_type` variable.
+ ///
+ /// By default, this value is automatically inferred from Rust's compilation
+ /// profile as follows:
+ ///
+ /// * if `opt-level=0` then `CMAKE_BUILD_TYPE=Debug`,
+ /// * if `opt-level={1,2,3}` and:
+ /// * `debug=false` then `CMAKE_BUILD_TYPE=Release`
+ /// * otherwise `CMAKE_BUILD_TYPE=RelWithDebInfo`
+ /// * if `opt-level={s,z}` then `CMAKE_BUILD_TYPE=MinSizeRel`
+ pub fn profile(&mut self, profile: &str) -> &mut Config {
+ self.profile = Some(profile.to_string());
+ self
+ }
+
+ /// Configures whether the /MT flag or the /MD flag will be passed to msvc build tools.
+ ///
+ /// This option defaults to `false`, and affect only msvc targets.
+ pub fn static_crt(&mut self, static_crt: bool) -> &mut Config {
+ self.static_crt = Some(static_crt);
+ self
+ }
+
+ /// Add an argument to the `cmake` configure step
+ pub fn configure_arg<A: AsRef<OsStr>>(&mut self, arg: A) -> &mut Config {
+ self.configure_args.push(arg.as_ref().to_owned());
+ self
+ }
+
+ /// Add an argument to the final `cmake` build step
+ pub fn build_arg<A: AsRef<OsStr>>(&mut self, arg: A) -> &mut Config {
+ self.build_args.push(arg.as_ref().to_owned());
+ self
+ }
+
+ /// Configure an environment variable for the `cmake` processes spawned by
+ /// this crate in the `build` step.
+ pub fn env<K, V>(&mut self, key: K, value: V) -> &mut Config
+ where
+ K: AsRef<OsStr>,
+ V: AsRef<OsStr>,
+ {
+ self.env
+ .push((key.as_ref().to_owned(), value.as_ref().to_owned()));
+ self
+ }
+
+ /// Sets the build target for the final `cmake` build step, this will
+ /// default to "install" if not specified.
+ pub fn build_target(&mut self, target: &str) -> &mut Config {
+ self.cmake_target = Some(target.to_string());
+ self
+ }
+
+ /// Alters the default target triple on OSX to ensure that c++11 is
+ /// available. Does not change the target triple if it is explicitly
+ /// specified.
+ ///
+ /// This does not otherwise affect any CXX flags, i.e. it does not set
+ /// -std=c++11 or -stdlib=libc++.
+ #[deprecated = "no longer does anything, C++ is determined based on `cc::Build`, and the macOS issue has been fixed upstream"]
+ pub fn uses_cxx11(&mut self) -> &mut Config {
+ self.uses_cxx11 = true;
+ self
+ }
+
+ /// Forces CMake to always run before building the custom target.
+ ///
+ /// In some cases, when you have a big project, you can disable
+ /// subsequents runs of cmake to make `cargo build` faster.
+ pub fn always_configure(&mut self, always_configure: bool) -> &mut Config {
+ self.always_configure = always_configure;
+ self
+ }
+
+ /// Sets very verbose output.
+ pub fn very_verbose(&mut self, value: bool) -> &mut Config {
+ self.verbose_cmake = value;
+ self.verbose_make = value;
+ self
+ }
+
+ // Simple heuristic to determine if we're cross-compiling using the Android
+ // NDK toolchain file.
+ fn uses_android_ndk(&self) -> bool {
+ // `ANDROID_ABI` is the only required flag:
+ // https://developer.android.com/ndk/guides/cmake#android_abi
+ self.defined("ANDROID_ABI")
+ && self.defines.iter().any(|(flag, value)| {
+ flag == "CMAKE_TOOLCHAIN_FILE"
+ && Path::new(value).file_name() == Some("android.toolchain.cmake".as_ref())
+ })
+ }
+
+ /// Initializes the C build configuration.
+ pub fn init_c_cfg(&mut self, c_cfg: cc::Build) -> &mut Config {
+ self.c_cfg = Some(c_cfg);
+ self
+ }
+
+ /// Initializes the C++ build configuration.
+ pub fn init_cxx_cfg(&mut self, cxx_cfg: cc::Build) -> &mut Config {
+ self.cxx_cfg = Some(cxx_cfg);
+ self
+ }
+
+ /// Run this configuration, compiling the library with all the configured
+ /// options.
+ ///
+ /// This will run both the build system generator command as well as the
+ /// command to build the library.
+ pub fn build(&mut self) -> PathBuf {
+ let target = match self.target.clone() {
+ Some(t) => t,
+ None => getenv_unwrap("TARGET"),
+ };
+ let host = self.host.clone().unwrap_or_else(|| getenv_unwrap("HOST"));
+
+ // Some decisions later on are made if CMAKE_TOOLCHAIN_FILE is defined,
+ // so we need to read it from the environment variables from the beginning.
+ if !self.defined("CMAKE_TOOLCHAIN_FILE") {
+ if let Some(s) = self.getenv_target_os("CMAKE_TOOLCHAIN_FILE") {
+ self.define("CMAKE_TOOLCHAIN_FILE", s);
+ } else if target.contains("redox") {
+ if !self.defined("CMAKE_SYSTEM_NAME") {
+ self.define("CMAKE_SYSTEM_NAME", "Generic");
+ }
+ } else if target != host && !self.defined("CMAKE_SYSTEM_NAME") {
+ // Set CMAKE_SYSTEM_NAME and CMAKE_SYSTEM_PROCESSOR when cross compiling
+ let os = getenv_unwrap("CARGO_CFG_TARGET_OS");
+ let arch = getenv_unwrap("CARGO_CFG_TARGET_ARCH");
+ // CMAKE_SYSTEM_NAME list
+ // https://gitlab.kitware.com/cmake/cmake/-/issues/21489#note_1077167
+ //
+ // CMAKE_SYSTEM_PROCESSOR
+ // some of the values come from https://en.wikipedia.org/wiki/Uname
+ let (system_name, system_processor) = match (os.as_str(), arch.as_str()) {
+ ("android", "arm") => ("Android", "armv7-a"),
+ ("android", "x86") => ("Android", "i686"),
+ ("android", arch) => ("Android", arch),
+ ("dragonfly", arch) => ("DragonFly", arch),
+ ("macos", "aarch64") => ("Darwin", "arm64"),
+ ("macos", arch) => ("Darwin", arch),
+ ("freebsd", "x86_64") => ("FreeBSD", "amd64"),
+ ("freebsd", arch) => ("FreeBSD", arch),
+ ("fuchsia", arch) => ("Fuchsia", arch),
+ ("haiku", arch) => ("Haiku", arch),
+ ("ios", "aarch64") => ("iOS", "arm64"),
+ ("ios", arch) => ("iOS", arch),
+ ("linux", arch) => {
+ let name = "Linux";
+ match arch {
+ "powerpc" => (name, "ppc"),
+ "powerpc64" => (name, "ppc64"),
+ "powerpc64le" => (name, "ppc64le"),
+ _ => (name, arch),
+ }
+ }
+ ("netbsd", arch) => ("NetBSD", arch),
+ ("openbsd", "x86_64") => ("OpenBSD", "amd64"),
+ ("openbsd", arch) => ("OpenBSD", arch),
+ ("solaris", arch) => ("SunOS", arch),
+ ("tvos", "aarch64") => ("tvOS", "arm64"),
+ ("tvos", arch) => ("tvOS", arch),
+ ("visionos", "aarch64") => ("visionOS", "arm64"),
+ ("visionos", arch) => ("visionOS", arch),
+ ("watchos", "aarch64") => ("watchOS", "arm64"),
+ ("watchos", arch) => ("watchOS", arch),
+ ("windows", "x86_64") => ("Windows", "AMD64"),
+ ("windows", "x86") => ("Windows", "X86"),
+ ("windows", "aarch64") => ("Windows", "ARM64"),
+ ("none", arch) => ("Generic", arch),
+ // Others
+ (os, arch) => (os, arch),
+ };
+ self.define("CMAKE_SYSTEM_NAME", system_name);
+ self.define("CMAKE_SYSTEM_PROCESSOR", system_processor);
+ }
+ }
+
+ let generator = self
+ .generator
+ .clone()
+ .or_else(|| self.getenv_target_os("CMAKE_GENERATOR"));
+
+ let msvc = target.contains("msvc");
+ let ndk = self.uses_android_ndk();
+ let mut c_cfg = self.c_cfg.clone().unwrap_or_default();
+ c_cfg
+ .cargo_metadata(false)
+ .cpp(false)
+ .opt_level(0)
+ .debug(false)
+ .warnings(false)
+ .host(&host)
+ .no_default_flags(ndk || self.no_default_flags);
+ if !ndk {
+ c_cfg.target(&target);
+ }
+ let mut cxx_cfg = self.cxx_cfg.clone().unwrap_or_default();
+ cxx_cfg
+ .cargo_metadata(false)
+ .cpp(true)
+ .opt_level(0)
+ .debug(false)
+ .warnings(false)
+ .host(&host)
+ .no_default_flags(ndk || self.no_default_flags);
+ if !ndk {
+ cxx_cfg.target(&target);
+ }
+ if let Some(static_crt) = self.static_crt {
+ c_cfg.static_crt(static_crt);
+ cxx_cfg.static_crt(static_crt);
+ }
+ if let Some(explicit_flag) = self.pic {
+ c_cfg.pic(explicit_flag);
+ cxx_cfg.pic(explicit_flag);
+ }
+ let c_compiler = c_cfg.get_compiler();
+ let cxx_compiler = cxx_cfg.get_compiler();
+ let asm_compiler = c_cfg.get_compiler();
+
+ let dst = self
+ .out_dir
+ .clone()
+ .unwrap_or_else(|| PathBuf::from(getenv_unwrap("OUT_DIR")));
+ let build = dst.join("build");
+ self.maybe_clear(&build);
+ let _ = fs::create_dir_all(&build);
+
+ // Add all our dependencies to our cmake paths
+ let mut cmake_prefix_path = Vec::new();
+ for dep in &self.deps {
+ let dep = dep.to_uppercase().replace('-', "_");
+ if let Some(root) = env::var_os(format!("DEP_{}_ROOT", dep)) {
+ cmake_prefix_path.push(PathBuf::from(root));
+ }
+ }
+ let system_prefix = self
+ .getenv_target_os("CMAKE_PREFIX_PATH")
+ .unwrap_or_default();
+ cmake_prefix_path.extend(env::split_paths(&system_prefix));
+ let cmake_prefix_path = env::join_paths(&cmake_prefix_path).unwrap();
+
+ // Build up the first cmake command to build the build system.
+ let mut cmd = self.cmake_configure_command(&target);
+
+ let version = Version::from_command(cmd.get_program()).unwrap_or_default();
+
+ if self.verbose_cmake {
+ cmd.arg("-Wdev");
+ cmd.arg("--debug-output");
+ }
+
+ cmd.arg(&self.path).current_dir(&build);
+ let mut is_ninja = false;
+ if let Some(ref generator) = generator {
+ is_ninja = generator.to_string_lossy().contains("Ninja");
+ }
+ if target.contains("windows-gnu") {
+ if host.contains("windows") {
+ // On MinGW we need to coerce cmake to not generate a visual
+ // studio build system but instead use makefiles that MinGW can
+ // use to build.
+ if generator.is_none() {
+ // If make.exe isn't found, that means we may be using a MinGW
+ // toolchain instead of a MSYS2 toolchain. If neither is found,
+ // the build cannot continue.
+ let has_msys2 = Command::new("make")
+ .arg("--version")
+ .output()
+ .err()
+ .map(|e| e.kind() != ErrorKind::NotFound)
+ .unwrap_or(true);
+ let has_mingw32 = Command::new("mingw32-make")
+ .arg("--version")
+ .output()
+ .err()
+ .map(|e| e.kind() != ErrorKind::NotFound)
+ .unwrap_or(true);
+
+ let generator = match (has_msys2, has_mingw32) {
+ (true, _) => "MSYS Makefiles",
+ (false, true) => "MinGW Makefiles",
+ (false, false) => fail("no valid generator found for GNU toolchain; MSYS or MinGW must be installed")
+ };
+
+ cmd.arg("-G").arg(generator);
+ }
+ } else {
+ // If we're cross compiling onto windows, then set some
+ // variables which will hopefully get things to succeed. Some
+ // systems may need the `windres` or `dlltool` variables set, so
+ // set them if possible.
+ if !self.defined("CMAKE_RC_COMPILER") {
+ let exe = find_exe(c_compiler.path());
+ if let Some(name) = exe.file_name().unwrap().to_str() {
+ let name = name.replace("gcc", "windres");
+ let windres = exe.with_file_name(name);
+ if windres.is_file() {
+ let mut arg = OsString::from("-DCMAKE_RC_COMPILER=");
+ arg.push(&windres);
+ cmd.arg(arg);
+ }
+ }
+ }
+ }
+ } else if msvc {
+ // If we're on MSVC we need to be sure to use the right generator or
+ // otherwise we won't get 32/64 bit correct automatically.
+ // This also guarantees that NMake generator isn't chosen implicitly.
+ let using_nmake_generator = if let Some(g) = &generator {
+ g == "NMake Makefiles" || g == "NMake Makefiles JOM"
+ } else {
+ cmd.arg("-G").arg(self.visual_studio_generator(&target));
+ false
+ };
+ if !is_ninja && !using_nmake_generator {
+ if target.contains("x86_64") {
+ if self.generator_toolset.is_none() {
+ cmd.arg("-Thost=x64");
+ }
+ cmd.arg("-Ax64");
+ } else if target.contains("thumbv7a") {
+ if self.generator_toolset.is_none() {
+ cmd.arg("-Thost=x64");
+ }
+ cmd.arg("-Aarm");
+ } else if target.contains("aarch64") {
+ if self.generator_toolset.is_none() {
+ cmd.arg("-Thost=x64");
+ }
+ cmd.arg("-AARM64");
+ } else if target.contains("i686") {
+ if self.generator_toolset.is_none() {
+ cmd.arg("-Thost=x86");
+ }
+ cmd.arg("-AWin32");
+ } else {
+ panic!("unsupported msvc target: {}", target);
+ }
+ }
+ } else if target.contains("darwin") && !self.defined("CMAKE_OSX_ARCHITECTURES") {
+ if target.contains("x86_64") {
+ cmd.arg("-DCMAKE_OSX_ARCHITECTURES=x86_64");
+ } else if target.contains("aarch64") {
+ cmd.arg("-DCMAKE_OSX_ARCHITECTURES=arm64");
+ } else {
+ panic!("unsupported darwin target: {}", target);
+ }
+ }
+ if let Some(ref generator) = generator {
+ cmd.arg("-G").arg(generator);
+ }
+ if let Some(ref generator_toolset) = self.generator_toolset {
+ cmd.arg("-T").arg(generator_toolset);
+ }
+ let profile = self.get_profile().to_string();
+ for (k, v) in &self.defines {
+ let mut os = OsString::from("-D");
+ os.push(k);
+ os.push("=");
+ os.push(v);
+ cmd.arg(os);
+ }
+
+ if !self.defined("CMAKE_INSTALL_PREFIX") {
+ let mut dstflag = OsString::from("-DCMAKE_INSTALL_PREFIX=");
+ dstflag.push(&dst);
+ cmd.arg(dstflag);
+ }
+
+ let build_type = self
+ .defines
+ .iter()
+ .find(|&(a, _)| a == "CMAKE_BUILD_TYPE")
+ .map(|x| x.1.to_str().unwrap())
+ .unwrap_or(&profile);
+ let build_type_upcase = build_type
+ .chars()
+ .flat_map(|c| c.to_uppercase())
+ .collect::<String>();
+
+ {
+ // let cmake deal with optimization/debuginfo
+ let skip_arg = |arg: &OsStr| match arg.to_str() {
+ Some(s) => s.starts_with("-O") || s.starts_with("/O") || s == "-g",
+ None => false,
+ };
+ let mut set_compiler = |kind: &str, compiler: &cc::Tool, extra: &OsString| {
+ let flag_var = format!("CMAKE_{}_FLAGS", kind);
+ let tool_var = format!("CMAKE_{}_COMPILER", kind);
+ if !self.defined(&flag_var) {
+ let mut flagsflag = OsString::from("-D");
+ flagsflag.push(&flag_var);
+ flagsflag.push("=");
+ flagsflag.push(extra);
+ for arg in compiler.args() {
+ if skip_arg(arg) {
+ continue;
+ }
+ flagsflag.push(" ");
+ flagsflag.push(arg);
+ }
+ cmd.arg(flagsflag);
+ }
+
+ // The visual studio generator apparently doesn't respect
+ // `CMAKE_C_FLAGS` but does respect `CMAKE_C_FLAGS_RELEASE` and
+ // such. We need to communicate /MD vs /MT, so set those vars
+ // here.
+ //
+ // Note that for other generators, though, this *overrides*
+ // things like the optimization flags, which is bad.
+ if generator.is_none() && msvc {
+ let flag_var_alt = format!("CMAKE_{}_FLAGS_{}", kind, build_type_upcase);
+ if !self.defined(&flag_var_alt) {
+ let mut flagsflag = OsString::from("-D");
+ flagsflag.push(&flag_var_alt);
+ flagsflag.push("=");
+ flagsflag.push(extra);
+ for arg in compiler.args() {
+ if skip_arg(arg) {
+ continue;
+ }
+ flagsflag.push(" ");
+ flagsflag.push(arg);
+ }
+ cmd.arg(flagsflag);
+ }
+ }
+
+ // Apparently cmake likes to have an absolute path to the
+ // compiler as otherwise it sometimes thinks that this variable
+ // changed as it thinks the found compiler, /usr/bin/cc,
+ // differs from the specified compiler, cc. Not entirely sure
+ // what's up, but at least this means cmake doesn't get
+ // confused?
+ //
+ // Also specify this on Windows only if we use MSVC with Ninja,
+ // as it's not needed for MSVC with Visual Studio generators and
+ // for MinGW it doesn't really vary.
+ if !self.defined("CMAKE_TOOLCHAIN_FILE")
+ && !self.defined(&tool_var)
+ && (env::consts::FAMILY != "windows" || (msvc && is_ninja))
+ {
+ let mut ccompiler = OsString::from("-D");
+ ccompiler.push(&tool_var);
+ ccompiler.push("=");
+ ccompiler.push(find_exe(compiler.path()));
+ #[cfg(windows)]
+ {
+ // CMake doesn't like unescaped `\`s in compiler paths
+ // so we either have to escape them or replace with `/`s.
+ use std::os::windows::ffi::{OsStrExt, OsStringExt};
+ let wchars = ccompiler
+ .encode_wide()
+ .map(|wchar| {
+ if wchar == b'\\' as u16 {
+ '/' as u16
+ } else {
+ wchar
+ }
+ })
+ .collect::<Vec<_>>();
+ ccompiler = OsString::from_wide(&wchars);
+ }
+ cmd.arg(ccompiler);
+ }
+ };
+
+ set_compiler("C", &c_compiler, &self.cflags);
+ set_compiler("CXX", &cxx_compiler, &self.cxxflags);
+ set_compiler("ASM", &asm_compiler, &self.asmflags);
+ }
+
+ if !self.defined("CMAKE_BUILD_TYPE") {
+ cmd.arg(format!("-DCMAKE_BUILD_TYPE={}", profile));
+ }
+
+ if self.verbose_make {
+ cmd.arg("-DCMAKE_VERBOSE_MAKEFILE:BOOL=ON");
+ }
+
+ for (k, v) in c_compiler.env().iter().chain(&self.env) {
+ cmd.env(k, v);
+ }
+
+ if self.always_configure || !build.join("CMakeCache.txt").exists() {
+ cmd.args(&self.configure_args);
+ run(cmd.env("CMAKE_PREFIX_PATH", cmake_prefix_path), "cmake");
+ } else {
+ println!("CMake project was already configured. Skipping configuration step.");
+ }
+
+ // And build!
+ let mut cmd = self.cmake_build_command(&target);
+ cmd.current_dir(&build);
+
+ for (k, v) in c_compiler.env().iter().chain(&self.env) {
+ cmd.env(k, v);
+ }
+
+ // If the generated project is Makefile based we should carefully transfer corresponding CARGO_MAKEFLAGS
+ let mut use_jobserver = false;
+ if fs::metadata(build.join("Makefile")).is_ok() {
+ match env::var_os("CARGO_MAKEFLAGS") {
+ // Only do this on non-windows, non-bsd, and non-macos (unless a named pipe
+ // jobserver is available)
+ // * On Windows, we could be invoking make instead of
+ // mingw32-make which doesn't work with our jobserver
+ // * bsdmake also does not work with our job server
+ // * On macOS, CMake blocks propagation of the jobserver's file descriptors to make
+ // However, if the jobserver is based on a named pipe, this will be available to
+ // the build.
+ Some(ref makeflags)
+ if !(cfg!(windows)
+ || cfg!(target_os = "openbsd")
+ || cfg!(target_os = "netbsd")
+ || cfg!(target_os = "freebsd")
+ || cfg!(target_os = "dragonfly")
+ || (cfg!(target_os = "macos")
+ && !uses_named_pipe_jobserver(makeflags))) =>
+ {
+ use_jobserver = true;
+ cmd.env("MAKEFLAGS", makeflags);
+ }
+ _ => {}
+ }
+ }
+
+ cmd.arg("--build").arg(&build);
+
+ if !self.no_build_target {
+ let target = self
+ .cmake_target
+ .clone()
+ .unwrap_or_else(|| "install".to_string());
+ cmd.arg("--target").arg(target);
+ }
+
+ cmd.arg("--config").arg(&profile);
+
+ // --parallel requires CMake 3.12:
+ // https://cmake.org/cmake/help/latest/release/3.12.html#command-line
+ if version >= Version::new(3, 12) && !use_jobserver {
+ if let Ok(s) = env::var("NUM_JOBS") {
+ // See https://cmake.org/cmake/help/v3.12/manual/cmake.1.html#build-tool-mode
+ cmd.arg("--parallel").arg(s);
+ }
+ }
+
+ if !&self.build_args.is_empty() {
+ cmd.arg("--").args(&self.build_args);
+ }
+
+ run(&mut cmd, "cmake");
+
+ println!("cargo:root={}", dst.display());
+ dst
+ }
+
+ fn cmake_executable(&mut self) -> OsString {
+ self.getenv_target_os("CMAKE")
+ .unwrap_or_else(|| OsString::from("cmake"))
+ }
+
+ // If we are building for Emscripten, wrap the calls to CMake
+ // as "emcmake cmake ..." and "emmake cmake --build ...".
+ // https://emscripten.org/docs/compiling/Building-Projects.html
+
+ fn cmake_configure_command(&mut self, target: &str) -> Command {
+ if target.contains("emscripten") {
+ let emcmake = self
+ .getenv_target_os("EMCMAKE")
+ .unwrap_or_else(|| OsString::from("emcmake"));
+ let mut cmd = Command::new(emcmake);
+ cmd.arg(self.cmake_executable());
+ cmd
+ } else {
+ Command::new(self.cmake_executable())
+ }
+ }
+
+ fn cmake_build_command(&mut self, target: &str) -> Command {
+ if target.contains("emscripten") {
+ let emmake = self
+ .getenv_target_os("EMMAKE")
+ .unwrap_or_else(|| OsString::from("emmake"));
+ let mut cmd = Command::new(emmake);
+ cmd.arg(self.cmake_executable());
+ cmd
+ } else {
+ Command::new(self.cmake_executable())
+ }
+ }
+
+ fn getenv_os(&mut self, v: &str) -> Option<OsString> {
+ if let Some(val) = self.env_cache.get(v) {
+ return val.clone();
+ }
+ let r = env::var_os(v);
+ println!("{} = {:?}", v, r);
+ self.env_cache.insert(v.to_string(), r.clone());
+ r
+ }
+
+ /// Gets a target-specific environment variable.
+ fn getenv_target_os(&mut self, var_base: &str) -> Option<OsString> {
+ let host = self.host.clone().unwrap_or_else(|| getenv_unwrap("HOST"));
+ let target = self
+ .target
+ .clone()
+ .unwrap_or_else(|| getenv_unwrap("TARGET"));
+
+ let kind = if host == target { "HOST" } else { "TARGET" };
+ let target_u = target.replace('-', "_");
+ self.getenv_os(&format!("{}_{}", var_base, target))
+ .or_else(|| self.getenv_os(&format!("{}_{}", var_base, target_u)))
+ .or_else(|| self.getenv_os(&format!("{}_{}", kind, var_base)))
+ .or_else(|| self.getenv_os(var_base))
+ }
+
+ fn visual_studio_generator(&self, target: &str) -> String {
+ use cc::windows_registry::{find_vs_version, VsVers};
+
+ let base = match find_vs_version() {
+ Ok(VsVers::Vs17) => "Visual Studio 17 2022",
+ Ok(VsVers::Vs16) => "Visual Studio 16 2019",
+ Ok(VsVers::Vs15) => "Visual Studio 15 2017",
+ Ok(VsVers::Vs14) => "Visual Studio 14 2015",
+ // This was deprecated recently (2024-07). Ignore the warning for now.
+ #[allow(deprecated)]
+ Ok(VsVers::Vs12) => "Visual Studio 12 2013",
+ Ok(_) => panic!(
+ "Visual studio version detected but this crate \
+ doesn't know how to generate cmake files for it, \
+ can the `cmake` crate be updated?"
+ ),
+ Err(msg) => panic!("{}", msg),
+ };
+ if ["i686", "x86_64", "thumbv7a", "aarch64"]
+ .iter()
+ .any(|t| target.contains(t))
+ {
+ base.to_string()
+ } else {
+ panic!("unsupported msvc target: {}", target);
+ }
+ }
+
+ fn defined(&self, var: &str) -> bool {
+ self.defines.iter().any(|(a, _)| a == var)
+ }
+
+ // If a cmake project has previously been built (e.g. CMakeCache.txt already
+ // exists), then cmake will choke if the source directory for the original
+ // project being built has changed. Detect this situation through the
+ // `CMAKE_HOME_DIRECTORY` variable that cmake emits and if it doesn't match
+ // we blow away the build directory and start from scratch (the recommended
+ // solution apparently [1]).
+ //
+ // [1]: https://cmake.org/pipermail/cmake/2012-August/051545.html
+ fn maybe_clear(&self, dir: &Path) {
+ // CMake will apparently store canonicalized paths which normally
+ // isn't relevant to us but we canonicalize it here to ensure
+ // we're both checking the same thing.
+ let path = fs::canonicalize(&self.path).unwrap_or_else(|_| self.path.clone());
+ let mut f = match File::open(dir.join("CMakeCache.txt")) {
+ Ok(f) => f,
+ Err(..) => return,
+ };
+ let mut u8contents = Vec::new();
+ match f.read_to_end(&mut u8contents) {
+ Ok(f) => f,
+ Err(..) => return,
+ };
+ let contents = String::from_utf8_lossy(&u8contents);
+ drop(f);
+ for line in contents.lines() {
+ if line.starts_with("CMAKE_HOME_DIRECTORY") {
+ let needs_cleanup = match line.split('=').next_back() {
+ Some(cmake_home) => fs::canonicalize(cmake_home)
+ .ok()
+ .map(|cmake_home| cmake_home != path)
+ .unwrap_or(true),
+ None => true,
+ };
+ if needs_cleanup {
+ println!(
+ "detected home dir change, cleaning out entire build \
+ directory"
+ );
+ fs::remove_dir_all(dir).unwrap();
+ }
+ break;
+ }
+ }
+ }
+}
+
+#[derive(Debug, PartialEq, Eq, PartialOrd, Ord)]
+struct Version {
+ major: u32,
+ minor: u32,
+}
+
+impl Version {
+ fn new(major: u32, minor: u32) -> Self {
+ Self { major, minor }
+ }
+
+ fn parse(s: &str) -> Option<Self> {
+ // As of 3.22, the format of the version output is "cmake version <major>.<minor>.<patch>".
+ // ```
+ // $ cmake --version
+ // cmake version 3.22.2
+ //
+ // CMake suite maintained and supported by Kitware (kitware.com/cmake).
+ // ```
+ let version = s.lines().next()?.strip_prefix("cmake version ")?;
+ let mut digits = version.splitn(3, '.'); // split version string to major minor patch
+ let major = digits.next()?.parse::<u32>().ok()?;
+ let minor = digits.next()?.parse::<u32>().ok()?;
+ // Ignore the patch version because it does not change the API.
+ Some(Version::new(major, minor))
+ }
+
+ fn from_command(executable: &OsStr) -> Option<Self> {
+ let output = Command::new(executable).arg("--version").output().ok()?;
+ if !output.status.success() {
+ return None;
+ }
+ let stdout = core::str::from_utf8(&output.stdout).ok()?;
+ Self::parse(stdout)
+ }
+}
+
+impl Default for Version {
+ fn default() -> Self {
+ // If the version parsing fails, we assume that it is the latest known
+ // version. This is because the failure of version parsing may be due to
+ // the version output being changed.
+ Self::new(3, 22)
+ }
+}
+
+fn run(cmd: &mut Command, program: &str) {
+ println!("running: {:?}", cmd);
+ let status = match cmd.status() {
+ Ok(status) => status,
+ Err(ref e) if e.kind() == ErrorKind::NotFound => {
+ fail(&format!(
+ "failed to execute command: {}\nis `{}` not installed?",
+ e, program
+ ));
+ }
+ Err(e) => fail(&format!("failed to execute command: {}", e)),
+ };
+ if !status.success() {
+ if status.code() == Some(127) {
+ fail(&format!(
+ "command did not execute successfully, got: {}, is `{}` not installed?",
+ status, program
+ ));
+ }
+ fail(&format!(
+ "command did not execute successfully, got: {}",
+ status
+ ));
+ }
+}
+
+fn find_exe(path: &Path) -> PathBuf {
+ env::split_paths(&env::var_os("PATH").unwrap_or_default())
+ .map(|p| p.join(path))
+ .find(|p| fs::metadata(p).is_ok())
+ .unwrap_or_else(|| path.to_owned())
+}
+
+fn getenv_unwrap(v: &str) -> String {
+ match env::var(v) {
+ Ok(s) => s,
+ Err(..) => fail(&format!("environment variable `{}` not defined", v)),
+ }
+}
+
+fn fail(s: &str) -> ! {
+ panic!("\n{}\n\nbuild script failed, must exit now", s)
+}
+
+/// Returns whether the given MAKEFLAGS indicate that there is an available
+/// jobserver that uses a named pipe (fifo)
+fn uses_named_pipe_jobserver(makeflags: &OsStr) -> bool {
+ makeflags
+ .to_string_lossy()
+ // auth option as defined in
+ // https://www.gnu.org/software/make/manual/html_node/POSIX-Jobserver.html#POSIX-Jobserver
+ .contains("--jobserver-auth=fifo:")
+}
+
+#[cfg(test)]
+mod tests {
+ use super::uses_named_pipe_jobserver;
+ use super::Version;
+
+ #[test]
+ fn test_cmake_version() {
+ let text = "cmake version 3.22.2
+
+CMake suite maintained and supported by Kitware (kitware.com/cmake).
+";
+ let v = Version::parse(text).unwrap();
+ assert_eq!(v, Version::new(3, 22));
+ assert!(Version::new(3, 22) > Version::new(3, 21));
+ assert!(Version::new(3, 22) < Version::new(3, 23));
+
+ let _v = Version::from_command("cmake".as_ref()).unwrap();
+ }
+
+ #[test]
+ fn test_uses_fifo_jobserver() {
+ assert!(uses_named_pipe_jobserver(
+ "-j --jobserver-auth=fifo:/foo".as_ref()
+ ));
+ assert!(!uses_named_pipe_jobserver(
+ "-j --jobserver-auth=8:9".as_ref()
+ ));
+ }
+}
diff --git a/external/vendor/crc32fast/.cargo-checksum.json b/external/vendor/crc32fast/.cargo-checksum.json
new file mode 100644
index 0000000..cd5cdbe
--- /dev/null
+++ b/external/vendor/crc32fast/.cargo-checksum.json
@@ -0,0 +1 @@
+{"files":{".cargo_vcs_info.json":"7c7168a51582971f368485ccfc0636a24778de293473a8dd95c78839104ea1ef",".github/workflows/ci.yml":"91dae73a4a05df74e3f23b3e6a68813f28b05fb6ef3baa101c7a428a17a08edf","Cargo.lock":"5e16e67c4cd3cbb52675cece76a9a108743c1b4ecf68497c661f5b02843d5f57","Cargo.toml":"e082839aef8c8eebb5a5fca2be48c7dcd27a65e55e05d46a46107e19efe80b30","Cargo.toml.orig":"59ab86a9699069d7e50891da36ceb1f78fdcd83b7f255aaf9e51462de96ed668","LICENSE-APACHE":"c6596eb7be8581c18be736c846fb9173b69eccf6ef94c5135893ec56bd92ba08","LICENSE-MIT":"61d383b05b87d78f94d2937e2580cce47226d17823c0430fbcad09596537efcf","README.md":"bd9aef2140637bf1bc6d18864854f54c1abea8e9f8a77c5566ed09e0311d2504","benches/bench.rs":"33ca5c170e92a1b0cb37e21436a70475139e106b5ef021bebf11d1ecf3207cfb","build.rs":"62279ea110418e1b57e46ed5689cae892f3fa424ba237733ecbf4660c3dee71c","src/baseline.rs":"734d303b5673dbb6f34063265a259c5f5245b3d4c1927712f79fa2418b29dd49","src/combine.rs":"fc8f3c5ede49584afe439c9feef3f2848c708fbd83de6030f4c80e6c0c091725","src/lib.rs":"a7a76c47325828aef969aadef19daa823cb1937edb4e7e24b65a8b16efb571b1","src/specialized/aarch64.rs":"0601eb1e82596e05113b6f3a5ae8c238a74375ecbe7e625baef51080a4134e15","src/specialized/mod.rs":"de2dd8b016fa949beb01903d8c58930c343f5912031c72d1b907d8d5a7c09f06","src/specialized/pclmulqdq.rs":"754d208952258d2f8cdef6618f9d2eb71fb2325a3c0541354d5091beb1ebc9b7","src/table.rs":"1a566a6311b32b654fa05b324301611e0866b10db63692b53e8c1b9b529d4c17"},"package":"9481c1c90cbf2ac953f07c8d4a58aa3945c425b7185c9154d67a65e4230da511"}
\ No newline at end of file
diff --git a/external/vendor/crc32fast/.cargo_vcs_info.json b/external/vendor/crc32fast/.cargo_vcs_info.json
new file mode 100644
index 0000000..d4d9e64
--- /dev/null
+++ b/external/vendor/crc32fast/.cargo_vcs_info.json
@@ -0,0 +1,6 @@
+{
+ "git": {
+ "sha1": "dbf4f76cd71cdcc57d9164cbd46890d53ce0423c"
+ },
+ "path_in_vcs": ""
+}
\ No newline at end of file
diff --git a/external/vendor/crc32fast/.github/workflows/ci.yml b/external/vendor/crc32fast/.github/workflows/ci.yml
new file mode 100644
index 0000000..3817dfd
--- /dev/null
+++ b/external/vendor/crc32fast/.github/workflows/ci.yml
@@ -0,0 +1,125 @@
+name: CI
+
+on:
+ pull_request:
+ branches:
+ - master
+ push:
+ branches:
+ - master
+
+jobs:
+ stable:
+ name: stable
+ strategy:
+ matrix:
+ os:
+ - ubuntu-latest
+ - macos-latest
+ - windows-latest
+ runs-on: ${{ matrix.os }}
+ steps:
+ - uses: actions/checkout@v4
+ - name: Install Rust
+ run: rustup update stable --no-self-update
+ - name: Test in debug mode
+ run: cargo test --no-fail-fast
+ - name: Test in release mode
+ run: cargo test --no-fail-fast --release
+ - name: Check with no default features
+ run: cargo check --no-default-features
+ nightly:
+ name: nightly
+ runs-on: ubuntu-latest
+ steps:
+ - uses: actions/checkout@v4
+ - name: Install Rust
+ run: rustup update nightly
+ - name: Test in debug mode
+ run: cargo +nightly test --no-fail-fast
+ - name: Test in release mode
+ run: cargo +nightly test --no-fail-fast --release
+ - name: Check with no default features
+ run: cargo +nightly check --no-default-features
+ - name: Build benches
+ run: cargo +nightly build --benches --all
+ msrv:
+ name: msrv
+ runs-on: ubuntu-latest
+ steps:
+ - uses: actions/checkout@v4
+ - name: Get MSRV from Cargo.toml
+ id: msrv
+ run: echo "version=$(grep '^rust-version' Cargo.toml | sed 's/rust-version = "\(.*\)"/\1/')" >> $GITHUB_OUTPUT
+ - name: Install Rust
+ run: rustup update ${{ steps.msrv.outputs.version }} && rustup default ${{ steps.msrv.outputs.version }}
+ - name: Test in debug mode
+ run: cargo test --no-fail-fast
+ - name: Test in release mode
+ run: cargo test --no-fail-fast --release
+ - name: Check with no default features
+ run: cargo check --no-default-features
+ asan:
+ name: asan
+ runs-on: ubuntu-latest
+ steps:
+ - uses: actions/checkout@v4
+ - name: Install Rust
+ run: rustup update nightly --no-self-update
+ - name: Run address sanitizer
+ run: RUSTFLAGS="-Z sanitizer=address" cargo +nightly test --lib --target x86_64-unknown-linux-gnu
+ env:
+ ASAN_OPTIONS: "detect_odr_violation=0 detect_leaks=0"
+ RUST_BACKTRACE: "1"
+ cross-test:
+ name: cross-test
+ runs-on: ubuntu-latest
+ strategy:
+ matrix:
+ target:
+ - i686-unknown-linux-gnu
+ - aarch64-unknown-linux-gnu
+ steps:
+ - uses: actions/checkout@v4
+ - name: Install Rust
+ run: rustup update --no-self-update
+ - name: Install Cross
+ run: cargo install --force cross
+ - name: Test
+ run: cross test --target=${{ matrix.target }}
+ - name: Check with no default features
+ run: cross check --target=${{ matrix.target }} --no-default-features
+ cross-check:
+ name: cross-check
+ runs-on: ubuntu-latest
+ strategy:
+ matrix:
+ target:
+ - wasm32-unknown-unknown
+ steps:
+ - uses: actions/checkout@v4
+ - name: Install Rust
+ run: rustup update --no-self-update
+ - name: Add target
+ run: rustup target add ${{ matrix.target }}
+ - name: Check
+ run: cargo check --target=${{ matrix.target }}
+ - name: Check with no default features
+ run: cargo check --target=${{ matrix.target }} --no-default-features
+ cross-check-nightly-feature:
+ name: cross-check-nightly-features
+ runs-on: ubuntu-latest
+ strategy:
+ matrix:
+ target:
+ - aarch64-unknown-linux-gnu
+ steps:
+ - uses: actions/checkout@v4
+ - name: Install Rust
+ run: rustup update nightly --no-self-update && rustup default nightly
+ - name: Add target
+ run: rustup target add ${{ matrix.target }}
+ - name: Check
+ run: cargo check --target=${{ matrix.target }} --features=nightly
+ - name: Check with no default features
+ run: cargo check --target=${{ matrix.target }} --no-default-features --features=nightly
diff --git a/external/vendor/crc32fast/Cargo.lock b/external/vendor/crc32fast/Cargo.lock
new file mode 100644
index 0000000..3a31a50
--- /dev/null
+++ b/external/vendor/crc32fast/Cargo.lock
@@ -0,0 +1,93 @@
+# This file is automatically @generated by Cargo.
+# It is not intended for manual editing.
+version = 3
+
+[[package]]
+name = "bencher"
+version = "0.1.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7dfdb4953a096c551ce9ace855a604d702e6e62d77fac690575ae347571717f5"
+
+[[package]]
+name = "cfg-if"
+version = "1.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"
+
+[[package]]
+name = "crc32fast"
+version = "1.5.0"
+dependencies = [
+ "bencher",
+ "cfg-if",
+ "quickcheck",
+ "rand",
+]
+
+[[package]]
+name = "getrandom"
+version = "0.2.12"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "190092ea657667030ac6a35e305e62fc4dd69fd98ac98631e5d3a2b1575a12b5"
+dependencies = [
+ "cfg-if",
+ "libc",
+ "wasi",
+]
+
+[[package]]
+name = "libc"
+version = "0.2.153"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9c198f91728a82281a64e1f4f9eeb25d82cb32a5de251c6bd1b5154d63a8e7bd"
+
+[[package]]
+name = "ppv-lite86"
+version = "0.2.17"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de"
+
+[[package]]
+name = "quickcheck"
+version = "1.0.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "588f6378e4dd99458b60ec275b4477add41ce4fa9f64dcba6f15adccb19b50d6"
+dependencies = [
+ "rand",
+]
+
+[[package]]
+name = "rand"
+version = "0.8.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404"
+dependencies = [
+ "libc",
+ "rand_chacha",
+ "rand_core",
+]
+
+[[package]]
+name = "rand_chacha"
+version = "0.3.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88"
+dependencies = [
+ "ppv-lite86",
+ "rand_core",
+]
+
+[[package]]
+name = "rand_core"
+version = "0.6.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c"
+dependencies = [
+ "getrandom",
+]
+
+[[package]]
+name = "wasi"
+version = "0.11.0+wasi-snapshot-preview1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423"
diff --git a/external/vendor/crc32fast/Cargo.toml b/external/vendor/crc32fast/Cargo.toml
new file mode 100644
index 0000000..d926709
--- /dev/null
+++ b/external/vendor/crc32fast/Cargo.toml
@@ -0,0 +1,68 @@
+# THIS FILE IS AUTOMATICALLY GENERATED BY CARGO
+#
+# When uploading crates to the registry Cargo will automatically
+# "normalize" Cargo.toml files for maximal compatibility
+# with all versions of Cargo and also rewrite `path` dependencies
+# to registry (e.g., crates.io) dependencies.
+#
+# If you are reading this file be aware that the original Cargo.toml
+# will likely look very different (and much more reasonable).
+# See Cargo.toml.orig for the original contents.
+
+[package]
+edition = "2021"
+rust-version = "1.63"
+name = "crc32fast"
+version = "1.5.0"
+authors = [
+ "Sam Rijs <srijs@airpost.net>",
+ "Alex Crichton <alex@alexcrichton.com>",
+]
+build = "build.rs"
+autolib = false
+autobins = false
+autoexamples = false
+autotests = false
+autobenches = false
+description = "Fast, SIMD-accelerated CRC32 (IEEE) checksum computation"
+readme = "README.md"
+keywords = [
+ "hash",
+ "crc",
+ "crc32",
+ "simd",
+ "fast",
+]
+categories = [
+ "algorithms",
+ "no-std",
+]
+license = "MIT OR Apache-2.0"
+repository = "https://github.com/srijs/rust-crc32fast"
+
+[features]
+default = ["std"]
+nightly = []
+std = []
+
+[lib]
+name = "crc32fast"
+path = "src/lib.rs"
+
+[[bench]]
+name = "bench"
+path = "benches/bench.rs"
+harness = false
+
+[dependencies.cfg-if]
+version = "1.0"
+
+[dev-dependencies.bencher]
+version = "0.1"
+
+[dev-dependencies.quickcheck]
+version = "1.0"
+default-features = false
+
+[dev-dependencies.rand]
+version = "0.8"
diff --git a/external/vendor/crc32fast/Cargo.toml.orig b/external/vendor/crc32fast/Cargo.toml.orig
new file mode 100644
index 0000000..84da265
--- /dev/null
+++ b/external/vendor/crc32fast/Cargo.toml.orig
@@ -0,0 +1,32 @@
+[package]
+name = "crc32fast"
+version = "1.5.0"
+edition = "2021"
+license = "MIT OR Apache-2.0"
+authors = [
+ "Sam Rijs <srijs@airpost.net>",
+ "Alex Crichton <alex@alexcrichton.com>"
+]
+description = "Fast, SIMD-accelerated CRC32 (IEEE) checksum computation"
+repository = "https://github.com/srijs/rust-crc32fast"
+readme = "README.md"
+keywords = ["hash", "crc", "crc32", "simd", "fast"]
+categories = ["algorithms", "no-std"]
+rust-version = "1.63"
+
+[dependencies]
+cfg-if = "1.0"
+
+[dev-dependencies]
+bencher = "0.1"
+quickcheck = { version = "1.0", default-features = false }
+rand = "0.8"
+
+[features]
+default = ["std"]
+std = []
+nightly = []
+
+[[bench]]
+name = "bench"
+harness = false
diff --git a/external/vendor/crc32fast/LICENSE-APACHE b/external/vendor/crc32fast/LICENSE-APACHE
new file mode 100644
index 0000000..8f71f43
--- /dev/null
+++ b/external/vendor/crc32fast/LICENSE-APACHE
@@ -0,0 +1,202 @@
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
+
+ APPENDIX: How to apply the Apache License to your work.
+
+ To apply the Apache License to your work, attach the following
+ boilerplate notice, with the fields enclosed by brackets "{}"
+ replaced with your own identifying information. (Don't include
+ the brackets!) The text should be enclosed in the appropriate
+ comment syntax for the file format. We also recommend that a
+ file or class name and description of purpose be included on the
+ same "printed page" as the copyright notice for easier
+ identification within third-party archives.
+
+ Copyright {yyyy} {name of copyright owner}
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+
diff --git a/external/vendor/crc32fast/LICENSE-MIT b/external/vendor/crc32fast/LICENSE-MIT
new file mode 100644
index 0000000..f558267
--- /dev/null
+++ b/external/vendor/crc32fast/LICENSE-MIT
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2018 Sam Rijs, Alex Crichton and contributors
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/external/vendor/crc32fast/README.md b/external/vendor/crc32fast/README.md
new file mode 100644
index 0000000..999a38e
--- /dev/null
+++ b/external/vendor/crc32fast/README.md
@@ -0,0 +1,91 @@
+# crc32fast [![Build Status][build-img]][build] [![Crates.io][crates-img]][crates] [![Documentation][docs-img]][docs]
+
+[build-img]: https://github.com/srijs/rust-crc32fast/actions/workflows/ci.yml/badge.svg
+[build]: https://github.com/srijs/rust-crc32fast/actions/workflows/ci.yml
+[crates-img]: https://img.shields.io/crates/v/crc32fast.svg
+[crates]: https://crates.io/crates/crc32fast
+[docs-img]: https://docs.rs/crc32fast/badge.svg
+[docs]: https://docs.rs/crc32fast
+
+_Fast, SIMD-accelerated CRC32 (IEEE) checksum computation_
+
+## Usage
+
+### Simple usage
+
+For simple use-cases, you can call the `hash` convenience function to
+directly compute the CRC32 checksum for a given byte slice:
+
+```rust
+let checksum = crc32fast::hash(b"foo bar baz");
+```
+
+### Advanced usage
+
+For use-cases that require more flexibility or performance, for example when
+processing large amounts of data, you can create and manipulate a `Hasher`:
+
+```rust
+use crc32fast::Hasher;
+
+let mut hasher = Hasher::new();
+hasher.update(b"foo bar baz");
+let checksum = hasher.finalize();
+```
+
+## Performance
+
+This crate contains multiple CRC32 implementations:
+
+- A fast baseline implementation which processes up to 16 bytes per iteration
+- An optimized implementation for modern `x86` using `sse` and `pclmulqdq` instructions
+- An optimized implementation for `aarch64` using `crc32` instructions
+
+Calling the `Hasher::new` constructor at runtime will perform a feature detection to select the most
+optimal implementation for the current CPU feature set.
+
+| crate | version | variant | ns/iter | MB/s |
+| ----------------------------------- | ------- | --------- | ------- | ---- |
+| [crc](https://crates.io/crates/crc) | 1.8.1 | n/a | 4,926 | 207 |
+| crc32fast (this crate) | 1.0.0 | baseline | 683 | 1499 |
+| crc32fast (this crate) | 1.0.0 | pclmulqdq | 140 | 7314 |
+
+## Memory Safety
+
+Due to the use of SIMD intrinsics for the optimized implementations, this crate contains some amount of `unsafe` code.
+
+In order to ensure memory safety, the relevant code has been fuzz tested using `libFuzzer` (via [cargo-fuzz](https://github.com/rust-fuzz/cargo-fuzz)) with millions of iterations in both `debug` and `release` build settings. You can inspect the test setup in the `fuzz` sub-directory, which also has instructions on how to run the tests yourself.
+
+On top of that, every commit is tested using an address sanitizer in CI to catch any out of bounds memory accesses.
+
+Even though neither fuzzing nor sanitization has revealed any safety bugs yet, please don't hesitate to file an issue if you run into any crashes or other unexpected behaviour.
+
+## Available feature flags
+
+### `std` (default: enabled)
+
+This library supports being built without the Rust `std` library, which is useful for low-level use-cases such as embedded where no operating system is available. To build the crate in a `no_std` context, disable the default `std` feature.
+
+Note: Because runtime CPU feature detection requires OS support, the specialized SIMD implementations will be unavailable when the `std` feature is disabled.
+
+### `nightly` (default: disabled)
+
+This feature flag enables unstable features that are only available on the `nightly` channel. Keep in mind that when enabling this feature flag, you
+might experience breaking changes when updating compiler versions.
+
+## License
+
+This project is licensed under either of
+
+- Apache License, Version 2.0, ([LICENSE-APACHE](LICENSE-APACHE) or
+ http://www.apache.org/licenses/LICENSE-2.0)
+- MIT license ([LICENSE-MIT](LICENSE-MIT) or
+ http://opensource.org/licenses/MIT)
+
+at your option.
+
+### Contribution
+
+Unless you explicitly state otherwise, any contribution intentionally submitted
+for inclusion in this project by you, as defined in the Apache-2.0 license,
+shall be dual licensed as above, without any additional terms or conditions.
diff --git a/external/vendor/crc32fast/benches/bench.rs b/external/vendor/crc32fast/benches/bench.rs
new file mode 100644
index 0000000..6189500
--- /dev/null
+++ b/external/vendor/crc32fast/benches/bench.rs
@@ -0,0 +1,80 @@
+use bencher::Bencher;
+use crc32fast::Hasher;
+use rand::Rng;
+
+fn bench(b: &mut Bencher, size: usize, hasher_init: Hasher) {
+ let mut bytes = vec![0u8; size];
+ rand::thread_rng().fill(&mut bytes[..]);
+
+ b.iter(|| {
+ let mut hasher = hasher_init.clone();
+ hasher.update(&bytes);
+ bencher::black_box(hasher.finalize())
+ });
+
+ b.bytes = size as u64;
+}
+
+fn bench_kilobyte_baseline(b: &mut Bencher) {
+ bench(b, 1024, Hasher::internal_new_baseline(0, 0))
+}
+
+fn bench_kilobyte_specialized(b: &mut Bencher) {
+ bench(b, 1024, Hasher::internal_new_specialized(0, 0).unwrap())
+}
+
+fn bench_megabyte_baseline(b: &mut Bencher) {
+ bench(b, 1024 * 1024, Hasher::internal_new_baseline(0, 0))
+}
+
+fn bench_megabyte_specialized(b: &mut Bencher) {
+ bench(
+ b,
+ 1024 * 1024,
+ Hasher::internal_new_specialized(0, 0).unwrap(),
+ )
+}
+
+fn bench_combine_inner(b: &mut Bencher, i1: u32, l1: u64, i2: u32, l2: u64) {
+ let h1 = Hasher::new_with_initial_len(i1, l1);
+ let h2 = Hasher::new_with_initial_len(i2, l2);
+
+ b.iter(|| {
+ let mut h = h1.clone();
+ h.combine(&h2);
+ bencher::black_box(h);
+ })
+}
+
+fn bench_combine_16(b: &mut Bencher) {
+ let (i1, l1, i2, l2): (u32, u64, u32, u16) = rand::thread_rng().gen();
+ bench_combine_inner(b, i1, l1, i2, u64::from(l2))
+}
+
+fn bench_combine_32(b: &mut Bencher) {
+ let (i1, l1, i2, l2): (u32, u64, u32, u32) = rand::thread_rng().gen();
+ bench_combine_inner(b, i1, l1, i2, u64::from(l2))
+}
+
+fn bench_combine_64(b: &mut Bencher) {
+ let (i1, l1, i2, l2): (u32, u64, u32, u64) = rand::thread_rng().gen();
+ bench_combine_inner(b, i1, l1, i2, l2)
+}
+
+bencher::benchmark_group!(
+ bench_baseline,
+ bench_kilobyte_baseline,
+ bench_megabyte_baseline
+);
+bencher::benchmark_group!(
+ bench_specialized,
+ bench_kilobyte_specialized,
+ bench_megabyte_specialized
+);
+bencher::benchmark_group!(
+ bench_combine,
+ bench_combine_16,
+ bench_combine_32,
+ bench_combine_64
+);
+bencher::benchmark_main!(bench_baseline, bench_specialized, bench_combine);
diff --git a/external/vendor/crc32fast/build.rs b/external/vendor/crc32fast/build.rs
new file mode 100644
index 0000000..970e56d
--- /dev/null
+++ b/external/vendor/crc32fast/build.rs
@@ -0,0 +1,27 @@
+use std::{env, process::Command};
+
+fn main() {
+ if let Some(minor_version) = minor_rustc_version() {
+ // rustc 1.80 stabilized ARM CRC32 intrinsics:
+ // https://doc.rust-lang.org/nightly/core/arch/aarch64/fn.__crc32d.html
+ if minor_version >= 80 {
+ println!("cargo:rustc-cfg=stable_arm_crc32_intrinsics");
+ println!("cargo:rustc-check-cfg=cfg(stable_arm_crc32_intrinsics)");
+ }
+ }
+}
+
+fn minor_rustc_version() -> Option<u32> {
+ Command::new(env::var_os("RUSTC")?)
+ .arg("--version")
+ .output()
+ .ok()
+ .and_then(|output| {
+ std::str::from_utf8(&output.stdout).ok().and_then(|output| {
+ output
+ .split('.')
+ .nth(1)
+ .and_then(|minor_version| minor_version.parse().ok())
+ })
+ })
+}
diff --git a/external/vendor/crc32fast/src/baseline.rs b/external/vendor/crc32fast/src/baseline.rs
new file mode 100644
index 0000000..38376c7
--- /dev/null
+++ b/external/vendor/crc32fast/src/baseline.rs
@@ -0,0 +1,94 @@
+use crate::table::CRC32_TABLE;
+
+#[derive(Clone)]
+pub struct State {
+ state: u32,
+}
+
+impl State {
+ pub fn new(state: u32) -> Self {
+ State { state }
+ }
+
+ pub fn update(&mut self, buf: &[u8]) {
+ self.state = update_fast_16(self.state, buf);
+ }
+
+ pub fn finalize(self) -> u32 {
+ self.state
+ }
+
+ pub fn reset(&mut self) {
+ self.state = 0;
+ }
+
+ pub fn combine(&mut self, other: u32, amount: u64) {
+ self.state = crate::combine::combine(self.state, other, amount);
+ }
+}
+
+pub(crate) fn update_fast_16(prev: u32, mut buf: &[u8]) -> u32 {
+ const UNROLL: usize = 4;
+ const BYTES_AT_ONCE: usize = 16 * UNROLL;
+
+ let mut crc = !prev;
+
+ while buf.len() >= BYTES_AT_ONCE {
+ for _ in 0..UNROLL {
+ crc = CRC32_TABLE[0x0][buf[0xf] as usize]
+ ^ CRC32_TABLE[0x1][buf[0xe] as usize]
+ ^ CRC32_TABLE[0x2][buf[0xd] as usize]
+ ^ CRC32_TABLE[0x3][buf[0xc] as usize]
+ ^ CRC32_TABLE[0x4][buf[0xb] as usize]
+ ^ CRC32_TABLE[0x5][buf[0xa] as usize]
+ ^ CRC32_TABLE[0x6][buf[0x9] as usize]
+ ^ CRC32_TABLE[0x7][buf[0x8] as usize]
+ ^ CRC32_TABLE[0x8][buf[0x7] as usize]
+ ^ CRC32_TABLE[0x9][buf[0x6] as usize]
+ ^ CRC32_TABLE[0xa][buf[0x5] as usize]
+ ^ CRC32_TABLE[0xb][buf[0x4] as usize]
+ ^ CRC32_TABLE[0xc][buf[0x3] as usize ^ ((crc >> 0x18) & 0xFF) as usize]
+ ^ CRC32_TABLE[0xd][buf[0x2] as usize ^ ((crc >> 0x10) & 0xFF) as usize]
+ ^ CRC32_TABLE[0xe][buf[0x1] as usize ^ ((crc >> 0x08) & 0xFF) as usize]
+ ^ CRC32_TABLE[0xf][buf[0x0] as usize ^ (crc & 0xFF) as usize];
+ buf = &buf[16..];
+ }
+ }
+
+ update_slow(!crc, buf)
+}
+
+pub(crate) fn update_slow(prev: u32, buf: &[u8]) -> u32 {
+ let mut crc = !prev;
+
+ for &byte in buf.iter() {
+ crc = CRC32_TABLE[0][((crc as u8) ^ byte) as usize] ^ (crc >> 8);
+ }
+
+ !crc
+}
+
+#[cfg(test)]
+mod test {
+ #[test]
+ fn slow() {
+ assert_eq!(super::update_slow(0, b""), 0);
+
+ // test vectors from the iPXE project (input and output are bitwise negated)
+ assert_eq!(super::update_slow(!0x12345678, b""), !0x12345678);
+ assert_eq!(super::update_slow(!0xffffffff, b"hello world"), !0xf2b5ee7a);
+ assert_eq!(super::update_slow(!0xffffffff, b"hello"), !0xc9ef5979);
+ assert_eq!(super::update_slow(!0xc9ef5979, b" world"), !0xf2b5ee7a);
+
+ // Some vectors found on Rosetta code
+ assert_eq!(super::update_slow(0, b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"), 0x190A55AD);
+ assert_eq!(super::update_slow(0, b"\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"), 0xFF6CAB0B);
+ assert_eq!(super::update_slow(0, b"\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0A\x0B\x0C\x0D\x0E\x0F\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1A\x1B\x1C\x1D\x1E\x1F"), 0x91267E8A);
+ }
+
+ quickcheck::quickcheck! {
+ fn fast_16_is_the_same_as_slow(crc: u32, bytes: Vec<u8>) -> bool {
+ super::update_fast_16(crc, &bytes) == super::update_slow(crc, &bytes)
+ }
+ }
+}
diff --git a/external/vendor/crc32fast/src/combine.rs b/external/vendor/crc32fast/src/combine.rs
new file mode 100644
index 0000000..7dc42de
--- /dev/null
+++ b/external/vendor/crc32fast/src/combine.rs
@@ -0,0 +1,55 @@
+const POLY: u32 = 0xedb88320;
+
+static X2N_TABLE: [u32; 32] = [
+ 0x00800000, 0x00008000, 0xedb88320, 0xb1e6b092, 0xa06a2517, 0xed627dae, 0x88d14467, 0xd7bbfe6a,
+ 0xec447f11, 0x8e7ea170, 0x6427800e, 0x4d47bae0, 0x09fe548f, 0x83852d0f, 0x30362f1a, 0x7b5a9cc3,
+ 0x31fec169, 0x9fec022a, 0x6c8dedc4, 0x15d6874d, 0x5fde7a4e, 0xbad90e37, 0x2e4e5eef, 0x4eaba214,
+ 0xa8a472c0, 0x429a969e, 0x148d302a, 0xc40ba6d0, 0xc4e22c3c, 0x40000000, 0x20000000, 0x08000000,
+];
+
+// Calculates a(x) multiplied by b(x) modulo p(x), where p(x) is the CRC polynomial,
+// reflected. For speed, this requires that a not be zero.
+fn multiply(a: u32, mut b: u32) -> u32 {
+ let mut p = 0u32;
+
+ for i in 0..32 {
+ p ^= b & ((a >> (31 - i)) & 1).wrapping_neg();
+ b = (b >> 1) ^ ((b & 1).wrapping_neg() & POLY);
+ }
+
+ p
+}
+
+pub(crate) fn combine(crc1: u32, crc2: u32, len2: u64) -> u32 {
+ // Special case: If the length of the second chunk is zero, return the hash
+ // of the first chunk.
+ if len2 == 0 {
+ return crc1;
+ }
+
+ // We are padding the first checksum with len2-amount of zeroes. For efficiency,
+ // this is done in powers-of-two via a lookup table rather than one by one.
+ let mut p = crc1;
+ let n = 64 - len2.leading_zeros();
+ for i in 0..n {
+ if (len2 >> i & 1) != 0 {
+ p = multiply(X2N_TABLE[(i & 0x1F) as usize], p);
+ }
+ }
+
+ p ^ crc2
+}
+
+#[test]
+fn golden() {
+ assert_eq!(combine(0x0, 0x1, 0x0), 0x0);
+ assert_eq!(combine(0xc401f8c9, 0x00000000, 0x0), 0xc401f8c9);
+ assert_eq!(combine(0x7cba3d5e, 0xe7466d39, 0xb), 0x76365c4f);
+ assert_eq!(combine(0x576c62d6, 0x123256e1, 0x47), 0x579a636);
+ assert_eq!(combine(0x4f626f9a, 0x9e5ccbf5, 0xa59d), 0x98d43168);
+ assert_eq!(combine(0xa09b8a88, 0x815b0f48, 0x40f39511), 0xd7a5f79);
+ assert_eq!(
+ combine(0x7f6a4306, 0xbc929646, 0x828cde72b3e25301),
+ 0xef922dda
+ );
+}
diff --git a/external/vendor/crc32fast/src/lib.rs b/external/vendor/crc32fast/src/lib.rs
new file mode 100644
index 0000000..1a4f591
--- /dev/null
+++ b/external/vendor/crc32fast/src/lib.rs
@@ -0,0 +1,214 @@
+//! Fast, SIMD-accelerated CRC32 (IEEE) checksum computation.
+//!
+//! ## Usage
+//!
+//! ### Simple usage
+//!
+//! For simple use-cases, you can call the [`hash()`] convenience function to
+//! directly compute the CRC32 checksum for a given byte slice:
+//!
+//! ```rust
+//! let checksum = crc32fast::hash(b"foo bar baz");
+//! ```
+//!
+//! ### Advanced usage
+//!
+//! For use-cases that require more flexibility or performance, for example when
+//! processing large amounts of data, you can create and manipulate a [`Hasher`]:
+//!
+//! ```rust
+//! use crc32fast::Hasher;
+//!
+//! let mut hasher = Hasher::new();
+//! hasher.update(b"foo bar baz");
+//! let checksum = hasher.finalize();
+//! ```
+//!
+//! ## Performance
+//!
+//! This crate contains multiple CRC32 implementations:
+//!
+//! - A fast baseline implementation which processes up to 16 bytes per iteration
+//! - An optimized implementation for modern `x86` using `sse` and `pclmulqdq` instructions
+//!
+//! Calling the [`Hasher::new`] constructor at runtime will perform a feature detection to select the most
+//! optimal implementation for the current CPU feature set.
+
+#![cfg_attr(not(feature = "std"), no_std)]
+#![deny(missing_docs)]
+use core::fmt;
+use core::hash;
+
+mod baseline;
+mod combine;
+mod specialized;
+mod table;
+
+/// Computes the CRC32 hash of a byte slice.
+///
+/// Check out [`Hasher`] for more advanced use-cases.
+pub fn hash(buf: &[u8]) -> u32 {
+ let mut h = Hasher::new();
+ h.update(buf);
+ h.finalize()
+}
+
+#[derive(Clone)]
+enum State {
+ Baseline(baseline::State),
+ Specialized(specialized::State),
+}
+
+#[derive(Clone)]
+/// Represents an in-progress CRC32 computation.
+pub struct Hasher {
+ amount: u64,
+ state: State,
+}
+
+const DEFAULT_INIT_STATE: u32 = 0;
+
+impl Hasher {
+ /// Create a new `Hasher`.
+ ///
+ /// This will perform a CPU feature detection at runtime to select the most
+ /// optimal implementation for the current processor architecture.
+ pub fn new() -> Self {
+ Self::new_with_initial(DEFAULT_INIT_STATE)
+ }
+
+ /// Create a new `Hasher` with an initial CRC32 state.
+ ///
+ /// This works just like `Hasher::new`, except that it allows for an initial
+ /// CRC32 state to be passed in.
+ pub fn new_with_initial(init: u32) -> Self {
+ Self::new_with_initial_len(init, 0)
+ }
+
+ /// Create a new `Hasher` with an initial CRC32 state.
+ ///
+ /// As `new_with_initial`, but also accepts a length (in bytes). The
+ /// resulting object can then be used with `combine` to compute `crc(a ||
+ /// b)` from `crc(a)`, `crc(b)`, and `len(b)`.
+ pub fn new_with_initial_len(init: u32, amount: u64) -> Self {
+ Self::internal_new_specialized(init, amount)
+ .unwrap_or_else(|| Self::internal_new_baseline(init, amount))
+ }
+
+ #[doc(hidden)]
+ // Internal-only API. Don't use.
+ pub fn internal_new_baseline(init: u32, amount: u64) -> Self {
+ Hasher {
+ amount,
+ state: State::Baseline(baseline::State::new(init)),
+ }
+ }
+
+ #[doc(hidden)]
+ // Internal-only API. Don't use.
+ pub fn internal_new_specialized(init: u32, amount: u64) -> Option<Self> {
+ {
+ if let Some(state) = specialized::State::new(init) {
+ return Some(Hasher {
+ amount,
+ state: State::Specialized(state),
+ });
+ }
+ }
+ None
+ }
+
+ /// Process the given byte slice and update the hash state.
+ pub fn update(&mut self, buf: &[u8]) {
+ self.amount += buf.len() as u64;
+ match self.state {
+ State::Baseline(ref mut state) => state.update(buf),
+ State::Specialized(ref mut state) => state.update(buf),
+ }
+ }
+
+ /// Finalize the hash state and return the computed CRC32 value.
+ pub fn finalize(self) -> u32 {
+ match self.state {
+ State::Baseline(state) => state.finalize(),
+ State::Specialized(state) => state.finalize(),
+ }
+ }
+
+ /// Reset the hash state.
+ pub fn reset(&mut self) {
+ self.amount = 0;
+ match self.state {
+ State::Baseline(ref mut state) => state.reset(),
+ State::Specialized(ref mut state) => state.reset(),
+ }
+ }
+
+ /// Combine the hash state with the hash state for the subsequent block of bytes.
+ pub fn combine(&mut self, other: &Self) {
+ self.amount += other.amount;
+ let other_crc = other.clone().finalize();
+ match self.state {
+ State::Baseline(ref mut state) => state.combine(other_crc, other.amount),
+ State::Specialized(ref mut state) => state.combine(other_crc, other.amount),
+ }
+ }
+}
+
+impl fmt::Debug for Hasher {
+ fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+ f.debug_struct("crc32fast::Hasher").finish()
+ }
+}
+
+impl Default for Hasher {
+ fn default() -> Self {
+ Self::new()
+ }
+}
+
+impl hash::Hasher for Hasher {
+ fn write(&mut self, bytes: &[u8]) {
+ self.update(bytes)
+ }
+
+ fn finish(&self) -> u64 {
+ u64::from(self.clone().finalize())
+ }
+}
+
+#[cfg(test)]
+mod test {
+ use super::Hasher;
+
+ quickcheck::quickcheck! {
+ fn combine(bytes_1: Vec<u8>, bytes_2: Vec<u8>) -> bool {
+ let mut hash_a = Hasher::new();
+ hash_a.update(&bytes_1);
+ hash_a.update(&bytes_2);
+ let mut hash_b = Hasher::new();
+ hash_b.update(&bytes_2);
+ let mut hash_c = Hasher::new();
+ hash_c.update(&bytes_1);
+ hash_c.combine(&hash_b);
+
+ hash_a.finalize() == hash_c.finalize()
+ }
+
+ fn combine_from_len(bytes_1: Vec<u8>, bytes_2: Vec<u8>) -> bool {
+ let mut hash_a = Hasher::new();
+ hash_a.update(&bytes_1);
+
+ let mut hash_b = Hasher::new();
+ hash_b.update(&bytes_2);
+
+ let mut hash_ab = Hasher::new();
+ hash_ab.update(&bytes_1);
+ hash_ab.update(&bytes_2);
+ let ab = hash_ab.finalize();
+
+ hash_a.combine(&hash_b);
+ hash_a.finalize() == ab
+ }
+ }
+}
diff --git a/external/vendor/crc32fast/src/specialized/aarch64.rs b/external/vendor/crc32fast/src/specialized/aarch64.rs
new file mode 100644
index 0000000..37c0337
--- /dev/null
+++ b/external/vendor/crc32fast/src/specialized/aarch64.rs
@@ -0,0 +1,100 @@
+use core::arch::aarch64 as arch;
+
+#[derive(Clone)]
+pub struct State {
+ state: u32,
+}
+
+impl State {
+ #[cfg(not(feature = "std"))]
+ pub fn new(state: u32) -> Option<Self> {
+ if cfg!(target_feature = "crc") {
+ // SAFETY: The conditions above ensure that all
+ // required instructions are supported by the CPU.
+ Some(Self { state })
+ } else {
+ None
+ }
+ }
+
+ #[cfg(feature = "std")]
+ pub fn new(state: u32) -> Option<Self> {
+ if std::arch::is_aarch64_feature_detected!("crc") {
+ // SAFETY: The conditions above ensure that all
+ // required instructions are supported by the CPU.
+ Some(Self { state })
+ } else {
+ None
+ }
+ }
+
+ pub fn update(&mut self, buf: &[u8]) {
+ // SAFETY: The `State::new` constructor ensures that all
+ // required instructions are supported by the CPU.
+ self.state = unsafe { calculate(self.state, buf) }
+ }
+
+ pub fn finalize(self) -> u32 {
+ self.state
+ }
+
+ pub fn reset(&mut self) {
+ self.state = 0;
+ }
+
+ pub fn combine(&mut self, other: u32, amount: u64) {
+ self.state = crate::combine::combine(self.state, other, amount);
+ }
+}
+
+// target_feature is necessary to allow rustc to inline the crc32* wrappers
+#[target_feature(enable = "crc")]
+pub unsafe fn calculate(crc: u32, data: &[u8]) -> u32 {
+ let mut c32 = !crc;
+ let (pre_quad, quads, post_quad) = data.align_to::<u64>();
+
+ c32 = pre_quad.iter().fold(c32, |acc, &b| arch::__crc32b(acc, b));
+
+ // unrolling increases performance by a lot
+ let mut quad_iter = quads.chunks_exact(8);
+ for chunk in &mut quad_iter {
+ c32 = arch::__crc32d(c32, chunk[0]);
+ c32 = arch::__crc32d(c32, chunk[1]);
+ c32 = arch::__crc32d(c32, chunk[2]);
+ c32 = arch::__crc32d(c32, chunk[3]);
+ c32 = arch::__crc32d(c32, chunk[4]);
+ c32 = arch::__crc32d(c32, chunk[5]);
+ c32 = arch::__crc32d(c32, chunk[6]);
+ c32 = arch::__crc32d(c32, chunk[7]);
+ }
+ c32 = quad_iter
+ .remainder()
+ .iter()
+ .fold(c32, |acc, &q| arch::__crc32d(acc, q));
+
+ c32 = post_quad.iter().fold(c32, |acc, &b| arch::__crc32b(acc, b));
+
+ !c32
+}
+
+#[cfg(test)]
+mod test {
+ quickcheck::quickcheck! {
+ fn check_against_baseline(init: u32, chunks: Vec<(Vec<u8>, usize)>) -> bool {
+ let mut baseline = super::super::super::baseline::State::new(init);
+ let mut aarch64 = super::State::new(init).expect("not supported");
+ for (chunk, mut offset) in chunks {
+ // simulate random alignments by offsetting the slice by up to 15 bytes
+ offset &= 0xF;
+ if chunk.len() <= offset {
+ baseline.update(&chunk);
+ aarch64.update(&chunk);
+ } else {
+ baseline.update(&chunk[offset..]);
+ aarch64.update(&chunk[offset..]);
+ }
+ }
+ aarch64.finalize() == baseline.finalize()
+ }
+ }
+}
diff --git a/external/vendor/crc32fast/src/specialized/mod.rs b/external/vendor/crc32fast/src/specialized/mod.rs
new file mode 100644
index 0000000..e69f1ca
--- /dev/null
+++ b/external/vendor/crc32fast/src/specialized/mod.rs
@@ -0,0 +1,36 @@
+cfg_if::cfg_if! {
+ if #[cfg(all(
+ target_feature = "sse2",
+ any(target_arch = "x86", target_arch = "x86_64")
+ ))] {
+ mod pclmulqdq;
+ pub use self::pclmulqdq::State;
+ } else if #[cfg(all(stable_arm_crc32_intrinsics, target_arch = "aarch64"))] {
+ mod aarch64;
+ pub use self::aarch64::State;
+ } else {
+ #[derive(Clone)]
+ pub enum State {}
+ impl State {
+ pub fn new(_: u32) -> Option<Self> {
+ None
+ }
+
+ pub fn update(&mut self, _buf: &[u8]) {
+ match *self {}
+ }
+
+ pub fn finalize(self) -> u32 {
+ match self{}
+ }
+
+ pub fn reset(&mut self) {
+ match *self {}
+ }
+
+ pub fn combine(&mut self, _other: u32, _amount: u64) {
+ match *self {}
+ }
+ }
+ }
+}
diff --git a/external/vendor/crc32fast/src/specialized/pclmulqdq.rs b/external/vendor/crc32fast/src/specialized/pclmulqdq.rs
new file mode 100644
index 0000000..18a25ae
--- /dev/null
+++ b/external/vendor/crc32fast/src/specialized/pclmulqdq.rs
@@ -0,0 +1,207 @@
+//! Specialized checksum code for the x86 CPU architecture, based on the efficient algorithm described
+//! in the following whitepaper:
+//!
+//! Gopal, V., Ozturk, E., Guilford, J., Wolrich, G., Feghali, W., Dixon, M., & Karakoyunlu, D. (2009).
+//! _Fast CRC computation for generic polynomials using PCLMULQDQ instruction_. Intel.
+//! (Mirror link: <https://fossies.org/linux/zlib-ng/doc/crc-pclmulqdq.pdf>, accessed 2024-05-20)
+//!
+//! Throughout the code, this work is referred to as "the paper".
+
+#[cfg(target_arch = "x86")]
+use core::arch::x86 as arch;
+#[cfg(target_arch = "x86_64")]
+use core::arch::x86_64 as arch;
+
+#[derive(Clone)]
+pub struct State {
+ state: u32,
+}
+
+impl State {
+ #[cfg(not(feature = "std"))]
+ pub fn new(state: u32) -> Option<Self> {
+ if cfg!(target_feature = "pclmulqdq")
+ && cfg!(target_feature = "sse2")
+ && cfg!(target_feature = "sse4.1")
+ {
+ // SAFETY: The conditions above ensure that all
+ // required instructions are supported by the CPU.
+ Some(Self { state })
+ } else {
+ None
+ }
+ }
+
+ #[cfg(feature = "std")]
+ pub fn new(state: u32) -> Option<Self> {
+ if is_x86_feature_detected!("pclmulqdq")
+ && is_x86_feature_detected!("sse2")
+ && is_x86_feature_detected!("sse4.1")
+ {
+ // SAFETY: The conditions above ensure that all
+ // required instructions are supported by the CPU.
+ Some(Self { state })
+ } else {
+ None
+ }
+ }
+
+ pub fn update(&mut self, buf: &[u8]) {
+ // SAFETY: The `State::new` constructor ensures that all
+ // required instructions are supported by the CPU.
+ self.state = unsafe { calculate(self.state, buf) }
+ }
+
+ pub fn finalize(self) -> u32 {
+ self.state
+ }
+
+ pub fn reset(&mut self) {
+ self.state = 0;
+ }
+
+ pub fn combine(&mut self, other: u32, amount: u64) {
+ self.state = crate::combine::combine(self.state, other, amount);
+ }
+}
+
+const K1: i64 = 0x154442bd4;
+const K2: i64 = 0x1c6e41596;
+const K3: i64 = 0x1751997d0;
+const K4: i64 = 0x0ccaa009e;
+const K5: i64 = 0x163cd6124;
+
+const P_X: i64 = 0x1DB710641;
+const U_PRIME: i64 = 0x1F7011641;
+
+#[target_feature(enable = "pclmulqdq", enable = "sse2", enable = "sse4.1")]
+unsafe fn calculate(crc: u32, mut data: &[u8]) -> u32 {
+ // In theory we can accelerate smaller chunks too, but for now just rely on
+ // the fallback implementation as it's too much hassle and doesn't seem too
+ // beneficial.
+ if data.len() < 128 {
+ return crate::baseline::update_fast_16(crc, data);
+ }
+
+ // Step 1: fold by 4 loop
+ let mut x3 = get(&mut data);
+ let mut x2 = get(&mut data);
+ let mut x1 = get(&mut data);
+ let mut x0 = get(&mut data);
+
+ // fold in our initial value, part of the incremental crc checksum
+ x3 = arch::_mm_xor_si128(x3, arch::_mm_cvtsi32_si128(!crc as i32));
+
+ let k1k2 = arch::_mm_set_epi64x(K2, K1);
+ while data.len() >= 64 {
+ x3 = reduce128(x3, get(&mut data), k1k2);
+ x2 = reduce128(x2, get(&mut data), k1k2);
+ x1 = reduce128(x1, get(&mut data), k1k2);
+ x0 = reduce128(x0, get(&mut data), k1k2);
+ }
+
+ let k3k4 = arch::_mm_set_epi64x(K4, K3);
+ let mut x = reduce128(x3, x2, k3k4);
+ x = reduce128(x, x1, k3k4);
+ x = reduce128(x, x0, k3k4);
+
+ // Step 2: fold by 1 loop
+ while data.len() >= 16 {
+ x = reduce128(x, get(&mut data), k3k4);
+ }
+
+ // Perform step 3, reduction from 128 bits to 64 bits. This is
+ // significantly different from the paper and basically doesn't follow it
+ // at all. It's not really clear why, but implementations of this algorithm
+ // in Chrome/Linux diverge in the same way. It is beyond me why this is
+ // different than the paper, maybe the paper has like errata or something?
+ // Unclear.
+ //
+ // It's also not clear to me what's actually happening here and/or why, but
+ // algebraically what's happening is:
+ //
+ // x = (x[0:63] • K4) ^ x[64:127] // 96 bit result
+ // x = ((x[0:31] as u64) • K5) ^ x[32:95] // 64 bit result
+ //
+ // It's... not clear to me what's going on here. The paper itself is pretty
+ // vague on this part but definitely uses different constants at least.
+ // It's not clear to me, reading the paper, where the xor operations are
+ // happening or why things are shifting around. This implementation...
+ // appears to work though!
+ let x = arch::_mm_xor_si128(
+ arch::_mm_clmulepi64_si128(x, k3k4, 0x10),
+ arch::_mm_srli_si128(x, 8),
+ );
+ let x = arch::_mm_xor_si128(
+ arch::_mm_clmulepi64_si128(
+ arch::_mm_and_si128(x, arch::_mm_set_epi32(0, 0, 0, !0)),
+ arch::_mm_set_epi64x(0, K5),
+ 0x00,
+ ),
+ arch::_mm_srli_si128(x, 4),
+ );
+
+ // Perform a Barrett reduction from our now 64 bits to 32 bits. The
+ // algorithm for this is described at the end of the paper, and note that
+ // this also implements the "bit reflected input" variant.
+ let pu = arch::_mm_set_epi64x(U_PRIME, P_X);
+
+ // T1(x) = ⌊(R(x) % x^32)⌋ • μ
+ let t1 = arch::_mm_clmulepi64_si128(
+ arch::_mm_and_si128(x, arch::_mm_set_epi32(0, 0, 0, !0)),
+ pu,
+ 0x10,
+ );
+ // T2(x) = ⌊(T1(x) % x^32)⌋ • P(x)
+ let t2 = arch::_mm_clmulepi64_si128(
+ arch::_mm_and_si128(t1, arch::_mm_set_epi32(0, 0, 0, !0)),
+ pu,
+ 0x00,
+ );
+ // We're doing the bit-reflected variant, so get the upper 32-bits of the
+ // 64-bit result instead of the lower 32-bits.
+ //
+ // C(x) = R(x) ^ T2(x) / x^32
+ let c = arch::_mm_extract_epi32(arch::_mm_xor_si128(x, t2), 1) as u32;
+
+ if !data.is_empty() {
+ crate::baseline::update_fast_16(!c, data)
+ } else {
+ !c
+ }
+}
+
+unsafe fn reduce128(a: arch::__m128i, b: arch::__m128i, keys: arch::__m128i) -> arch::__m128i {
+ let t1 = arch::_mm_clmulepi64_si128(a, keys, 0x00);
+ let t2 = arch::_mm_clmulepi64_si128(a, keys, 0x11);
+ arch::_mm_xor_si128(arch::_mm_xor_si128(b, t1), t2)
+}
+
+unsafe fn get(a: &mut &[u8]) -> arch::__m128i {
+ debug_assert!(a.len() >= 16);
+ let r = arch::_mm_loadu_si128(a.as_ptr() as *const arch::__m128i);
+ *a = &a[16..];
+ r
+}
+
+#[cfg(test)]
+mod test {
+ quickcheck::quickcheck! {
+ fn check_against_baseline(init: u32, chunks: Vec<(Vec<u8>, usize)>) -> bool {
+ let mut baseline = super::super::super::baseline::State::new(init);
+ let mut pclmulqdq = super::State::new(init).expect("not supported");
+ for (chunk, mut offset) in chunks {
+ // simulate random alignments by offsetting the slice by up to 15 bytes
+ offset &= 0xF;
+ if chunk.len() <= offset {
+ baseline.update(&chunk);
+ pclmulqdq.update(&chunk);
+ } else {
+ baseline.update(&chunk[offset..]);
+ pclmulqdq.update(&chunk[offset..]);
+ }
+ }
+ pclmulqdq.finalize() == baseline.finalize()
+ }
+ }
+}
diff --git a/external/vendor/crc32fast/src/table.rs b/external/vendor/crc32fast/src/table.rs
new file mode 100644
index 0000000..78b89c3
--- /dev/null
+++ b/external/vendor/crc32fast/src/table.rs
@@ -0,0 +1,629 @@
+// NOTE: This is static instead of const to ensure that indexing into this table
+// doesn't result in large memmoves when in debug mode, which can significantly
+// impact performance.
+pub static CRC32_TABLE: [[u32; 256]; 16] = [
+ [
+ 0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419, 0x706af48f, 0xe963a535,
+ 0x9e6495a3, 0x0edb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988, 0x09b64c2b, 0x7eb17cbd,
+ 0xe7b82d07, 0x90bf1d91, 0x1db71064, 0x6ab020f2, 0xf3b97148, 0x84be41de, 0x1adad47d,
+ 0x6ddde4eb, 0xf4d4b551, 0x83d385c7, 0x136c9856, 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec,
+ 0x14015c4f, 0x63066cd9, 0xfa0f3d63, 0x8d080df5, 0x3b6e20c8, 0x4c69105e, 0xd56041e4,
+ 0xa2677172, 0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b, 0x35b5a8fa, 0x42b2986c,
+ 0xdbbbc9d6, 0xacbcf940, 0x32d86ce3, 0x45df5c75, 0xdcd60dcf, 0xabd13d59, 0x26d930ac,
+ 0x51de003a, 0xc8d75180, 0xbfd06116, 0x21b4f4b5, 0x56b3c423, 0xcfba9599, 0xb8bda50f,
+ 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924, 0x2f6f7c87, 0x58684c11, 0xc1611dab,
+ 0xb6662d3d, 0x76dc4190, 0x01db7106, 0x98d220bc, 0xefd5102a, 0x71b18589, 0x06b6b51f,
+ 0x9fbfe4a5, 0xe8b8d433, 0x7807c9a2, 0x0f00f934, 0x9609a88e, 0xe10e9818, 0x7f6a0dbb,
+ 0x086d3d2d, 0x91646c97, 0xe6635c01, 0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e,
+ 0x6c0695ed, 0x1b01a57b, 0x8208f4c1, 0xf50fc457, 0x65b0d9c6, 0x12b7e950, 0x8bbeb8ea,
+ 0xfcb9887c, 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, 0xfbd44c65, 0x4db26158, 0x3ab551ce,
+ 0xa3bc0074, 0xd4bb30e2, 0x4adfa541, 0x3dd895d7, 0xa4d1c46d, 0xd3d6f4fb, 0x4369e96a,
+ 0x346ed9fc, 0xad678846, 0xda60b8d0, 0x44042d73, 0x33031de5, 0xaa0a4c5f, 0xdd0d7cc9,
+ 0x5005713c, 0x270241aa, 0xbe0b1010, 0xc90c2086, 0x5768b525, 0x206f85b3, 0xb966d409,
+ 0xce61e49f, 0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, 0x59b33d17, 0x2eb40d81,
+ 0xb7bd5c3b, 0xc0ba6cad, 0xedb88320, 0x9abfb3b6, 0x03b6e20c, 0x74b1d29a, 0xead54739,
+ 0x9dd277af, 0x04db2615, 0x73dc1683, 0xe3630b12, 0x94643b84, 0x0d6d6a3e, 0x7a6a5aa8,
+ 0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1, 0xf00f9344, 0x8708a3d2, 0x1e01f268,
+ 0x6906c2fe, 0xf762575d, 0x806567cb, 0x196c3671, 0x6e6b06e7, 0xfed41b76, 0x89d32be0,
+ 0x10da7a5a, 0x67dd4acc, 0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5, 0xd6d6a3e8,
+ 0xa1d1937e, 0x38d8c2c4, 0x4fdff252, 0xd1bb67f1, 0xa6bc5767, 0x3fb506dd, 0x48b2364b,
+ 0xd80d2bda, 0xaf0a1b4c, 0x36034af6, 0x41047a60, 0xdf60efc3, 0xa867df55, 0x316e8eef,
+ 0x4669be79, 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236, 0xcc0c7795, 0xbb0b4703,
+ 0x220216b9, 0x5505262f, 0xc5ba3bbe, 0xb2bd0b28, 0x2bb45a92, 0x5cb36a04, 0xc2d7ffa7,
+ 0xb5d0cf31, 0x2cd99e8b, 0x5bdeae1d, 0x9b64c2b0, 0xec63f226, 0x756aa39c, 0x026d930a,
+ 0x9c0906a9, 0xeb0e363f, 0x72076785, 0x05005713, 0x95bf4a82, 0xe2b87a14, 0x7bb12bae,
+ 0x0cb61b38, 0x92d28e9b, 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21, 0x86d3d2d4, 0xf1d4e242,
+ 0x68ddb3f8, 0x1fda836e, 0x81be16cd, 0xf6b9265b, 0x6fb077e1, 0x18b74777, 0x88085ae6,
+ 0xff0f6a70, 0x66063bca, 0x11010b5c, 0x8f659eff, 0xf862ae69, 0x616bffd3, 0x166ccf45,
+ 0xa00ae278, 0xd70dd2ee, 0x4e048354, 0x3903b3c2, 0xa7672661, 0xd06016f7, 0x4969474d,
+ 0x3e6e77db, 0xaed16a4a, 0xd9d65adc, 0x40df0b66, 0x37d83bf0, 0xa9bcae53, 0xdebb9ec5,
+ 0x47b2cf7f, 0x30b5ffe9, 0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, 0xbad03605,
+ 0xcdd70693, 0x54de5729, 0x23d967bf, 0xb3667a2e, 0xc4614ab8, 0x5d681b02, 0x2a6f2b94,
+ 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d,
+ ],
+ [
+ 0x00000000, 0x191B3141, 0x32366282, 0x2B2D53C3, 0x646CC504, 0x7D77F445, 0x565AA786,
+ 0x4F4196C7, 0xC8D98A08, 0xD1C2BB49, 0xFAEFE88A, 0xE3F4D9CB, 0xACB54F0C, 0xB5AE7E4D,
+ 0x9E832D8E, 0x87981CCF, 0x4AC21251, 0x53D92310, 0x78F470D3, 0x61EF4192, 0x2EAED755,
+ 0x37B5E614, 0x1C98B5D7, 0x05838496, 0x821B9859, 0x9B00A918, 0xB02DFADB, 0xA936CB9A,
+ 0xE6775D5D, 0xFF6C6C1C, 0xD4413FDF, 0xCD5A0E9E, 0x958424A2, 0x8C9F15E3, 0xA7B24620,
+ 0xBEA97761, 0xF1E8E1A6, 0xE8F3D0E7, 0xC3DE8324, 0xDAC5B265, 0x5D5DAEAA, 0x44469FEB,
+ 0x6F6BCC28, 0x7670FD69, 0x39316BAE, 0x202A5AEF, 0x0B07092C, 0x121C386D, 0xDF4636F3,
+ 0xC65D07B2, 0xED705471, 0xF46B6530, 0xBB2AF3F7, 0xA231C2B6, 0x891C9175, 0x9007A034,
+ 0x179FBCFB, 0x0E848DBA, 0x25A9DE79, 0x3CB2EF38, 0x73F379FF, 0x6AE848BE, 0x41C51B7D,
+ 0x58DE2A3C, 0xF0794F05, 0xE9627E44, 0xC24F2D87, 0xDB541CC6, 0x94158A01, 0x8D0EBB40,
+ 0xA623E883, 0xBF38D9C2, 0x38A0C50D, 0x21BBF44C, 0x0A96A78F, 0x138D96CE, 0x5CCC0009,
+ 0x45D73148, 0x6EFA628B, 0x77E153CA, 0xBABB5D54, 0xA3A06C15, 0x888D3FD6, 0x91960E97,
+ 0xDED79850, 0xC7CCA911, 0xECE1FAD2, 0xF5FACB93, 0x7262D75C, 0x6B79E61D, 0x4054B5DE,
+ 0x594F849F, 0x160E1258, 0x0F152319, 0x243870DA, 0x3D23419B, 0x65FD6BA7, 0x7CE65AE6,
+ 0x57CB0925, 0x4ED03864, 0x0191AEA3, 0x188A9FE2, 0x33A7CC21, 0x2ABCFD60, 0xAD24E1AF,
+ 0xB43FD0EE, 0x9F12832D, 0x8609B26C, 0xC94824AB, 0xD05315EA, 0xFB7E4629, 0xE2657768,
+ 0x2F3F79F6, 0x362448B7, 0x1D091B74, 0x04122A35, 0x4B53BCF2, 0x52488DB3, 0x7965DE70,
+ 0x607EEF31, 0xE7E6F3FE, 0xFEFDC2BF, 0xD5D0917C, 0xCCCBA03D, 0x838A36FA, 0x9A9107BB,
+ 0xB1BC5478, 0xA8A76539, 0x3B83984B, 0x2298A90A, 0x09B5FAC9, 0x10AECB88, 0x5FEF5D4F,
+ 0x46F46C0E, 0x6DD93FCD, 0x74C20E8C, 0xF35A1243, 0xEA412302, 0xC16C70C1, 0xD8774180,
+ 0x9736D747, 0x8E2DE606, 0xA500B5C5, 0xBC1B8484, 0x71418A1A, 0x685ABB5B, 0x4377E898,
+ 0x5A6CD9D9, 0x152D4F1E, 0x0C367E5F, 0x271B2D9C, 0x3E001CDD, 0xB9980012, 0xA0833153,
+ 0x8BAE6290, 0x92B553D1, 0xDDF4C516, 0xC4EFF457, 0xEFC2A794, 0xF6D996D5, 0xAE07BCE9,
+ 0xB71C8DA8, 0x9C31DE6B, 0x852AEF2A, 0xCA6B79ED, 0xD37048AC, 0xF85D1B6F, 0xE1462A2E,
+ 0x66DE36E1, 0x7FC507A0, 0x54E85463, 0x4DF36522, 0x02B2F3E5, 0x1BA9C2A4, 0x30849167,
+ 0x299FA026, 0xE4C5AEB8, 0xFDDE9FF9, 0xD6F3CC3A, 0xCFE8FD7B, 0x80A96BBC, 0x99B25AFD,
+ 0xB29F093E, 0xAB84387F, 0x2C1C24B0, 0x350715F1, 0x1E2A4632, 0x07317773, 0x4870E1B4,
+ 0x516BD0F5, 0x7A468336, 0x635DB277, 0xCBFAD74E, 0xD2E1E60F, 0xF9CCB5CC, 0xE0D7848D,
+ 0xAF96124A, 0xB68D230B, 0x9DA070C8, 0x84BB4189, 0x03235D46, 0x1A386C07, 0x31153FC4,
+ 0x280E0E85, 0x674F9842, 0x7E54A903, 0x5579FAC0, 0x4C62CB81, 0x8138C51F, 0x9823F45E,
+ 0xB30EA79D, 0xAA1596DC, 0xE554001B, 0xFC4F315A, 0xD7626299, 0xCE7953D8, 0x49E14F17,
+ 0x50FA7E56, 0x7BD72D95, 0x62CC1CD4, 0x2D8D8A13, 0x3496BB52, 0x1FBBE891, 0x06A0D9D0,
+ 0x5E7EF3EC, 0x4765C2AD, 0x6C48916E, 0x7553A02F, 0x3A1236E8, 0x230907A9, 0x0824546A,
+ 0x113F652B, 0x96A779E4, 0x8FBC48A5, 0xA4911B66, 0xBD8A2A27, 0xF2CBBCE0, 0xEBD08DA1,
+ 0xC0FDDE62, 0xD9E6EF23, 0x14BCE1BD, 0x0DA7D0FC, 0x268A833F, 0x3F91B27E, 0x70D024B9,
+ 0x69CB15F8, 0x42E6463B, 0x5BFD777A, 0xDC656BB5, 0xC57E5AF4, 0xEE530937, 0xF7483876,
+ 0xB809AEB1, 0xA1129FF0, 0x8A3FCC33, 0x9324FD72,
+ ],
+ [
+ 0x00000000, 0x01C26A37, 0x0384D46E, 0x0246BE59, 0x0709A8DC, 0x06CBC2EB, 0x048D7CB2,
+ 0x054F1685, 0x0E1351B8, 0x0FD13B8F, 0x0D9785D6, 0x0C55EFE1, 0x091AF964, 0x08D89353,
+ 0x0A9E2D0A, 0x0B5C473D, 0x1C26A370, 0x1DE4C947, 0x1FA2771E, 0x1E601D29, 0x1B2F0BAC,
+ 0x1AED619B, 0x18ABDFC2, 0x1969B5F5, 0x1235F2C8, 0x13F798FF, 0x11B126A6, 0x10734C91,
+ 0x153C5A14, 0x14FE3023, 0x16B88E7A, 0x177AE44D, 0x384D46E0, 0x398F2CD7, 0x3BC9928E,
+ 0x3A0BF8B9, 0x3F44EE3C, 0x3E86840B, 0x3CC03A52, 0x3D025065, 0x365E1758, 0x379C7D6F,
+ 0x35DAC336, 0x3418A901, 0x3157BF84, 0x3095D5B3, 0x32D36BEA, 0x331101DD, 0x246BE590,
+ 0x25A98FA7, 0x27EF31FE, 0x262D5BC9, 0x23624D4C, 0x22A0277B, 0x20E69922, 0x2124F315,
+ 0x2A78B428, 0x2BBADE1F, 0x29FC6046, 0x283E0A71, 0x2D711CF4, 0x2CB376C3, 0x2EF5C89A,
+ 0x2F37A2AD, 0x709A8DC0, 0x7158E7F7, 0x731E59AE, 0x72DC3399, 0x7793251C, 0x76514F2B,
+ 0x7417F172, 0x75D59B45, 0x7E89DC78, 0x7F4BB64F, 0x7D0D0816, 0x7CCF6221, 0x798074A4,
+ 0x78421E93, 0x7A04A0CA, 0x7BC6CAFD, 0x6CBC2EB0, 0x6D7E4487, 0x6F38FADE, 0x6EFA90E9,
+ 0x6BB5866C, 0x6A77EC5B, 0x68315202, 0x69F33835, 0x62AF7F08, 0x636D153F, 0x612BAB66,
+ 0x60E9C151, 0x65A6D7D4, 0x6464BDE3, 0x662203BA, 0x67E0698D, 0x48D7CB20, 0x4915A117,
+ 0x4B531F4E, 0x4A917579, 0x4FDE63FC, 0x4E1C09CB, 0x4C5AB792, 0x4D98DDA5, 0x46C49A98,
+ 0x4706F0AF, 0x45404EF6, 0x448224C1, 0x41CD3244, 0x400F5873, 0x4249E62A, 0x438B8C1D,
+ 0x54F16850, 0x55330267, 0x5775BC3E, 0x56B7D609, 0x53F8C08C, 0x523AAABB, 0x507C14E2,
+ 0x51BE7ED5, 0x5AE239E8, 0x5B2053DF, 0x5966ED86, 0x58A487B1, 0x5DEB9134, 0x5C29FB03,
+ 0x5E6F455A, 0x5FAD2F6D, 0xE1351B80, 0xE0F771B7, 0xE2B1CFEE, 0xE373A5D9, 0xE63CB35C,
+ 0xE7FED96B, 0xE5B86732, 0xE47A0D05, 0xEF264A38, 0xEEE4200F, 0xECA29E56, 0xED60F461,
+ 0xE82FE2E4, 0xE9ED88D3, 0xEBAB368A, 0xEA695CBD, 0xFD13B8F0, 0xFCD1D2C7, 0xFE976C9E,
+ 0xFF5506A9, 0xFA1A102C, 0xFBD87A1B, 0xF99EC442, 0xF85CAE75, 0xF300E948, 0xF2C2837F,
+ 0xF0843D26, 0xF1465711, 0xF4094194, 0xF5CB2BA3, 0xF78D95FA, 0xF64FFFCD, 0xD9785D60,
+ 0xD8BA3757, 0xDAFC890E, 0xDB3EE339, 0xDE71F5BC, 0xDFB39F8B, 0xDDF521D2, 0xDC374BE5,
+ 0xD76B0CD8, 0xD6A966EF, 0xD4EFD8B6, 0xD52DB281, 0xD062A404, 0xD1A0CE33, 0xD3E6706A,
+ 0xD2241A5D, 0xC55EFE10, 0xC49C9427, 0xC6DA2A7E, 0xC7184049, 0xC25756CC, 0xC3953CFB,
+ 0xC1D382A2, 0xC011E895, 0xCB4DAFA8, 0xCA8FC59F, 0xC8C97BC6, 0xC90B11F1, 0xCC440774,
+ 0xCD866D43, 0xCFC0D31A, 0xCE02B92D, 0x91AF9640, 0x906DFC77, 0x922B422E, 0x93E92819,
+ 0x96A63E9C, 0x976454AB, 0x9522EAF2, 0x94E080C5, 0x9FBCC7F8, 0x9E7EADCF, 0x9C381396,
+ 0x9DFA79A1, 0x98B56F24, 0x99770513, 0x9B31BB4A, 0x9AF3D17D, 0x8D893530, 0x8C4B5F07,
+ 0x8E0DE15E, 0x8FCF8B69, 0x8A809DEC, 0x8B42F7DB, 0x89044982, 0x88C623B5, 0x839A6488,
+ 0x82580EBF, 0x801EB0E6, 0x81DCDAD1, 0x8493CC54, 0x8551A663, 0x8717183A, 0x86D5720D,
+ 0xA9E2D0A0, 0xA820BA97, 0xAA6604CE, 0xABA46EF9, 0xAEEB787C, 0xAF29124B, 0xAD6FAC12,
+ 0xACADC625, 0xA7F18118, 0xA633EB2F, 0xA4755576, 0xA5B73F41, 0xA0F829C4, 0xA13A43F3,
+ 0xA37CFDAA, 0xA2BE979D, 0xB5C473D0, 0xB40619E7, 0xB640A7BE, 0xB782CD89, 0xB2CDDB0C,
+ 0xB30FB13B, 0xB1490F62, 0xB08B6555, 0xBBD72268, 0xBA15485F, 0xB853F606, 0xB9919C31,
+ 0xBCDE8AB4, 0xBD1CE083, 0xBF5A5EDA, 0xBE9834ED,
+ ],
+ [
+ 0x00000000, 0xB8BC6765, 0xAA09C88B, 0x12B5AFEE, 0x8F629757, 0x37DEF032, 0x256B5FDC,
+ 0x9DD738B9, 0xC5B428EF, 0x7D084F8A, 0x6FBDE064, 0xD7018701, 0x4AD6BFB8, 0xF26AD8DD,
+ 0xE0DF7733, 0x58631056, 0x5019579F, 0xE8A530FA, 0xFA109F14, 0x42ACF871, 0xDF7BC0C8,
+ 0x67C7A7AD, 0x75720843, 0xCDCE6F26, 0x95AD7F70, 0x2D111815, 0x3FA4B7FB, 0x8718D09E,
+ 0x1ACFE827, 0xA2738F42, 0xB0C620AC, 0x087A47C9, 0xA032AF3E, 0x188EC85B, 0x0A3B67B5,
+ 0xB28700D0, 0x2F503869, 0x97EC5F0C, 0x8559F0E2, 0x3DE59787, 0x658687D1, 0xDD3AE0B4,
+ 0xCF8F4F5A, 0x7733283F, 0xEAE41086, 0x525877E3, 0x40EDD80D, 0xF851BF68, 0xF02BF8A1,
+ 0x48979FC4, 0x5A22302A, 0xE29E574F, 0x7F496FF6, 0xC7F50893, 0xD540A77D, 0x6DFCC018,
+ 0x359FD04E, 0x8D23B72B, 0x9F9618C5, 0x272A7FA0, 0xBAFD4719, 0x0241207C, 0x10F48F92,
+ 0xA848E8F7, 0x9B14583D, 0x23A83F58, 0x311D90B6, 0x89A1F7D3, 0x1476CF6A, 0xACCAA80F,
+ 0xBE7F07E1, 0x06C36084, 0x5EA070D2, 0xE61C17B7, 0xF4A9B859, 0x4C15DF3C, 0xD1C2E785,
+ 0x697E80E0, 0x7BCB2F0E, 0xC377486B, 0xCB0D0FA2, 0x73B168C7, 0x6104C729, 0xD9B8A04C,
+ 0x446F98F5, 0xFCD3FF90, 0xEE66507E, 0x56DA371B, 0x0EB9274D, 0xB6054028, 0xA4B0EFC6,
+ 0x1C0C88A3, 0x81DBB01A, 0x3967D77F, 0x2BD27891, 0x936E1FF4, 0x3B26F703, 0x839A9066,
+ 0x912F3F88, 0x299358ED, 0xB4446054, 0x0CF80731, 0x1E4DA8DF, 0xA6F1CFBA, 0xFE92DFEC,
+ 0x462EB889, 0x549B1767, 0xEC277002, 0x71F048BB, 0xC94C2FDE, 0xDBF98030, 0x6345E755,
+ 0x6B3FA09C, 0xD383C7F9, 0xC1366817, 0x798A0F72, 0xE45D37CB, 0x5CE150AE, 0x4E54FF40,
+ 0xF6E89825, 0xAE8B8873, 0x1637EF16, 0x048240F8, 0xBC3E279D, 0x21E91F24, 0x99557841,
+ 0x8BE0D7AF, 0x335CB0CA, 0xED59B63B, 0x55E5D15E, 0x47507EB0, 0xFFEC19D5, 0x623B216C,
+ 0xDA874609, 0xC832E9E7, 0x708E8E82, 0x28ED9ED4, 0x9051F9B1, 0x82E4565F, 0x3A58313A,
+ 0xA78F0983, 0x1F336EE6, 0x0D86C108, 0xB53AA66D, 0xBD40E1A4, 0x05FC86C1, 0x1749292F,
+ 0xAFF54E4A, 0x322276F3, 0x8A9E1196, 0x982BBE78, 0x2097D91D, 0x78F4C94B, 0xC048AE2E,
+ 0xD2FD01C0, 0x6A4166A5, 0xF7965E1C, 0x4F2A3979, 0x5D9F9697, 0xE523F1F2, 0x4D6B1905,
+ 0xF5D77E60, 0xE762D18E, 0x5FDEB6EB, 0xC2098E52, 0x7AB5E937, 0x680046D9, 0xD0BC21BC,
+ 0x88DF31EA, 0x3063568F, 0x22D6F961, 0x9A6A9E04, 0x07BDA6BD, 0xBF01C1D8, 0xADB46E36,
+ 0x15080953, 0x1D724E9A, 0xA5CE29FF, 0xB77B8611, 0x0FC7E174, 0x9210D9CD, 0x2AACBEA8,
+ 0x38191146, 0x80A57623, 0xD8C66675, 0x607A0110, 0x72CFAEFE, 0xCA73C99B, 0x57A4F122,
+ 0xEF189647, 0xFDAD39A9, 0x45115ECC, 0x764DEE06, 0xCEF18963, 0xDC44268D, 0x64F841E8,
+ 0xF92F7951, 0x41931E34, 0x5326B1DA, 0xEB9AD6BF, 0xB3F9C6E9, 0x0B45A18C, 0x19F00E62,
+ 0xA14C6907, 0x3C9B51BE, 0x842736DB, 0x96929935, 0x2E2EFE50, 0x2654B999, 0x9EE8DEFC,
+ 0x8C5D7112, 0x34E11677, 0xA9362ECE, 0x118A49AB, 0x033FE645, 0xBB838120, 0xE3E09176,
+ 0x5B5CF613, 0x49E959FD, 0xF1553E98, 0x6C820621, 0xD43E6144, 0xC68BCEAA, 0x7E37A9CF,
+ 0xD67F4138, 0x6EC3265D, 0x7C7689B3, 0xC4CAEED6, 0x591DD66F, 0xE1A1B10A, 0xF3141EE4,
+ 0x4BA87981, 0x13CB69D7, 0xAB770EB2, 0xB9C2A15C, 0x017EC639, 0x9CA9FE80, 0x241599E5,
+ 0x36A0360B, 0x8E1C516E, 0x866616A7, 0x3EDA71C2, 0x2C6FDE2C, 0x94D3B949, 0x090481F0,
+ 0xB1B8E695, 0xA30D497B, 0x1BB12E1E, 0x43D23E48, 0xFB6E592D, 0xE9DBF6C3, 0x516791A6,
+ 0xCCB0A91F, 0x740CCE7A, 0x66B96194, 0xDE0506F1,
+ ],
+ [
+ 0x00000000, 0x3D6029B0, 0x7AC05360, 0x47A07AD0, 0xF580A6C0, 0xC8E08F70, 0x8F40F5A0,
+ 0xB220DC10, 0x30704BC1, 0x0D106271, 0x4AB018A1, 0x77D03111, 0xC5F0ED01, 0xF890C4B1,
+ 0xBF30BE61, 0x825097D1, 0x60E09782, 0x5D80BE32, 0x1A20C4E2, 0x2740ED52, 0x95603142,
+ 0xA80018F2, 0xEFA06222, 0xD2C04B92, 0x5090DC43, 0x6DF0F5F3, 0x2A508F23, 0x1730A693,
+ 0xA5107A83, 0x98705333, 0xDFD029E3, 0xE2B00053, 0xC1C12F04, 0xFCA106B4, 0xBB017C64,
+ 0x866155D4, 0x344189C4, 0x0921A074, 0x4E81DAA4, 0x73E1F314, 0xF1B164C5, 0xCCD14D75,
+ 0x8B7137A5, 0xB6111E15, 0x0431C205, 0x3951EBB5, 0x7EF19165, 0x4391B8D5, 0xA121B886,
+ 0x9C419136, 0xDBE1EBE6, 0xE681C256, 0x54A11E46, 0x69C137F6, 0x2E614D26, 0x13016496,
+ 0x9151F347, 0xAC31DAF7, 0xEB91A027, 0xD6F18997, 0x64D15587, 0x59B17C37, 0x1E1106E7,
+ 0x23712F57, 0x58F35849, 0x659371F9, 0x22330B29, 0x1F532299, 0xAD73FE89, 0x9013D739,
+ 0xD7B3ADE9, 0xEAD38459, 0x68831388, 0x55E33A38, 0x124340E8, 0x2F236958, 0x9D03B548,
+ 0xA0639CF8, 0xE7C3E628, 0xDAA3CF98, 0x3813CFCB, 0x0573E67B, 0x42D39CAB, 0x7FB3B51B,
+ 0xCD93690B, 0xF0F340BB, 0xB7533A6B, 0x8A3313DB, 0x0863840A, 0x3503ADBA, 0x72A3D76A,
+ 0x4FC3FEDA, 0xFDE322CA, 0xC0830B7A, 0x872371AA, 0xBA43581A, 0x9932774D, 0xA4525EFD,
+ 0xE3F2242D, 0xDE920D9D, 0x6CB2D18D, 0x51D2F83D, 0x167282ED, 0x2B12AB5D, 0xA9423C8C,
+ 0x9422153C, 0xD3826FEC, 0xEEE2465C, 0x5CC29A4C, 0x61A2B3FC, 0x2602C92C, 0x1B62E09C,
+ 0xF9D2E0CF, 0xC4B2C97F, 0x8312B3AF, 0xBE729A1F, 0x0C52460F, 0x31326FBF, 0x7692156F,
+ 0x4BF23CDF, 0xC9A2AB0E, 0xF4C282BE, 0xB362F86E, 0x8E02D1DE, 0x3C220DCE, 0x0142247E,
+ 0x46E25EAE, 0x7B82771E, 0xB1E6B092, 0x8C869922, 0xCB26E3F2, 0xF646CA42, 0x44661652,
+ 0x79063FE2, 0x3EA64532, 0x03C66C82, 0x8196FB53, 0xBCF6D2E3, 0xFB56A833, 0xC6368183,
+ 0x74165D93, 0x49767423, 0x0ED60EF3, 0x33B62743, 0xD1062710, 0xEC660EA0, 0xABC67470,
+ 0x96A65DC0, 0x248681D0, 0x19E6A860, 0x5E46D2B0, 0x6326FB00, 0xE1766CD1, 0xDC164561,
+ 0x9BB63FB1, 0xA6D61601, 0x14F6CA11, 0x2996E3A1, 0x6E369971, 0x5356B0C1, 0x70279F96,
+ 0x4D47B626, 0x0AE7CCF6, 0x3787E546, 0x85A73956, 0xB8C710E6, 0xFF676A36, 0xC2074386,
+ 0x4057D457, 0x7D37FDE7, 0x3A978737, 0x07F7AE87, 0xB5D77297, 0x88B75B27, 0xCF1721F7,
+ 0xF2770847, 0x10C70814, 0x2DA721A4, 0x6A075B74, 0x576772C4, 0xE547AED4, 0xD8278764,
+ 0x9F87FDB4, 0xA2E7D404, 0x20B743D5, 0x1DD76A65, 0x5A7710B5, 0x67173905, 0xD537E515,
+ 0xE857CCA5, 0xAFF7B675, 0x92979FC5, 0xE915E8DB, 0xD475C16B, 0x93D5BBBB, 0xAEB5920B,
+ 0x1C954E1B, 0x21F567AB, 0x66551D7B, 0x5B3534CB, 0xD965A31A, 0xE4058AAA, 0xA3A5F07A,
+ 0x9EC5D9CA, 0x2CE505DA, 0x11852C6A, 0x562556BA, 0x6B457F0A, 0x89F57F59, 0xB49556E9,
+ 0xF3352C39, 0xCE550589, 0x7C75D999, 0x4115F029, 0x06B58AF9, 0x3BD5A349, 0xB9853498,
+ 0x84E51D28, 0xC34567F8, 0xFE254E48, 0x4C059258, 0x7165BBE8, 0x36C5C138, 0x0BA5E888,
+ 0x28D4C7DF, 0x15B4EE6F, 0x521494BF, 0x6F74BD0F, 0xDD54611F, 0xE03448AF, 0xA794327F,
+ 0x9AF41BCF, 0x18A48C1E, 0x25C4A5AE, 0x6264DF7E, 0x5F04F6CE, 0xED242ADE, 0xD044036E,
+ 0x97E479BE, 0xAA84500E, 0x4834505D, 0x755479ED, 0x32F4033D, 0x0F942A8D, 0xBDB4F69D,
+ 0x80D4DF2D, 0xC774A5FD, 0xFA148C4D, 0x78441B9C, 0x4524322C, 0x028448FC, 0x3FE4614C,
+ 0x8DC4BD5C, 0xB0A494EC, 0xF704EE3C, 0xCA64C78C,
+ ],
+ [
+ 0x00000000, 0xCB5CD3A5, 0x4DC8A10B, 0x869472AE, 0x9B914216, 0x50CD91B3, 0xD659E31D,
+ 0x1D0530B8, 0xEC53826D, 0x270F51C8, 0xA19B2366, 0x6AC7F0C3, 0x77C2C07B, 0xBC9E13DE,
+ 0x3A0A6170, 0xF156B2D5, 0x03D6029B, 0xC88AD13E, 0x4E1EA390, 0x85427035, 0x9847408D,
+ 0x531B9328, 0xD58FE186, 0x1ED33223, 0xEF8580F6, 0x24D95353, 0xA24D21FD, 0x6911F258,
+ 0x7414C2E0, 0xBF481145, 0x39DC63EB, 0xF280B04E, 0x07AC0536, 0xCCF0D693, 0x4A64A43D,
+ 0x81387798, 0x9C3D4720, 0x57619485, 0xD1F5E62B, 0x1AA9358E, 0xEBFF875B, 0x20A354FE,
+ 0xA6372650, 0x6D6BF5F5, 0x706EC54D, 0xBB3216E8, 0x3DA66446, 0xF6FAB7E3, 0x047A07AD,
+ 0xCF26D408, 0x49B2A6A6, 0x82EE7503, 0x9FEB45BB, 0x54B7961E, 0xD223E4B0, 0x197F3715,
+ 0xE82985C0, 0x23755665, 0xA5E124CB, 0x6EBDF76E, 0x73B8C7D6, 0xB8E41473, 0x3E7066DD,
+ 0xF52CB578, 0x0F580A6C, 0xC404D9C9, 0x4290AB67, 0x89CC78C2, 0x94C9487A, 0x5F959BDF,
+ 0xD901E971, 0x125D3AD4, 0xE30B8801, 0x28575BA4, 0xAEC3290A, 0x659FFAAF, 0x789ACA17,
+ 0xB3C619B2, 0x35526B1C, 0xFE0EB8B9, 0x0C8E08F7, 0xC7D2DB52, 0x4146A9FC, 0x8A1A7A59,
+ 0x971F4AE1, 0x5C439944, 0xDAD7EBEA, 0x118B384F, 0xE0DD8A9A, 0x2B81593F, 0xAD152B91,
+ 0x6649F834, 0x7B4CC88C, 0xB0101B29, 0x36846987, 0xFDD8BA22, 0x08F40F5A, 0xC3A8DCFF,
+ 0x453CAE51, 0x8E607DF4, 0x93654D4C, 0x58399EE9, 0xDEADEC47, 0x15F13FE2, 0xE4A78D37,
+ 0x2FFB5E92, 0xA96F2C3C, 0x6233FF99, 0x7F36CF21, 0xB46A1C84, 0x32FE6E2A, 0xF9A2BD8F,
+ 0x0B220DC1, 0xC07EDE64, 0x46EAACCA, 0x8DB67F6F, 0x90B34FD7, 0x5BEF9C72, 0xDD7BEEDC,
+ 0x16273D79, 0xE7718FAC, 0x2C2D5C09, 0xAAB92EA7, 0x61E5FD02, 0x7CE0CDBA, 0xB7BC1E1F,
+ 0x31286CB1, 0xFA74BF14, 0x1EB014D8, 0xD5ECC77D, 0x5378B5D3, 0x98246676, 0x852156CE,
+ 0x4E7D856B, 0xC8E9F7C5, 0x03B52460, 0xF2E396B5, 0x39BF4510, 0xBF2B37BE, 0x7477E41B,
+ 0x6972D4A3, 0xA22E0706, 0x24BA75A8, 0xEFE6A60D, 0x1D661643, 0xD63AC5E6, 0x50AEB748,
+ 0x9BF264ED, 0x86F75455, 0x4DAB87F0, 0xCB3FF55E, 0x006326FB, 0xF135942E, 0x3A69478B,
+ 0xBCFD3525, 0x77A1E680, 0x6AA4D638, 0xA1F8059D, 0x276C7733, 0xEC30A496, 0x191C11EE,
+ 0xD240C24B, 0x54D4B0E5, 0x9F886340, 0x828D53F8, 0x49D1805D, 0xCF45F2F3, 0x04192156,
+ 0xF54F9383, 0x3E134026, 0xB8873288, 0x73DBE12D, 0x6EDED195, 0xA5820230, 0x2316709E,
+ 0xE84AA33B, 0x1ACA1375, 0xD196C0D0, 0x5702B27E, 0x9C5E61DB, 0x815B5163, 0x4A0782C6,
+ 0xCC93F068, 0x07CF23CD, 0xF6999118, 0x3DC542BD, 0xBB513013, 0x700DE3B6, 0x6D08D30E,
+ 0xA65400AB, 0x20C07205, 0xEB9CA1A0, 0x11E81EB4, 0xDAB4CD11, 0x5C20BFBF, 0x977C6C1A,
+ 0x8A795CA2, 0x41258F07, 0xC7B1FDA9, 0x0CED2E0C, 0xFDBB9CD9, 0x36E74F7C, 0xB0733DD2,
+ 0x7B2FEE77, 0x662ADECF, 0xAD760D6A, 0x2BE27FC4, 0xE0BEAC61, 0x123E1C2F, 0xD962CF8A,
+ 0x5FF6BD24, 0x94AA6E81, 0x89AF5E39, 0x42F38D9C, 0xC467FF32, 0x0F3B2C97, 0xFE6D9E42,
+ 0x35314DE7, 0xB3A53F49, 0x78F9ECEC, 0x65FCDC54, 0xAEA00FF1, 0x28347D5F, 0xE368AEFA,
+ 0x16441B82, 0xDD18C827, 0x5B8CBA89, 0x90D0692C, 0x8DD55994, 0x46898A31, 0xC01DF89F,
+ 0x0B412B3A, 0xFA1799EF, 0x314B4A4A, 0xB7DF38E4, 0x7C83EB41, 0x6186DBF9, 0xAADA085C,
+ 0x2C4E7AF2, 0xE712A957, 0x15921919, 0xDECECABC, 0x585AB812, 0x93066BB7, 0x8E035B0F,
+ 0x455F88AA, 0xC3CBFA04, 0x089729A1, 0xF9C19B74, 0x329D48D1, 0xB4093A7F, 0x7F55E9DA,
+ 0x6250D962, 0xA90C0AC7, 0x2F987869, 0xE4C4ABCC,
+ ],
+ [
+ 0x00000000, 0xA6770BB4, 0x979F1129, 0x31E81A9D, 0xF44F2413, 0x52382FA7, 0x63D0353A,
+ 0xC5A73E8E, 0x33EF4E67, 0x959845D3, 0xA4705F4E, 0x020754FA, 0xC7A06A74, 0x61D761C0,
+ 0x503F7B5D, 0xF64870E9, 0x67DE9CCE, 0xC1A9977A, 0xF0418DE7, 0x56368653, 0x9391B8DD,
+ 0x35E6B369, 0x040EA9F4, 0xA279A240, 0x5431D2A9, 0xF246D91D, 0xC3AEC380, 0x65D9C834,
+ 0xA07EF6BA, 0x0609FD0E, 0x37E1E793, 0x9196EC27, 0xCFBD399C, 0x69CA3228, 0x582228B5,
+ 0xFE552301, 0x3BF21D8F, 0x9D85163B, 0xAC6D0CA6, 0x0A1A0712, 0xFC5277FB, 0x5A257C4F,
+ 0x6BCD66D2, 0xCDBA6D66, 0x081D53E8, 0xAE6A585C, 0x9F8242C1, 0x39F54975, 0xA863A552,
+ 0x0E14AEE6, 0x3FFCB47B, 0x998BBFCF, 0x5C2C8141, 0xFA5B8AF5, 0xCBB39068, 0x6DC49BDC,
+ 0x9B8CEB35, 0x3DFBE081, 0x0C13FA1C, 0xAA64F1A8, 0x6FC3CF26, 0xC9B4C492, 0xF85CDE0F,
+ 0x5E2BD5BB, 0x440B7579, 0xE27C7ECD, 0xD3946450, 0x75E36FE4, 0xB044516A, 0x16335ADE,
+ 0x27DB4043, 0x81AC4BF7, 0x77E43B1E, 0xD19330AA, 0xE07B2A37, 0x460C2183, 0x83AB1F0D,
+ 0x25DC14B9, 0x14340E24, 0xB2430590, 0x23D5E9B7, 0x85A2E203, 0xB44AF89E, 0x123DF32A,
+ 0xD79ACDA4, 0x71EDC610, 0x4005DC8D, 0xE672D739, 0x103AA7D0, 0xB64DAC64, 0x87A5B6F9,
+ 0x21D2BD4D, 0xE47583C3, 0x42028877, 0x73EA92EA, 0xD59D995E, 0x8BB64CE5, 0x2DC14751,
+ 0x1C295DCC, 0xBA5E5678, 0x7FF968F6, 0xD98E6342, 0xE86679DF, 0x4E11726B, 0xB8590282,
+ 0x1E2E0936, 0x2FC613AB, 0x89B1181F, 0x4C162691, 0xEA612D25, 0xDB8937B8, 0x7DFE3C0C,
+ 0xEC68D02B, 0x4A1FDB9F, 0x7BF7C102, 0xDD80CAB6, 0x1827F438, 0xBE50FF8C, 0x8FB8E511,
+ 0x29CFEEA5, 0xDF879E4C, 0x79F095F8, 0x48188F65, 0xEE6F84D1, 0x2BC8BA5F, 0x8DBFB1EB,
+ 0xBC57AB76, 0x1A20A0C2, 0x8816EAF2, 0x2E61E146, 0x1F89FBDB, 0xB9FEF06F, 0x7C59CEE1,
+ 0xDA2EC555, 0xEBC6DFC8, 0x4DB1D47C, 0xBBF9A495, 0x1D8EAF21, 0x2C66B5BC, 0x8A11BE08,
+ 0x4FB68086, 0xE9C18B32, 0xD82991AF, 0x7E5E9A1B, 0xEFC8763C, 0x49BF7D88, 0x78576715,
+ 0xDE206CA1, 0x1B87522F, 0xBDF0599B, 0x8C184306, 0x2A6F48B2, 0xDC27385B, 0x7A5033EF,
+ 0x4BB82972, 0xEDCF22C6, 0x28681C48, 0x8E1F17FC, 0xBFF70D61, 0x198006D5, 0x47ABD36E,
+ 0xE1DCD8DA, 0xD034C247, 0x7643C9F3, 0xB3E4F77D, 0x1593FCC9, 0x247BE654, 0x820CEDE0,
+ 0x74449D09, 0xD23396BD, 0xE3DB8C20, 0x45AC8794, 0x800BB91A, 0x267CB2AE, 0x1794A833,
+ 0xB1E3A387, 0x20754FA0, 0x86024414, 0xB7EA5E89, 0x119D553D, 0xD43A6BB3, 0x724D6007,
+ 0x43A57A9A, 0xE5D2712E, 0x139A01C7, 0xB5ED0A73, 0x840510EE, 0x22721B5A, 0xE7D525D4,
+ 0x41A22E60, 0x704A34FD, 0xD63D3F49, 0xCC1D9F8B, 0x6A6A943F, 0x5B828EA2, 0xFDF58516,
+ 0x3852BB98, 0x9E25B02C, 0xAFCDAAB1, 0x09BAA105, 0xFFF2D1EC, 0x5985DA58, 0x686DC0C5,
+ 0xCE1ACB71, 0x0BBDF5FF, 0xADCAFE4B, 0x9C22E4D6, 0x3A55EF62, 0xABC30345, 0x0DB408F1,
+ 0x3C5C126C, 0x9A2B19D8, 0x5F8C2756, 0xF9FB2CE2, 0xC813367F, 0x6E643DCB, 0x982C4D22,
+ 0x3E5B4696, 0x0FB35C0B, 0xA9C457BF, 0x6C636931, 0xCA146285, 0xFBFC7818, 0x5D8B73AC,
+ 0x03A0A617, 0xA5D7ADA3, 0x943FB73E, 0x3248BC8A, 0xF7EF8204, 0x519889B0, 0x6070932D,
+ 0xC6079899, 0x304FE870, 0x9638E3C4, 0xA7D0F959, 0x01A7F2ED, 0xC400CC63, 0x6277C7D7,
+ 0x539FDD4A, 0xF5E8D6FE, 0x647E3AD9, 0xC209316D, 0xF3E12BF0, 0x55962044, 0x90311ECA,
+ 0x3646157E, 0x07AE0FE3, 0xA1D90457, 0x579174BE, 0xF1E67F0A, 0xC00E6597, 0x66796E23,
+ 0xA3DE50AD, 0x05A95B19, 0x34414184, 0x92364A30,
+ ],
+ [
+ 0x00000000, 0xCCAA009E, 0x4225077D, 0x8E8F07E3, 0x844A0EFA, 0x48E00E64, 0xC66F0987,
+ 0x0AC50919, 0xD3E51BB5, 0x1F4F1B2B, 0x91C01CC8, 0x5D6A1C56, 0x57AF154F, 0x9B0515D1,
+ 0x158A1232, 0xD92012AC, 0x7CBB312B, 0xB01131B5, 0x3E9E3656, 0xF23436C8, 0xF8F13FD1,
+ 0x345B3F4F, 0xBAD438AC, 0x767E3832, 0xAF5E2A9E, 0x63F42A00, 0xED7B2DE3, 0x21D12D7D,
+ 0x2B142464, 0xE7BE24FA, 0x69312319, 0xA59B2387, 0xF9766256, 0x35DC62C8, 0xBB53652B,
+ 0x77F965B5, 0x7D3C6CAC, 0xB1966C32, 0x3F196BD1, 0xF3B36B4F, 0x2A9379E3, 0xE639797D,
+ 0x68B67E9E, 0xA41C7E00, 0xAED97719, 0x62737787, 0xECFC7064, 0x205670FA, 0x85CD537D,
+ 0x496753E3, 0xC7E85400, 0x0B42549E, 0x01875D87, 0xCD2D5D19, 0x43A25AFA, 0x8F085A64,
+ 0x562848C8, 0x9A824856, 0x140D4FB5, 0xD8A74F2B, 0xD2624632, 0x1EC846AC, 0x9047414F,
+ 0x5CED41D1, 0x299DC2ED, 0xE537C273, 0x6BB8C590, 0xA712C50E, 0xADD7CC17, 0x617DCC89,
+ 0xEFF2CB6A, 0x2358CBF4, 0xFA78D958, 0x36D2D9C6, 0xB85DDE25, 0x74F7DEBB, 0x7E32D7A2,
+ 0xB298D73C, 0x3C17D0DF, 0xF0BDD041, 0x5526F3C6, 0x998CF358, 0x1703F4BB, 0xDBA9F425,
+ 0xD16CFD3C, 0x1DC6FDA2, 0x9349FA41, 0x5FE3FADF, 0x86C3E873, 0x4A69E8ED, 0xC4E6EF0E,
+ 0x084CEF90, 0x0289E689, 0xCE23E617, 0x40ACE1F4, 0x8C06E16A, 0xD0EBA0BB, 0x1C41A025,
+ 0x92CEA7C6, 0x5E64A758, 0x54A1AE41, 0x980BAEDF, 0x1684A93C, 0xDA2EA9A2, 0x030EBB0E,
+ 0xCFA4BB90, 0x412BBC73, 0x8D81BCED, 0x8744B5F4, 0x4BEEB56A, 0xC561B289, 0x09CBB217,
+ 0xAC509190, 0x60FA910E, 0xEE7596ED, 0x22DF9673, 0x281A9F6A, 0xE4B09FF4, 0x6A3F9817,
+ 0xA6959889, 0x7FB58A25, 0xB31F8ABB, 0x3D908D58, 0xF13A8DC6, 0xFBFF84DF, 0x37558441,
+ 0xB9DA83A2, 0x7570833C, 0x533B85DA, 0x9F918544, 0x111E82A7, 0xDDB48239, 0xD7718B20,
+ 0x1BDB8BBE, 0x95548C5D, 0x59FE8CC3, 0x80DE9E6F, 0x4C749EF1, 0xC2FB9912, 0x0E51998C,
+ 0x04949095, 0xC83E900B, 0x46B197E8, 0x8A1B9776, 0x2F80B4F1, 0xE32AB46F, 0x6DA5B38C,
+ 0xA10FB312, 0xABCABA0B, 0x6760BA95, 0xE9EFBD76, 0x2545BDE8, 0xFC65AF44, 0x30CFAFDA,
+ 0xBE40A839, 0x72EAA8A7, 0x782FA1BE, 0xB485A120, 0x3A0AA6C3, 0xF6A0A65D, 0xAA4DE78C,
+ 0x66E7E712, 0xE868E0F1, 0x24C2E06F, 0x2E07E976, 0xE2ADE9E8, 0x6C22EE0B, 0xA088EE95,
+ 0x79A8FC39, 0xB502FCA7, 0x3B8DFB44, 0xF727FBDA, 0xFDE2F2C3, 0x3148F25D, 0xBFC7F5BE,
+ 0x736DF520, 0xD6F6D6A7, 0x1A5CD639, 0x94D3D1DA, 0x5879D144, 0x52BCD85D, 0x9E16D8C3,
+ 0x1099DF20, 0xDC33DFBE, 0x0513CD12, 0xC9B9CD8C, 0x4736CA6F, 0x8B9CCAF1, 0x8159C3E8,
+ 0x4DF3C376, 0xC37CC495, 0x0FD6C40B, 0x7AA64737, 0xB60C47A9, 0x3883404A, 0xF42940D4,
+ 0xFEEC49CD, 0x32464953, 0xBCC94EB0, 0x70634E2E, 0xA9435C82, 0x65E95C1C, 0xEB665BFF,
+ 0x27CC5B61, 0x2D095278, 0xE1A352E6, 0x6F2C5505, 0xA386559B, 0x061D761C, 0xCAB77682,
+ 0x44387161, 0x889271FF, 0x825778E6, 0x4EFD7878, 0xC0727F9B, 0x0CD87F05, 0xD5F86DA9,
+ 0x19526D37, 0x97DD6AD4, 0x5B776A4A, 0x51B26353, 0x9D1863CD, 0x1397642E, 0xDF3D64B0,
+ 0x83D02561, 0x4F7A25FF, 0xC1F5221C, 0x0D5F2282, 0x079A2B9B, 0xCB302B05, 0x45BF2CE6,
+ 0x89152C78, 0x50353ED4, 0x9C9F3E4A, 0x121039A9, 0xDEBA3937, 0xD47F302E, 0x18D530B0,
+ 0x965A3753, 0x5AF037CD, 0xFF6B144A, 0x33C114D4, 0xBD4E1337, 0x71E413A9, 0x7B211AB0,
+ 0xB78B1A2E, 0x39041DCD, 0xF5AE1D53, 0x2C8E0FFF, 0xE0240F61, 0x6EAB0882, 0xA201081C,
+ 0xA8C40105, 0x646E019B, 0xEAE10678, 0x264B06E6,
+ ],
+ [
+ 0x00000000, 0x177B1443, 0x2EF62886, 0x398D3CC5, 0x5DEC510C, 0x4A97454F, 0x731A798A,
+ 0x64616DC9, 0xBBD8A218, 0xACA3B65B, 0x952E8A9E, 0x82559EDD, 0xE634F314, 0xF14FE757,
+ 0xC8C2DB92, 0xDFB9CFD1, 0xACC04271, 0xBBBB5632, 0x82366AF7, 0x954D7EB4, 0xF12C137D,
+ 0xE657073E, 0xDFDA3BFB, 0xC8A12FB8, 0x1718E069, 0x0063F42A, 0x39EEC8EF, 0x2E95DCAC,
+ 0x4AF4B165, 0x5D8FA526, 0x640299E3, 0x73798DA0, 0x82F182A3, 0x958A96E0, 0xAC07AA25,
+ 0xBB7CBE66, 0xDF1DD3AF, 0xC866C7EC, 0xF1EBFB29, 0xE690EF6A, 0x392920BB, 0x2E5234F8,
+ 0x17DF083D, 0x00A41C7E, 0x64C571B7, 0x73BE65F4, 0x4A335931, 0x5D484D72, 0x2E31C0D2,
+ 0x394AD491, 0x00C7E854, 0x17BCFC17, 0x73DD91DE, 0x64A6859D, 0x5D2BB958, 0x4A50AD1B,
+ 0x95E962CA, 0x82927689, 0xBB1F4A4C, 0xAC645E0F, 0xC80533C6, 0xDF7E2785, 0xE6F31B40,
+ 0xF1880F03, 0xDE920307, 0xC9E91744, 0xF0642B81, 0xE71F3FC2, 0x837E520B, 0x94054648,
+ 0xAD887A8D, 0xBAF36ECE, 0x654AA11F, 0x7231B55C, 0x4BBC8999, 0x5CC79DDA, 0x38A6F013,
+ 0x2FDDE450, 0x1650D895, 0x012BCCD6, 0x72524176, 0x65295535, 0x5CA469F0, 0x4BDF7DB3,
+ 0x2FBE107A, 0x38C50439, 0x014838FC, 0x16332CBF, 0xC98AE36E, 0xDEF1F72D, 0xE77CCBE8,
+ 0xF007DFAB, 0x9466B262, 0x831DA621, 0xBA909AE4, 0xADEB8EA7, 0x5C6381A4, 0x4B1895E7,
+ 0x7295A922, 0x65EEBD61, 0x018FD0A8, 0x16F4C4EB, 0x2F79F82E, 0x3802EC6D, 0xE7BB23BC,
+ 0xF0C037FF, 0xC94D0B3A, 0xDE361F79, 0xBA5772B0, 0xAD2C66F3, 0x94A15A36, 0x83DA4E75,
+ 0xF0A3C3D5, 0xE7D8D796, 0xDE55EB53, 0xC92EFF10, 0xAD4F92D9, 0xBA34869A, 0x83B9BA5F,
+ 0x94C2AE1C, 0x4B7B61CD, 0x5C00758E, 0x658D494B, 0x72F65D08, 0x169730C1, 0x01EC2482,
+ 0x38611847, 0x2F1A0C04, 0x6655004F, 0x712E140C, 0x48A328C9, 0x5FD83C8A, 0x3BB95143,
+ 0x2CC24500, 0x154F79C5, 0x02346D86, 0xDD8DA257, 0xCAF6B614, 0xF37B8AD1, 0xE4009E92,
+ 0x8061F35B, 0x971AE718, 0xAE97DBDD, 0xB9ECCF9E, 0xCA95423E, 0xDDEE567D, 0xE4636AB8,
+ 0xF3187EFB, 0x97791332, 0x80020771, 0xB98F3BB4, 0xAEF42FF7, 0x714DE026, 0x6636F465,
+ 0x5FBBC8A0, 0x48C0DCE3, 0x2CA1B12A, 0x3BDAA569, 0x025799AC, 0x152C8DEF, 0xE4A482EC,
+ 0xF3DF96AF, 0xCA52AA6A, 0xDD29BE29, 0xB948D3E0, 0xAE33C7A3, 0x97BEFB66, 0x80C5EF25,
+ 0x5F7C20F4, 0x480734B7, 0x718A0872, 0x66F11C31, 0x029071F8, 0x15EB65BB, 0x2C66597E,
+ 0x3B1D4D3D, 0x4864C09D, 0x5F1FD4DE, 0x6692E81B, 0x71E9FC58, 0x15889191, 0x02F385D2,
+ 0x3B7EB917, 0x2C05AD54, 0xF3BC6285, 0xE4C776C6, 0xDD4A4A03, 0xCA315E40, 0xAE503389,
+ 0xB92B27CA, 0x80A61B0F, 0x97DD0F4C, 0xB8C70348, 0xAFBC170B, 0x96312BCE, 0x814A3F8D,
+ 0xE52B5244, 0xF2504607, 0xCBDD7AC2, 0xDCA66E81, 0x031FA150, 0x1464B513, 0x2DE989D6,
+ 0x3A929D95, 0x5EF3F05C, 0x4988E41F, 0x7005D8DA, 0x677ECC99, 0x14074139, 0x037C557A,
+ 0x3AF169BF, 0x2D8A7DFC, 0x49EB1035, 0x5E900476, 0x671D38B3, 0x70662CF0, 0xAFDFE321,
+ 0xB8A4F762, 0x8129CBA7, 0x9652DFE4, 0xF233B22D, 0xE548A66E, 0xDCC59AAB, 0xCBBE8EE8,
+ 0x3A3681EB, 0x2D4D95A8, 0x14C0A96D, 0x03BBBD2E, 0x67DAD0E7, 0x70A1C4A4, 0x492CF861,
+ 0x5E57EC22, 0x81EE23F3, 0x969537B0, 0xAF180B75, 0xB8631F36, 0xDC0272FF, 0xCB7966BC,
+ 0xF2F45A79, 0xE58F4E3A, 0x96F6C39A, 0x818DD7D9, 0xB800EB1C, 0xAF7BFF5F, 0xCB1A9296,
+ 0xDC6186D5, 0xE5ECBA10, 0xF297AE53, 0x2D2E6182, 0x3A5575C1, 0x03D84904, 0x14A35D47,
+ 0x70C2308E, 0x67B924CD, 0x5E341808, 0x494F0C4B,
+ ],
+ [
+ 0x00000000, 0xEFC26B3E, 0x04F5D03D, 0xEB37BB03, 0x09EBA07A, 0xE629CB44, 0x0D1E7047,
+ 0xE2DC1B79, 0x13D740F4, 0xFC152BCA, 0x172290C9, 0xF8E0FBF7, 0x1A3CE08E, 0xF5FE8BB0,
+ 0x1EC930B3, 0xF10B5B8D, 0x27AE81E8, 0xC86CEAD6, 0x235B51D5, 0xCC993AEB, 0x2E452192,
+ 0xC1874AAC, 0x2AB0F1AF, 0xC5729A91, 0x3479C11C, 0xDBBBAA22, 0x308C1121, 0xDF4E7A1F,
+ 0x3D926166, 0xD2500A58, 0x3967B15B, 0xD6A5DA65, 0x4F5D03D0, 0xA09F68EE, 0x4BA8D3ED,
+ 0xA46AB8D3, 0x46B6A3AA, 0xA974C894, 0x42437397, 0xAD8118A9, 0x5C8A4324, 0xB348281A,
+ 0x587F9319, 0xB7BDF827, 0x5561E35E, 0xBAA38860, 0x51943363, 0xBE56585D, 0x68F38238,
+ 0x8731E906, 0x6C065205, 0x83C4393B, 0x61182242, 0x8EDA497C, 0x65EDF27F, 0x8A2F9941,
+ 0x7B24C2CC, 0x94E6A9F2, 0x7FD112F1, 0x901379CF, 0x72CF62B6, 0x9D0D0988, 0x763AB28B,
+ 0x99F8D9B5, 0x9EBA07A0, 0x71786C9E, 0x9A4FD79D, 0x758DBCA3, 0x9751A7DA, 0x7893CCE4,
+ 0x93A477E7, 0x7C661CD9, 0x8D6D4754, 0x62AF2C6A, 0x89989769, 0x665AFC57, 0x8486E72E,
+ 0x6B448C10, 0x80733713, 0x6FB15C2D, 0xB9148648, 0x56D6ED76, 0xBDE15675, 0x52233D4B,
+ 0xB0FF2632, 0x5F3D4D0C, 0xB40AF60F, 0x5BC89D31, 0xAAC3C6BC, 0x4501AD82, 0xAE361681,
+ 0x41F47DBF, 0xA32866C6, 0x4CEA0DF8, 0xA7DDB6FB, 0x481FDDC5, 0xD1E70470, 0x3E256F4E,
+ 0xD512D44D, 0x3AD0BF73, 0xD80CA40A, 0x37CECF34, 0xDCF97437, 0x333B1F09, 0xC2304484,
+ 0x2DF22FBA, 0xC6C594B9, 0x2907FF87, 0xCBDBE4FE, 0x24198FC0, 0xCF2E34C3, 0x20EC5FFD,
+ 0xF6498598, 0x198BEEA6, 0xF2BC55A5, 0x1D7E3E9B, 0xFFA225E2, 0x10604EDC, 0xFB57F5DF,
+ 0x14959EE1, 0xE59EC56C, 0x0A5CAE52, 0xE16B1551, 0x0EA97E6F, 0xEC756516, 0x03B70E28,
+ 0xE880B52B, 0x0742DE15, 0xE6050901, 0x09C7623F, 0xE2F0D93C, 0x0D32B202, 0xEFEEA97B,
+ 0x002CC245, 0xEB1B7946, 0x04D91278, 0xF5D249F5, 0x1A1022CB, 0xF12799C8, 0x1EE5F2F6,
+ 0xFC39E98F, 0x13FB82B1, 0xF8CC39B2, 0x170E528C, 0xC1AB88E9, 0x2E69E3D7, 0xC55E58D4,
+ 0x2A9C33EA, 0xC8402893, 0x278243AD, 0xCCB5F8AE, 0x23779390, 0xD27CC81D, 0x3DBEA323,
+ 0xD6891820, 0x394B731E, 0xDB976867, 0x34550359, 0xDF62B85A, 0x30A0D364, 0xA9580AD1,
+ 0x469A61EF, 0xADADDAEC, 0x426FB1D2, 0xA0B3AAAB, 0x4F71C195, 0xA4467A96, 0x4B8411A8,
+ 0xBA8F4A25, 0x554D211B, 0xBE7A9A18, 0x51B8F126, 0xB364EA5F, 0x5CA68161, 0xB7913A62,
+ 0x5853515C, 0x8EF68B39, 0x6134E007, 0x8A035B04, 0x65C1303A, 0x871D2B43, 0x68DF407D,
+ 0x83E8FB7E, 0x6C2A9040, 0x9D21CBCD, 0x72E3A0F3, 0x99D41BF0, 0x761670CE, 0x94CA6BB7,
+ 0x7B080089, 0x903FBB8A, 0x7FFDD0B4, 0x78BF0EA1, 0x977D659F, 0x7C4ADE9C, 0x9388B5A2,
+ 0x7154AEDB, 0x9E96C5E5, 0x75A17EE6, 0x9A6315D8, 0x6B684E55, 0x84AA256B, 0x6F9D9E68,
+ 0x805FF556, 0x6283EE2F, 0x8D418511, 0x66763E12, 0x89B4552C, 0x5F118F49, 0xB0D3E477,
+ 0x5BE45F74, 0xB426344A, 0x56FA2F33, 0xB938440D, 0x520FFF0E, 0xBDCD9430, 0x4CC6CFBD,
+ 0xA304A483, 0x48331F80, 0xA7F174BE, 0x452D6FC7, 0xAAEF04F9, 0x41D8BFFA, 0xAE1AD4C4,
+ 0x37E20D71, 0xD820664F, 0x3317DD4C, 0xDCD5B672, 0x3E09AD0B, 0xD1CBC635, 0x3AFC7D36,
+ 0xD53E1608, 0x24354D85, 0xCBF726BB, 0x20C09DB8, 0xCF02F686, 0x2DDEEDFF, 0xC21C86C1,
+ 0x292B3DC2, 0xC6E956FC, 0x104C8C99, 0xFF8EE7A7, 0x14B95CA4, 0xFB7B379A, 0x19A72CE3,
+ 0xF66547DD, 0x1D52FCDE, 0xF29097E0, 0x039BCC6D, 0xEC59A753, 0x076E1C50, 0xE8AC776E,
+ 0x0A706C17, 0xE5B20729, 0x0E85BC2A, 0xE147D714,
+ ],
+ [
+ 0x00000000, 0xC18EDFC0, 0x586CB9C1, 0x99E26601, 0xB0D97382, 0x7157AC42, 0xE8B5CA43,
+ 0x293B1583, 0xBAC3E145, 0x7B4D3E85, 0xE2AF5884, 0x23218744, 0x0A1A92C7, 0xCB944D07,
+ 0x52762B06, 0x93F8F4C6, 0xAEF6C4CB, 0x6F781B0B, 0xF69A7D0A, 0x3714A2CA, 0x1E2FB749,
+ 0xDFA16889, 0x46430E88, 0x87CDD148, 0x1435258E, 0xD5BBFA4E, 0x4C599C4F, 0x8DD7438F,
+ 0xA4EC560C, 0x656289CC, 0xFC80EFCD, 0x3D0E300D, 0x869C8FD7, 0x47125017, 0xDEF03616,
+ 0x1F7EE9D6, 0x3645FC55, 0xF7CB2395, 0x6E294594, 0xAFA79A54, 0x3C5F6E92, 0xFDD1B152,
+ 0x6433D753, 0xA5BD0893, 0x8C861D10, 0x4D08C2D0, 0xD4EAA4D1, 0x15647B11, 0x286A4B1C,
+ 0xE9E494DC, 0x7006F2DD, 0xB1882D1D, 0x98B3389E, 0x593DE75E, 0xC0DF815F, 0x01515E9F,
+ 0x92A9AA59, 0x53277599, 0xCAC51398, 0x0B4BCC58, 0x2270D9DB, 0xE3FE061B, 0x7A1C601A,
+ 0xBB92BFDA, 0xD64819EF, 0x17C6C62F, 0x8E24A02E, 0x4FAA7FEE, 0x66916A6D, 0xA71FB5AD,
+ 0x3EFDD3AC, 0xFF730C6C, 0x6C8BF8AA, 0xAD05276A, 0x34E7416B, 0xF5699EAB, 0xDC528B28,
+ 0x1DDC54E8, 0x843E32E9, 0x45B0ED29, 0x78BEDD24, 0xB93002E4, 0x20D264E5, 0xE15CBB25,
+ 0xC867AEA6, 0x09E97166, 0x900B1767, 0x5185C8A7, 0xC27D3C61, 0x03F3E3A1, 0x9A1185A0,
+ 0x5B9F5A60, 0x72A44FE3, 0xB32A9023, 0x2AC8F622, 0xEB4629E2, 0x50D49638, 0x915A49F8,
+ 0x08B82FF9, 0xC936F039, 0xE00DE5BA, 0x21833A7A, 0xB8615C7B, 0x79EF83BB, 0xEA17777D,
+ 0x2B99A8BD, 0xB27BCEBC, 0x73F5117C, 0x5ACE04FF, 0x9B40DB3F, 0x02A2BD3E, 0xC32C62FE,
+ 0xFE2252F3, 0x3FAC8D33, 0xA64EEB32, 0x67C034F2, 0x4EFB2171, 0x8F75FEB1, 0x169798B0,
+ 0xD7194770, 0x44E1B3B6, 0x856F6C76, 0x1C8D0A77, 0xDD03D5B7, 0xF438C034, 0x35B61FF4,
+ 0xAC5479F5, 0x6DDAA635, 0x77E1359F, 0xB66FEA5F, 0x2F8D8C5E, 0xEE03539E, 0xC738461D,
+ 0x06B699DD, 0x9F54FFDC, 0x5EDA201C, 0xCD22D4DA, 0x0CAC0B1A, 0x954E6D1B, 0x54C0B2DB,
+ 0x7DFBA758, 0xBC757898, 0x25971E99, 0xE419C159, 0xD917F154, 0x18992E94, 0x817B4895,
+ 0x40F59755, 0x69CE82D6, 0xA8405D16, 0x31A23B17, 0xF02CE4D7, 0x63D41011, 0xA25ACFD1,
+ 0x3BB8A9D0, 0xFA367610, 0xD30D6393, 0x1283BC53, 0x8B61DA52, 0x4AEF0592, 0xF17DBA48,
+ 0x30F36588, 0xA9110389, 0x689FDC49, 0x41A4C9CA, 0x802A160A, 0x19C8700B, 0xD846AFCB,
+ 0x4BBE5B0D, 0x8A3084CD, 0x13D2E2CC, 0xD25C3D0C, 0xFB67288F, 0x3AE9F74F, 0xA30B914E,
+ 0x62854E8E, 0x5F8B7E83, 0x9E05A143, 0x07E7C742, 0xC6691882, 0xEF520D01, 0x2EDCD2C1,
+ 0xB73EB4C0, 0x76B06B00, 0xE5489FC6, 0x24C64006, 0xBD242607, 0x7CAAF9C7, 0x5591EC44,
+ 0x941F3384, 0x0DFD5585, 0xCC738A45, 0xA1A92C70, 0x6027F3B0, 0xF9C595B1, 0x384B4A71,
+ 0x11705FF2, 0xD0FE8032, 0x491CE633, 0x889239F3, 0x1B6ACD35, 0xDAE412F5, 0x430674F4,
+ 0x8288AB34, 0xABB3BEB7, 0x6A3D6177, 0xF3DF0776, 0x3251D8B6, 0x0F5FE8BB, 0xCED1377B,
+ 0x5733517A, 0x96BD8EBA, 0xBF869B39, 0x7E0844F9, 0xE7EA22F8, 0x2664FD38, 0xB59C09FE,
+ 0x7412D63E, 0xEDF0B03F, 0x2C7E6FFF, 0x05457A7C, 0xC4CBA5BC, 0x5D29C3BD, 0x9CA71C7D,
+ 0x2735A3A7, 0xE6BB7C67, 0x7F591A66, 0xBED7C5A6, 0x97ECD025, 0x56620FE5, 0xCF8069E4,
+ 0x0E0EB624, 0x9DF642E2, 0x5C789D22, 0xC59AFB23, 0x041424E3, 0x2D2F3160, 0xECA1EEA0,
+ 0x754388A1, 0xB4CD5761, 0x89C3676C, 0x484DB8AC, 0xD1AFDEAD, 0x1021016D, 0x391A14EE,
+ 0xF894CB2E, 0x6176AD2F, 0xA0F872EF, 0x33008629, 0xF28E59E9, 0x6B6C3FE8, 0xAAE2E028,
+ 0x83D9F5AB, 0x42572A6B, 0xDBB54C6A, 0x1A3B93AA,
+ ],
+ [
+ 0x00000000, 0x9BA54C6F, 0xEC3B9E9F, 0x779ED2F0, 0x03063B7F, 0x98A37710, 0xEF3DA5E0,
+ 0x7498E98F, 0x060C76FE, 0x9DA93A91, 0xEA37E861, 0x7192A40E, 0x050A4D81, 0x9EAF01EE,
+ 0xE931D31E, 0x72949F71, 0x0C18EDFC, 0x97BDA193, 0xE0237363, 0x7B863F0C, 0x0F1ED683,
+ 0x94BB9AEC, 0xE325481C, 0x78800473, 0x0A149B02, 0x91B1D76D, 0xE62F059D, 0x7D8A49F2,
+ 0x0912A07D, 0x92B7EC12, 0xE5293EE2, 0x7E8C728D, 0x1831DBF8, 0x83949797, 0xF40A4567,
+ 0x6FAF0908, 0x1B37E087, 0x8092ACE8, 0xF70C7E18, 0x6CA93277, 0x1E3DAD06, 0x8598E169,
+ 0xF2063399, 0x69A37FF6, 0x1D3B9679, 0x869EDA16, 0xF10008E6, 0x6AA54489, 0x14293604,
+ 0x8F8C7A6B, 0xF812A89B, 0x63B7E4F4, 0x172F0D7B, 0x8C8A4114, 0xFB1493E4, 0x60B1DF8B,
+ 0x122540FA, 0x89800C95, 0xFE1EDE65, 0x65BB920A, 0x11237B85, 0x8A8637EA, 0xFD18E51A,
+ 0x66BDA975, 0x3063B7F0, 0xABC6FB9F, 0xDC58296F, 0x47FD6500, 0x33658C8F, 0xA8C0C0E0,
+ 0xDF5E1210, 0x44FB5E7F, 0x366FC10E, 0xADCA8D61, 0xDA545F91, 0x41F113FE, 0x3569FA71,
+ 0xAECCB61E, 0xD95264EE, 0x42F72881, 0x3C7B5A0C, 0xA7DE1663, 0xD040C493, 0x4BE588FC,
+ 0x3F7D6173, 0xA4D82D1C, 0xD346FFEC, 0x48E3B383, 0x3A772CF2, 0xA1D2609D, 0xD64CB26D,
+ 0x4DE9FE02, 0x3971178D, 0xA2D45BE2, 0xD54A8912, 0x4EEFC57D, 0x28526C08, 0xB3F72067,
+ 0xC469F297, 0x5FCCBEF8, 0x2B545777, 0xB0F11B18, 0xC76FC9E8, 0x5CCA8587, 0x2E5E1AF6,
+ 0xB5FB5699, 0xC2658469, 0x59C0C806, 0x2D582189, 0xB6FD6DE6, 0xC163BF16, 0x5AC6F379,
+ 0x244A81F4, 0xBFEFCD9B, 0xC8711F6B, 0x53D45304, 0x274CBA8B, 0xBCE9F6E4, 0xCB772414,
+ 0x50D2687B, 0x2246F70A, 0xB9E3BB65, 0xCE7D6995, 0x55D825FA, 0x2140CC75, 0xBAE5801A,
+ 0xCD7B52EA, 0x56DE1E85, 0x60C76FE0, 0xFB62238F, 0x8CFCF17F, 0x1759BD10, 0x63C1549F,
+ 0xF86418F0, 0x8FFACA00, 0x145F866F, 0x66CB191E, 0xFD6E5571, 0x8AF08781, 0x1155CBEE,
+ 0x65CD2261, 0xFE686E0E, 0x89F6BCFE, 0x1253F091, 0x6CDF821C, 0xF77ACE73, 0x80E41C83,
+ 0x1B4150EC, 0x6FD9B963, 0xF47CF50C, 0x83E227FC, 0x18476B93, 0x6AD3F4E2, 0xF176B88D,
+ 0x86E86A7D, 0x1D4D2612, 0x69D5CF9D, 0xF27083F2, 0x85EE5102, 0x1E4B1D6D, 0x78F6B418,
+ 0xE353F877, 0x94CD2A87, 0x0F6866E8, 0x7BF08F67, 0xE055C308, 0x97CB11F8, 0x0C6E5D97,
+ 0x7EFAC2E6, 0xE55F8E89, 0x92C15C79, 0x09641016, 0x7DFCF999, 0xE659B5F6, 0x91C76706,
+ 0x0A622B69, 0x74EE59E4, 0xEF4B158B, 0x98D5C77B, 0x03708B14, 0x77E8629B, 0xEC4D2EF4,
+ 0x9BD3FC04, 0x0076B06B, 0x72E22F1A, 0xE9476375, 0x9ED9B185, 0x057CFDEA, 0x71E41465,
+ 0xEA41580A, 0x9DDF8AFA, 0x067AC695, 0x50A4D810, 0xCB01947F, 0xBC9F468F, 0x273A0AE0,
+ 0x53A2E36F, 0xC807AF00, 0xBF997DF0, 0x243C319F, 0x56A8AEEE, 0xCD0DE281, 0xBA933071,
+ 0x21367C1E, 0x55AE9591, 0xCE0BD9FE, 0xB9950B0E, 0x22304761, 0x5CBC35EC, 0xC7197983,
+ 0xB087AB73, 0x2B22E71C, 0x5FBA0E93, 0xC41F42FC, 0xB381900C, 0x2824DC63, 0x5AB04312,
+ 0xC1150F7D, 0xB68BDD8D, 0x2D2E91E2, 0x59B6786D, 0xC2133402, 0xB58DE6F2, 0x2E28AA9D,
+ 0x489503E8, 0xD3304F87, 0xA4AE9D77, 0x3F0BD118, 0x4B933897, 0xD03674F8, 0xA7A8A608,
+ 0x3C0DEA67, 0x4E997516, 0xD53C3979, 0xA2A2EB89, 0x3907A7E6, 0x4D9F4E69, 0xD63A0206,
+ 0xA1A4D0F6, 0x3A019C99, 0x448DEE14, 0xDF28A27B, 0xA8B6708B, 0x33133CE4, 0x478BD56B,
+ 0xDC2E9904, 0xABB04BF4, 0x3015079B, 0x428198EA, 0xD924D485, 0xAEBA0675, 0x351F4A1A,
+ 0x4187A395, 0xDA22EFFA, 0xADBC3D0A, 0x36197165,
+ ],
+ [
+ 0x00000000, 0xDD96D985, 0x605CB54B, 0xBDCA6CCE, 0xC0B96A96, 0x1D2FB313, 0xA0E5DFDD,
+ 0x7D730658, 0x5A03D36D, 0x87950AE8, 0x3A5F6626, 0xE7C9BFA3, 0x9ABAB9FB, 0x472C607E,
+ 0xFAE60CB0, 0x2770D535, 0xB407A6DA, 0x69917F5F, 0xD45B1391, 0x09CDCA14, 0x74BECC4C,
+ 0xA92815C9, 0x14E27907, 0xC974A082, 0xEE0475B7, 0x3392AC32, 0x8E58C0FC, 0x53CE1979,
+ 0x2EBD1F21, 0xF32BC6A4, 0x4EE1AA6A, 0x937773EF, 0xB37E4BF5, 0x6EE89270, 0xD322FEBE,
+ 0x0EB4273B, 0x73C72163, 0xAE51F8E6, 0x139B9428, 0xCE0D4DAD, 0xE97D9898, 0x34EB411D,
+ 0x89212DD3, 0x54B7F456, 0x29C4F20E, 0xF4522B8B, 0x49984745, 0x940E9EC0, 0x0779ED2F,
+ 0xDAEF34AA, 0x67255864, 0xBAB381E1, 0xC7C087B9, 0x1A565E3C, 0xA79C32F2, 0x7A0AEB77,
+ 0x5D7A3E42, 0x80ECE7C7, 0x3D268B09, 0xE0B0528C, 0x9DC354D4, 0x40558D51, 0xFD9FE19F,
+ 0x2009381A, 0xBD8D91AB, 0x601B482E, 0xDDD124E0, 0x0047FD65, 0x7D34FB3D, 0xA0A222B8,
+ 0x1D684E76, 0xC0FE97F3, 0xE78E42C6, 0x3A189B43, 0x87D2F78D, 0x5A442E08, 0x27372850,
+ 0xFAA1F1D5, 0x476B9D1B, 0x9AFD449E, 0x098A3771, 0xD41CEEF4, 0x69D6823A, 0xB4405BBF,
+ 0xC9335DE7, 0x14A58462, 0xA96FE8AC, 0x74F93129, 0x5389E41C, 0x8E1F3D99, 0x33D55157,
+ 0xEE4388D2, 0x93308E8A, 0x4EA6570F, 0xF36C3BC1, 0x2EFAE244, 0x0EF3DA5E, 0xD36503DB,
+ 0x6EAF6F15, 0xB339B690, 0xCE4AB0C8, 0x13DC694D, 0xAE160583, 0x7380DC06, 0x54F00933,
+ 0x8966D0B6, 0x34ACBC78, 0xE93A65FD, 0x944963A5, 0x49DFBA20, 0xF415D6EE, 0x29830F6B,
+ 0xBAF47C84, 0x6762A501, 0xDAA8C9CF, 0x073E104A, 0x7A4D1612, 0xA7DBCF97, 0x1A11A359,
+ 0xC7877ADC, 0xE0F7AFE9, 0x3D61766C, 0x80AB1AA2, 0x5D3DC327, 0x204EC57F, 0xFDD81CFA,
+ 0x40127034, 0x9D84A9B1, 0xA06A2517, 0x7DFCFC92, 0xC036905C, 0x1DA049D9, 0x60D34F81,
+ 0xBD459604, 0x008FFACA, 0xDD19234F, 0xFA69F67A, 0x27FF2FFF, 0x9A354331, 0x47A39AB4,
+ 0x3AD09CEC, 0xE7464569, 0x5A8C29A7, 0x871AF022, 0x146D83CD, 0xC9FB5A48, 0x74313686,
+ 0xA9A7EF03, 0xD4D4E95B, 0x094230DE, 0xB4885C10, 0x691E8595, 0x4E6E50A0, 0x93F88925,
+ 0x2E32E5EB, 0xF3A43C6E, 0x8ED73A36, 0x5341E3B3, 0xEE8B8F7D, 0x331D56F8, 0x13146EE2,
+ 0xCE82B767, 0x7348DBA9, 0xAEDE022C, 0xD3AD0474, 0x0E3BDDF1, 0xB3F1B13F, 0x6E6768BA,
+ 0x4917BD8F, 0x9481640A, 0x294B08C4, 0xF4DDD141, 0x89AED719, 0x54380E9C, 0xE9F26252,
+ 0x3464BBD7, 0xA713C838, 0x7A8511BD, 0xC74F7D73, 0x1AD9A4F6, 0x67AAA2AE, 0xBA3C7B2B,
+ 0x07F617E5, 0xDA60CE60, 0xFD101B55, 0x2086C2D0, 0x9D4CAE1E, 0x40DA779B, 0x3DA971C3,
+ 0xE03FA846, 0x5DF5C488, 0x80631D0D, 0x1DE7B4BC, 0xC0716D39, 0x7DBB01F7, 0xA02DD872,
+ 0xDD5EDE2A, 0x00C807AF, 0xBD026B61, 0x6094B2E4, 0x47E467D1, 0x9A72BE54, 0x27B8D29A,
+ 0xFA2E0B1F, 0x875D0D47, 0x5ACBD4C2, 0xE701B80C, 0x3A976189, 0xA9E01266, 0x7476CBE3,
+ 0xC9BCA72D, 0x142A7EA8, 0x695978F0, 0xB4CFA175, 0x0905CDBB, 0xD493143E, 0xF3E3C10B,
+ 0x2E75188E, 0x93BF7440, 0x4E29ADC5, 0x335AAB9D, 0xEECC7218, 0x53061ED6, 0x8E90C753,
+ 0xAE99FF49, 0x730F26CC, 0xCEC54A02, 0x13539387, 0x6E2095DF, 0xB3B64C5A, 0x0E7C2094,
+ 0xD3EAF911, 0xF49A2C24, 0x290CF5A1, 0x94C6996F, 0x495040EA, 0x342346B2, 0xE9B59F37,
+ 0x547FF3F9, 0x89E92A7C, 0x1A9E5993, 0xC7088016, 0x7AC2ECD8, 0xA754355D, 0xDA273305,
+ 0x07B1EA80, 0xBA7B864E, 0x67ED5FCB, 0x409D8AFE, 0x9D0B537B, 0x20C13FB5, 0xFD57E630,
+ 0x8024E068, 0x5DB239ED, 0xE0785523, 0x3DEE8CA6,
+ ],
+ [
+ 0x00000000, 0x9D0FE176, 0xE16EC4AD, 0x7C6125DB, 0x19AC8F1B, 0x84A36E6D, 0xF8C24BB6,
+ 0x65CDAAC0, 0x33591E36, 0xAE56FF40, 0xD237DA9B, 0x4F383BED, 0x2AF5912D, 0xB7FA705B,
+ 0xCB9B5580, 0x5694B4F6, 0x66B23C6C, 0xFBBDDD1A, 0x87DCF8C1, 0x1AD319B7, 0x7F1EB377,
+ 0xE2115201, 0x9E7077DA, 0x037F96AC, 0x55EB225A, 0xC8E4C32C, 0xB485E6F7, 0x298A0781,
+ 0x4C47AD41, 0xD1484C37, 0xAD2969EC, 0x3026889A, 0xCD6478D8, 0x506B99AE, 0x2C0ABC75,
+ 0xB1055D03, 0xD4C8F7C3, 0x49C716B5, 0x35A6336E, 0xA8A9D218, 0xFE3D66EE, 0x63328798,
+ 0x1F53A243, 0x825C4335, 0xE791E9F5, 0x7A9E0883, 0x06FF2D58, 0x9BF0CC2E, 0xABD644B4,
+ 0x36D9A5C2, 0x4AB88019, 0xD7B7616F, 0xB27ACBAF, 0x2F752AD9, 0x53140F02, 0xCE1BEE74,
+ 0x988F5A82, 0x0580BBF4, 0x79E19E2F, 0xE4EE7F59, 0x8123D599, 0x1C2C34EF, 0x604D1134,
+ 0xFD42F042, 0x41B9F7F1, 0xDCB61687, 0xA0D7335C, 0x3DD8D22A, 0x581578EA, 0xC51A999C,
+ 0xB97BBC47, 0x24745D31, 0x72E0E9C7, 0xEFEF08B1, 0x938E2D6A, 0x0E81CC1C, 0x6B4C66DC,
+ 0xF64387AA, 0x8A22A271, 0x172D4307, 0x270BCB9D, 0xBA042AEB, 0xC6650F30, 0x5B6AEE46,
+ 0x3EA74486, 0xA3A8A5F0, 0xDFC9802B, 0x42C6615D, 0x1452D5AB, 0x895D34DD, 0xF53C1106,
+ 0x6833F070, 0x0DFE5AB0, 0x90F1BBC6, 0xEC909E1D, 0x719F7F6B, 0x8CDD8F29, 0x11D26E5F,
+ 0x6DB34B84, 0xF0BCAAF2, 0x95710032, 0x087EE144, 0x741FC49F, 0xE91025E9, 0xBF84911F,
+ 0x228B7069, 0x5EEA55B2, 0xC3E5B4C4, 0xA6281E04, 0x3B27FF72, 0x4746DAA9, 0xDA493BDF,
+ 0xEA6FB345, 0x77605233, 0x0B0177E8, 0x960E969E, 0xF3C33C5E, 0x6ECCDD28, 0x12ADF8F3,
+ 0x8FA21985, 0xD936AD73, 0x44394C05, 0x385869DE, 0xA55788A8, 0xC09A2268, 0x5D95C31E,
+ 0x21F4E6C5, 0xBCFB07B3, 0x8373EFE2, 0x1E7C0E94, 0x621D2B4F, 0xFF12CA39, 0x9ADF60F9,
+ 0x07D0818F, 0x7BB1A454, 0xE6BE4522, 0xB02AF1D4, 0x2D2510A2, 0x51443579, 0xCC4BD40F,
+ 0xA9867ECF, 0x34899FB9, 0x48E8BA62, 0xD5E75B14, 0xE5C1D38E, 0x78CE32F8, 0x04AF1723,
+ 0x99A0F655, 0xFC6D5C95, 0x6162BDE3, 0x1D039838, 0x800C794E, 0xD698CDB8, 0x4B972CCE,
+ 0x37F60915, 0xAAF9E863, 0xCF3442A3, 0x523BA3D5, 0x2E5A860E, 0xB3556778, 0x4E17973A,
+ 0xD318764C, 0xAF795397, 0x3276B2E1, 0x57BB1821, 0xCAB4F957, 0xB6D5DC8C, 0x2BDA3DFA,
+ 0x7D4E890C, 0xE041687A, 0x9C204DA1, 0x012FACD7, 0x64E20617, 0xF9EDE761, 0x858CC2BA,
+ 0x188323CC, 0x28A5AB56, 0xB5AA4A20, 0xC9CB6FFB, 0x54C48E8D, 0x3109244D, 0xAC06C53B,
+ 0xD067E0E0, 0x4D680196, 0x1BFCB560, 0x86F35416, 0xFA9271CD, 0x679D90BB, 0x02503A7B,
+ 0x9F5FDB0D, 0xE33EFED6, 0x7E311FA0, 0xC2CA1813, 0x5FC5F965, 0x23A4DCBE, 0xBEAB3DC8,
+ 0xDB669708, 0x4669767E, 0x3A0853A5, 0xA707B2D3, 0xF1930625, 0x6C9CE753, 0x10FDC288,
+ 0x8DF223FE, 0xE83F893E, 0x75306848, 0x09514D93, 0x945EACE5, 0xA478247F, 0x3977C509,
+ 0x4516E0D2, 0xD81901A4, 0xBDD4AB64, 0x20DB4A12, 0x5CBA6FC9, 0xC1B58EBF, 0x97213A49,
+ 0x0A2EDB3F, 0x764FFEE4, 0xEB401F92, 0x8E8DB552, 0x13825424, 0x6FE371FF, 0xF2EC9089,
+ 0x0FAE60CB, 0x92A181BD, 0xEEC0A466, 0x73CF4510, 0x1602EFD0, 0x8B0D0EA6, 0xF76C2B7D,
+ 0x6A63CA0B, 0x3CF77EFD, 0xA1F89F8B, 0xDD99BA50, 0x40965B26, 0x255BF1E6, 0xB8541090,
+ 0xC435354B, 0x593AD43D, 0x691C5CA7, 0xF413BDD1, 0x8872980A, 0x157D797C, 0x70B0D3BC,
+ 0xEDBF32CA, 0x91DE1711, 0x0CD1F667, 0x5A454291, 0xC74AA3E7, 0xBB2B863C, 0x2624674A,
+ 0x43E9CD8A, 0xDEE62CFC, 0xA2870927, 0x3F88E851,
+ ],
+ [
+ 0x00000000, 0xB9FBDBE8, 0xA886B191, 0x117D6A79, 0x8A7C6563, 0x3387BE8B, 0x22FAD4F2,
+ 0x9B010F1A, 0xCF89CC87, 0x7672176F, 0x670F7D16, 0xDEF4A6FE, 0x45F5A9E4, 0xFC0E720C,
+ 0xED731875, 0x5488C39D, 0x44629F4F, 0xFD9944A7, 0xECE42EDE, 0x551FF536, 0xCE1EFA2C,
+ 0x77E521C4, 0x66984BBD, 0xDF639055, 0x8BEB53C8, 0x32108820, 0x236DE259, 0x9A9639B1,
+ 0x019736AB, 0xB86CED43, 0xA911873A, 0x10EA5CD2, 0x88C53E9E, 0x313EE576, 0x20438F0F,
+ 0x99B854E7, 0x02B95BFD, 0xBB428015, 0xAA3FEA6C, 0x13C43184, 0x474CF219, 0xFEB729F1,
+ 0xEFCA4388, 0x56319860, 0xCD30977A, 0x74CB4C92, 0x65B626EB, 0xDC4DFD03, 0xCCA7A1D1,
+ 0x755C7A39, 0x64211040, 0xDDDACBA8, 0x46DBC4B2, 0xFF201F5A, 0xEE5D7523, 0x57A6AECB,
+ 0x032E6D56, 0xBAD5B6BE, 0xABA8DCC7, 0x1253072F, 0x89520835, 0x30A9D3DD, 0x21D4B9A4,
+ 0x982F624C, 0xCAFB7B7D, 0x7300A095, 0x627DCAEC, 0xDB861104, 0x40871E1E, 0xF97CC5F6,
+ 0xE801AF8F, 0x51FA7467, 0x0572B7FA, 0xBC896C12, 0xADF4066B, 0x140FDD83, 0x8F0ED299,
+ 0x36F50971, 0x27886308, 0x9E73B8E0, 0x8E99E432, 0x37623FDA, 0x261F55A3, 0x9FE48E4B,
+ 0x04E58151, 0xBD1E5AB9, 0xAC6330C0, 0x1598EB28, 0x411028B5, 0xF8EBF35D, 0xE9969924,
+ 0x506D42CC, 0xCB6C4DD6, 0x7297963E, 0x63EAFC47, 0xDA1127AF, 0x423E45E3, 0xFBC59E0B,
+ 0xEAB8F472, 0x53432F9A, 0xC8422080, 0x71B9FB68, 0x60C49111, 0xD93F4AF9, 0x8DB78964,
+ 0x344C528C, 0x253138F5, 0x9CCAE31D, 0x07CBEC07, 0xBE3037EF, 0xAF4D5D96, 0x16B6867E,
+ 0x065CDAAC, 0xBFA70144, 0xAEDA6B3D, 0x1721B0D5, 0x8C20BFCF, 0x35DB6427, 0x24A60E5E,
+ 0x9D5DD5B6, 0xC9D5162B, 0x702ECDC3, 0x6153A7BA, 0xD8A87C52, 0x43A97348, 0xFA52A8A0,
+ 0xEB2FC2D9, 0x52D41931, 0x4E87F0BB, 0xF77C2B53, 0xE601412A, 0x5FFA9AC2, 0xC4FB95D8,
+ 0x7D004E30, 0x6C7D2449, 0xD586FFA1, 0x810E3C3C, 0x38F5E7D4, 0x29888DAD, 0x90735645,
+ 0x0B72595F, 0xB28982B7, 0xA3F4E8CE, 0x1A0F3326, 0x0AE56FF4, 0xB31EB41C, 0xA263DE65,
+ 0x1B98058D, 0x80990A97, 0x3962D17F, 0x281FBB06, 0x91E460EE, 0xC56CA373, 0x7C97789B,
+ 0x6DEA12E2, 0xD411C90A, 0x4F10C610, 0xF6EB1DF8, 0xE7967781, 0x5E6DAC69, 0xC642CE25,
+ 0x7FB915CD, 0x6EC47FB4, 0xD73FA45C, 0x4C3EAB46, 0xF5C570AE, 0xE4B81AD7, 0x5D43C13F,
+ 0x09CB02A2, 0xB030D94A, 0xA14DB333, 0x18B668DB, 0x83B767C1, 0x3A4CBC29, 0x2B31D650,
+ 0x92CA0DB8, 0x8220516A, 0x3BDB8A82, 0x2AA6E0FB, 0x935D3B13, 0x085C3409, 0xB1A7EFE1,
+ 0xA0DA8598, 0x19215E70, 0x4DA99DED, 0xF4524605, 0xE52F2C7C, 0x5CD4F794, 0xC7D5F88E,
+ 0x7E2E2366, 0x6F53491F, 0xD6A892F7, 0x847C8BC6, 0x3D87502E, 0x2CFA3A57, 0x9501E1BF,
+ 0x0E00EEA5, 0xB7FB354D, 0xA6865F34, 0x1F7D84DC, 0x4BF54741, 0xF20E9CA9, 0xE373F6D0,
+ 0x5A882D38, 0xC1892222, 0x7872F9CA, 0x690F93B3, 0xD0F4485B, 0xC01E1489, 0x79E5CF61,
+ 0x6898A518, 0xD1637EF0, 0x4A6271EA, 0xF399AA02, 0xE2E4C07B, 0x5B1F1B93, 0x0F97D80E,
+ 0xB66C03E6, 0xA711699F, 0x1EEAB277, 0x85EBBD6D, 0x3C106685, 0x2D6D0CFC, 0x9496D714,
+ 0x0CB9B558, 0xB5426EB0, 0xA43F04C9, 0x1DC4DF21, 0x86C5D03B, 0x3F3E0BD3, 0x2E4361AA,
+ 0x97B8BA42, 0xC33079DF, 0x7ACBA237, 0x6BB6C84E, 0xD24D13A6, 0x494C1CBC, 0xF0B7C754,
+ 0xE1CAAD2D, 0x583176C5, 0x48DB2A17, 0xF120F1FF, 0xE05D9B86, 0x59A6406E, 0xC2A74F74,
+ 0x7B5C949C, 0x6A21FEE5, 0xD3DA250D, 0x8752E690, 0x3EA93D78, 0x2FD45701, 0x962F8CE9,
+ 0x0D2E83F3, 0xB4D5581B, 0xA5A83262, 0x1C53E98A,
+ ],
+ [
+ 0x00000000, 0xAE689191, 0x87A02563, 0x29C8B4F2, 0xD4314C87, 0x7A59DD16, 0x539169E4,
+ 0xFDF9F875, 0x73139F4F, 0xDD7B0EDE, 0xF4B3BA2C, 0x5ADB2BBD, 0xA722D3C8, 0x094A4259,
+ 0x2082F6AB, 0x8EEA673A, 0xE6273E9E, 0x484FAF0F, 0x61871BFD, 0xCFEF8A6C, 0x32167219,
+ 0x9C7EE388, 0xB5B6577A, 0x1BDEC6EB, 0x9534A1D1, 0x3B5C3040, 0x129484B2, 0xBCFC1523,
+ 0x4105ED56, 0xEF6D7CC7, 0xC6A5C835, 0x68CD59A4, 0x173F7B7D, 0xB957EAEC, 0x909F5E1E,
+ 0x3EF7CF8F, 0xC30E37FA, 0x6D66A66B, 0x44AE1299, 0xEAC68308, 0x642CE432, 0xCA4475A3,
+ 0xE38CC151, 0x4DE450C0, 0xB01DA8B5, 0x1E753924, 0x37BD8DD6, 0x99D51C47, 0xF11845E3,
+ 0x5F70D472, 0x76B86080, 0xD8D0F111, 0x25290964, 0x8B4198F5, 0xA2892C07, 0x0CE1BD96,
+ 0x820BDAAC, 0x2C634B3D, 0x05ABFFCF, 0xABC36E5E, 0x563A962B, 0xF85207BA, 0xD19AB348,
+ 0x7FF222D9, 0x2E7EF6FA, 0x8016676B, 0xA9DED399, 0x07B64208, 0xFA4FBA7D, 0x54272BEC,
+ 0x7DEF9F1E, 0xD3870E8F, 0x5D6D69B5, 0xF305F824, 0xDACD4CD6, 0x74A5DD47, 0x895C2532,
+ 0x2734B4A3, 0x0EFC0051, 0xA09491C0, 0xC859C864, 0x663159F5, 0x4FF9ED07, 0xE1917C96,
+ 0x1C6884E3, 0xB2001572, 0x9BC8A180, 0x35A03011, 0xBB4A572B, 0x1522C6BA, 0x3CEA7248,
+ 0x9282E3D9, 0x6F7B1BAC, 0xC1138A3D, 0xE8DB3ECF, 0x46B3AF5E, 0x39418D87, 0x97291C16,
+ 0xBEE1A8E4, 0x10893975, 0xED70C100, 0x43185091, 0x6AD0E463, 0xC4B875F2, 0x4A5212C8,
+ 0xE43A8359, 0xCDF237AB, 0x639AA63A, 0x9E635E4F, 0x300BCFDE, 0x19C37B2C, 0xB7ABEABD,
+ 0xDF66B319, 0x710E2288, 0x58C6967A, 0xF6AE07EB, 0x0B57FF9E, 0xA53F6E0F, 0x8CF7DAFD,
+ 0x229F4B6C, 0xAC752C56, 0x021DBDC7, 0x2BD50935, 0x85BD98A4, 0x784460D1, 0xD62CF140,
+ 0xFFE445B2, 0x518CD423, 0x5CFDEDF4, 0xF2957C65, 0xDB5DC897, 0x75355906, 0x88CCA173,
+ 0x26A430E2, 0x0F6C8410, 0xA1041581, 0x2FEE72BB, 0x8186E32A, 0xA84E57D8, 0x0626C649,
+ 0xFBDF3E3C, 0x55B7AFAD, 0x7C7F1B5F, 0xD2178ACE, 0xBADAD36A, 0x14B242FB, 0x3D7AF609,
+ 0x93126798, 0x6EEB9FED, 0xC0830E7C, 0xE94BBA8E, 0x47232B1F, 0xC9C94C25, 0x67A1DDB4,
+ 0x4E696946, 0xE001F8D7, 0x1DF800A2, 0xB3909133, 0x9A5825C1, 0x3430B450, 0x4BC29689,
+ 0xE5AA0718, 0xCC62B3EA, 0x620A227B, 0x9FF3DA0E, 0x319B4B9F, 0x1853FF6D, 0xB63B6EFC,
+ 0x38D109C6, 0x96B99857, 0xBF712CA5, 0x1119BD34, 0xECE04541, 0x4288D4D0, 0x6B406022,
+ 0xC528F1B3, 0xADE5A817, 0x038D3986, 0x2A458D74, 0x842D1CE5, 0x79D4E490, 0xD7BC7501,
+ 0xFE74C1F3, 0x501C5062, 0xDEF63758, 0x709EA6C9, 0x5956123B, 0xF73E83AA, 0x0AC77BDF,
+ 0xA4AFEA4E, 0x8D675EBC, 0x230FCF2D, 0x72831B0E, 0xDCEB8A9F, 0xF5233E6D, 0x5B4BAFFC,
+ 0xA6B25789, 0x08DAC618, 0x211272EA, 0x8F7AE37B, 0x01908441, 0xAFF815D0, 0x8630A122,
+ 0x285830B3, 0xD5A1C8C6, 0x7BC95957, 0x5201EDA5, 0xFC697C34, 0x94A42590, 0x3ACCB401,
+ 0x130400F3, 0xBD6C9162, 0x40956917, 0xEEFDF886, 0xC7354C74, 0x695DDDE5, 0xE7B7BADF,
+ 0x49DF2B4E, 0x60179FBC, 0xCE7F0E2D, 0x3386F658, 0x9DEE67C9, 0xB426D33B, 0x1A4E42AA,
+ 0x65BC6073, 0xCBD4F1E2, 0xE21C4510, 0x4C74D481, 0xB18D2CF4, 0x1FE5BD65, 0x362D0997,
+ 0x98459806, 0x16AFFF3C, 0xB8C76EAD, 0x910FDA5F, 0x3F674BCE, 0xC29EB3BB, 0x6CF6222A,
+ 0x453E96D8, 0xEB560749, 0x839B5EED, 0x2DF3CF7C, 0x043B7B8E, 0xAA53EA1F, 0x57AA126A,
+ 0xF9C283FB, 0xD00A3709, 0x7E62A698, 0xF088C1A2, 0x5EE05033, 0x7728E4C1, 0xD9407550,
+ 0x24B98D25, 0x8AD11CB4, 0xA319A846, 0x0D7139D7,
+ ],
+];
diff --git a/external/vendor/log/.cargo-checksum.json b/external/vendor/log/.cargo-checksum.json
new file mode 100644
index 0000000..ec1f007
--- /dev/null
+++ b/external/vendor/log/.cargo-checksum.json
@@ -0,0 +1 @@
+{"files":{".cargo_vcs_info.json":"fe75b2d660e4f5cecfc6e8926b75370a30752399a8d0293a90902fcd3be8caaa",".github/workflows/main.yml":"ec945c9615b558fa1125e012369675daa107997389f25ad70d923898aaf2dd0c","CHANGELOG.md":"a216e6550df9437781c01c09783c59276245b0121d3d39b874675148d412d361","Cargo.lock":"7439a99151c8c47a4df860560ff30531aff5fb80dc7583d3e25652da288b1a38","Cargo.toml":"1471858c37a27ccb84d7274816ead00082c0e4acbbb28acc547a6329e3bdaf22","Cargo.toml.orig":"f9bcbe8c7872abcca77b6a3f8b0346835c17326baa861fa8a0f47b2c9d957ef1","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"6485b8ed310d3f0340bf1ad1f47645069ce4069dcc6bb46c7d5c6faf41de1fdb","README.md":"486c6cf85f99a2a3ea14dbd5fc6d6075fdc047a0dbf2b93682595db0de6a115f","benches/value.rs":"b613ff353d3cf0ef8cb98e4ca461ea929b8ba553fe299f2eb2942d77a5b1b6a0","src/__private_api.rs":"c1b8541fe7b7906a654ad1c23a643c516a3b735de4fbd1d07ca7a7a5754b74ac","src/kv/error.rs":"6dae12424164c33b93915f5e70bd6d99d616c969c8bfb543806721dd9b423981","src/kv/key.rs":"9037de97791fa0fb6def6c44ada324351d10ed0f4db8015c9ac4e90504141b87","src/kv/mod.rs":"a62c4dbfbcf28fc755c3662ea4a1e79268edc15311d5ca97b7f0325cc2dfb43f","src/kv/source.rs":"0f7c3a89c8998fe3805ae35f3e87778bca30a444da9f67964e674028f7864625","src/kv/value.rs":"b6df78e50ca912f2d97fdb1155408b538669e5be237b1f9471f9443c9d01f748","src/lib.rs":"5f47680950577eb5213a99b022f7789c2cf22dc3d6ddacda94a54f8e035c6ca2","src/macros.rs":"34c367a645483e21eee4c7846d0efbf97c29a52156d56536c82cdfe1d226a54d","src/serde.rs":"ead8df70c3ca3fafeed062f7a42d9b6f87bc7826055d71d8c4b77a0a25b57634","tests/integration.rs":"0980b3bd85d36863bc9f355e80bc7cf7987d2599adbc87e8e0082861a08a1097","tests/macros.rs":"a94f3cc181c9ecb30af6b5ca8bd2b4e5accc93689c0eb19051b8479a298dc21b","triagebot.toml":"a135e10c777cd13459559bdf74fb704c1379af7c9b0f70bc49fa6f5a837daa81"},"package":"5e5032e24019045c762d3c0f28f5b6b8bbf38563a65908389bf7978758920897"}
\ No newline at end of file
diff --git a/external/vendor/log/.cargo_vcs_info.json b/external/vendor/log/.cargo_vcs_info.json
new file mode 100644
index 0000000..7cbf962
--- /dev/null
+++ b/external/vendor/log/.cargo_vcs_info.json
@@ -0,0 +1,6 @@
+{
+ "git": {
+ "sha1": "b1e2df7bce7a1b685aa9bfd1db0a5cac1f0fc27d"
+ },
+ "path_in_vcs": ""
+}
\ No newline at end of file
diff --git a/external/vendor/log/.github/workflows/main.yml b/external/vendor/log/.github/workflows/main.yml
new file mode 100644
index 0000000..249cc08
--- /dev/null
+++ b/external/vendor/log/.github/workflows/main.yml
@@ -0,0 +1,117 @@
+name: CI
+on: [push, pull_request]
+
+# Ensure only read permission is granted
+permissions:
+ contents: read
+
+jobs:
+ test:
+ name: Test
+ runs-on: ${{ matrix.os }}
+ strategy:
+ matrix:
+ include:
+ - build: stable
+ os: ubuntu-latest
+ rust: stable
+ - build: beta
+ os: ubuntu-latest
+ rust: beta
+ - build: nightly
+ os: ubuntu-latest
+ rust: nightly
+ - build: macos
+ os: macos-latest
+ rust: stable
+ - build: win32
+ os: windows-latest
+ rust: stable-i686-pc-windows-msvc
+ - build: win64
+ os: windows-latest
+ rust: stable-x86_64-pc-windows-msvc
+ - build: mingw
+ os: windows-latest
+ rust: stable-x86_64-pc-windows-gnu
+ steps:
+ - uses: actions/checkout@v4
+ - uses: dtolnay/rust-toolchain@master
+ with:
+ toolchain: ${{ matrix.rust }}
+ - uses: taiki-e/install-action@cargo-hack
+ - run: cargo hack test --feature-powerset --exclude-features max_level_off,max_level_error,max_level_warn,max_level_info,max_level_debug,max_level_trace,release_max_level_off,release_max_level_error,release_max_level_warn,release_max_level_info,release_max_level_debug,release_max_level_trace
+ - run: cargo run --verbose --manifest-path test_max_level_features/Cargo.toml
+ - run: cargo run --verbose --manifest-path test_max_level_features/Cargo.toml --release
+
+ check:
+ name: Check Format and Clippy
+ runs-on: ubuntu-latest
+ steps:
+ - uses: actions/checkout@v4
+ - uses: dtolnay/rust-toolchain@stable
+ with:
+ components: clippy
+ - run: cargo fmt -- --check
+ - run: cargo fmt --manifest-path test_max_level_features/Cargo.toml -- --check
+ - run: cargo clippy --verbose
+ - run: cargo clippy --verbose --manifest-path test_max_level_features/Cargo.toml
+
+ doc:
+ name: Check Documentation
+ runs-on: ubuntu-latest
+ steps:
+ - uses: actions/checkout@v4
+ - uses: dtolnay/rust-toolchain@stable
+ - name: Run rustdoc
+ env:
+ RUSTDOCFLAGS: "-D warnings"
+ run: cargo doc --verbose --features std,kv,kv_std,kv_sval,kv_serde
+
+ features:
+ name: Feature check
+ runs-on: ubuntu-latest
+ steps:
+ - uses: actions/checkout@v4
+ - uses: dtolnay/rust-toolchain@nightly
+ - run: cargo build --verbose -Z avoid-dev-deps --features kv
+ - run: cargo build --verbose -Z avoid-dev-deps --features "kv std"
+ - run: cargo build --verbose -Z avoid-dev-deps --features "kv kv_sval"
+ - run: cargo build --verbose -Z avoid-dev-deps --features "kv kv_serde"
+ - run: cargo build --verbose -Z avoid-dev-deps --features "kv kv_std"
+ - run: cargo build --verbose -Z avoid-dev-deps --features "kv kv_sval kv_serde"
+
+ minimalv:
+ name: Minimal versions
+ runs-on: ubuntu-latest
+ steps:
+ - uses: actions/checkout@v4
+ - uses: dtolnay/rust-toolchain@nightly
+ - run: cargo build --verbose -Z minimal-versions --features kv
+ - run: cargo build --verbose -Z minimal-versions --features "kv std"
+ - run: cargo build --verbose -Z minimal-versions --features "kv kv_sval"
+ - run: cargo build --verbose -Z minimal-versions --features "kv kv_serde"
+ - run: cargo build --verbose -Z minimal-versions --features "kv kv_std"
+ - run: cargo build --verbose -Z minimal-versions --features "kv kv_sval kv_serde"
+
+ msrv:
+ name: MSRV
+ runs-on: ubuntu-latest
+ steps:
+ - uses: actions/checkout@v4
+ - uses: dtolnay/rust-toolchain@1.68.0
+ with:
+ components: clippy
+ - uses: taiki-e/install-action@cargo-hack
+ - run: cargo hack test --feature-powerset --exclude-features max_level_off,max_level_error,max_level_warn,max_level_info,max_level_debug,max_level_trace,release_max_level_off,release_max_level_error,release_max_level_warn,release_max_level_info,release_max_level_debug,release_max_level_trace
+ - run: cargo run --verbose --manifest-path test_max_level_features/Cargo.toml
+ - run: cargo run --verbose --manifest-path test_max_level_features/Cargo.toml --release
+
+ embedded:
+ name: Embedded
+ runs-on: ubuntu-latest
+ steps:
+ - uses: actions/checkout@v4
+ - uses: dtolnay/rust-toolchain@stable
+ - run: rustup target add thumbv6m-none-eabi riscv32imc-unknown-none-elf
+ - run: cargo build --verbose --target=thumbv6m-none-eabi
+ - run: cargo build --verbose --target=riscv32imc-unknown-none-elf
diff --git a/external/vendor/log/CHANGELOG.md b/external/vendor/log/CHANGELOG.md
new file mode 100644
index 0000000..ff03988
--- /dev/null
+++ b/external/vendor/log/CHANGELOG.md
@@ -0,0 +1,423 @@
+# Change Log
+
+## [Unreleased]
+
+## [0.4.29] - 2025-12-02
+
+## What's Changed
+* perf: reduce llvm-lines of FromStr for `Level` and `LevelFilter` by @dishmaker in https://github.com/rust-lang/log/pull/709
+* Replace serde with serde_core by @Thomasdezeeuw in https://github.com/rust-lang/log/pull/712
+
+## New Contributors
+* @AldaronLau made their first contribution in https://github.com/rust-lang/log/pull/703
+* @dishmaker made their first contribution in https://github.com/rust-lang/log/pull/709
+
+**Full Changelog**: https://github.com/rust-lang/log/compare/0.4.28...0.4.29
+
+## [0.4.28] - 2025-09-02
+
+## What's Changed
+* ci: drop really old trick and ensure MSRV for all feature combo by @tisonkun in https://github.com/rust-lang/log/pull/676
+* Chore: delete compare_exchange method for AtomicUsize on platforms without atomics by @HaoliangXu in https://github.com/rust-lang/log/pull/690
+* Add `increment_severity()` and `decrement_severity()` methods for `Level` and `LevelFilter` by @nebkor in https://github.com/rust-lang/log/pull/692
+
+## New Contributors
+* @xixishidibei made their first contribution in https://github.com/rust-lang/log/pull/677
+* @ZylosLumen made their first contribution in https://github.com/rust-lang/log/pull/688
+* @HaoliangXu made their first contribution in https://github.com/rust-lang/log/pull/690
+* @nebkor made their first contribution in https://github.com/rust-lang/log/pull/692
+
+**Full Changelog**: https://github.com/rust-lang/log/compare/0.4.27...0.4.28
+
+### Notable Changes
+* MSRV is bumped to 1.61.0 in https://github.com/rust-lang/log/pull/676
+
+## [0.4.27] - 2025-03-24
+
+### What's Changed
+* A few minor lint fixes by @nyurik in https://github.com/rust-lang/log/pull/671
+* Enable clippy support for format-like macros by @nyurik in https://github.com/rust-lang/log/pull/665
+* Add an optional logger param by @tisonkun in https://github.com/rust-lang/log/pull/664
+* Pass global logger by value, supplied logger by ref by @KodrAus in https://github.com/rust-lang/log/pull/673
+
+
+**Full Changelog**: https://github.com/rust-lang/log/compare/0.4.26...0.4.27
+
+
+## [0.4.26] - 2025-02-18
+
+### What's Changed
+* Derive `Clone` for `kv::Value` by @SpriteOvO in https://github.com/rust-lang/log/pull/668
+* Add `spdlog-rs` link to crate doc by @SpriteOvO in https://github.com/rust-lang/log/pull/669
+
+
+**Full Changelog**: https://github.com/rust-lang/log/compare/0.4.25...0.4.26
+
+## [0.4.25] - 2025-01-14
+
+### What's Changed
+* Revert loosening of kv cargo features by @KodrAus in https://github.com/rust-lang/log/pull/662
+
+
+**Full Changelog**: https://github.com/rust-lang/log/compare/0.4.24...0.4.25
+
+## [0.4.24] - 2025-01-11
+
+### What's Changed
+* Fix up kv feature activation by @KodrAus in https://github.com/rust-lang/log/pull/659
+
+
+**Full Changelog**: https://github.com/rust-lang/log/compare/0.4.23...0.4.24
+
+## [0.4.23] - 2025-01-10 (yanked)
+
+### What's Changed
+* Fix some typos by @Kleinmarb in https://github.com/rust-lang/log/pull/637
+* Add logforth to implementation by @tisonkun in https://github.com/rust-lang/log/pull/638
+* Add `spdlog-rs` link to README by @SpriteOvO in https://github.com/rust-lang/log/pull/639
+* Add correct lifetime to kv::Value::to_borrowed_str by @stevenroose in https://github.com/rust-lang/log/pull/643
+* docs: Add logforth as an impl by @tisonkun in https://github.com/rust-lang/log/pull/642
+* Add clang_log implementation by @DDAN-17 in https://github.com/rust-lang/log/pull/646
+* Bind lifetimes of &str returned from Key by the lifetime of 'k rather than the lifetime of the Key struct by @gbbosak in https://github.com/rust-lang/log/pull/648
+* Fix up key lifetimes and add method to try get a borrowed key by @KodrAus in https://github.com/rust-lang/log/pull/653
+* Add Ftail implementation by @tjardoo in https://github.com/rust-lang/log/pull/652
+
+### New Contributors
+* @Kleinmarb made their first contribution in https://github.com/rust-lang/log/pull/637
+* @tisonkun made their first contribution in https://github.com/rust-lang/log/pull/638
+* @SpriteOvO made their first contribution in https://github.com/rust-lang/log/pull/639
+* @stevenroose made their first contribution in https://github.com/rust-lang/log/pull/643
+* @DDAN-17 made their first contribution in https://github.com/rust-lang/log/pull/646
+* @gbbosak made their first contribution in https://github.com/rust-lang/log/pull/648
+* @tjardoo made their first contribution in https://github.com/rust-lang/log/pull/652
+
+**Full Changelog**: https://github.com/rust-lang/log/compare/0.4.22...0.4.23
+
+## [0.4.22] - 2024-06-27
+
+### What's Changed
+* Add some clarifications to the library docs by @KodrAus in https://github.com/rust-lang/log/pull/620
+* Add links to `colog` crate by @chrivers in https://github.com/rust-lang/log/pull/621
+* adding line_number test + updating some testing infrastructure by @DIvkov575 in https://github.com/rust-lang/log/pull/619
+* Clarify the actual set of functions that can race in _racy variants by @KodrAus in https://github.com/rust-lang/log/pull/623
+* Replace deprecated std::sync::atomic::spin_loop_hint() by @Catamantaloedis in https://github.com/rust-lang/log/pull/625
+* Check usage of max_level features by @Thomasdezeeuw in https://github.com/rust-lang/log/pull/627
+* Remove unneeded import by @Thomasdezeeuw in https://github.com/rust-lang/log/pull/628
+* Loosen orderings for logger initialization in https://github.com/rust-lang/log/pull/632. Originally by @pwoolcoc in https://github.com/rust-lang/log/pull/599
+* Use Location::caller() for file and line info in https://github.com/rust-lang/log/pull/633. Originally by @Cassy343 in https://github.com/rust-lang/log/pull/520
+
+### New Contributors
+* @chrivers made their first contribution in https://github.com/rust-lang/log/pull/621
+* @DIvkov575 made their first contribution in https://github.com/rust-lang/log/pull/619
+* @Catamantaloedis made their first contribution in https://github.com/rust-lang/log/pull/625
+
+**Full Changelog**: https://github.com/rust-lang/log/compare/0.4.21...0.4.22
+
+## [0.4.21] - 2024-02-27
+
+### What's Changed
+* Minor clippy nits by @nyurik in https://github.com/rust-lang/log/pull/578
+* Simplify Display impl by @nyurik in https://github.com/rust-lang/log/pull/579
+* Set all crates to 2021 edition by @nyurik in https://github.com/rust-lang/log/pull/580
+* Various changes based on review by @Thomasdezeeuw in https://github.com/rust-lang/log/pull/583
+* Fix typo in file_static() method doc by @dimo414 in https://github.com/rust-lang/log/pull/590
+* Specialize empty key value pairs by @EFanZh in https://github.com/rust-lang/log/pull/576
+* Fix incorrect lifetime in Value::to_str() by @peterjoel in https://github.com/rust-lang/log/pull/587
+* Remove some API of the key-value feature by @Thomasdezeeuw in https://github.com/rust-lang/log/pull/585
+* Add logcontrol-log and log-reload by @swsnr in https://github.com/rust-lang/log/pull/595
+* Add Serialization section to kv::Value docs by @Thomasdezeeuw in https://github.com/rust-lang/log/pull/593
+* Rename Value::to_str to to_cow_str by @Thomasdezeeuw in https://github.com/rust-lang/log/pull/592
+* Clarify documentation and simplify initialization of `STATIC_MAX_LEVEL` by @ptosi in https://github.com/rust-lang/log/pull/594
+* Update docs to 2021 edition, test by @nyurik in https://github.com/rust-lang/log/pull/577
+* Add "alterable_logger" link to README.md by @brummer-simon in https://github.com/rust-lang/log/pull/589
+* Normalize line ending by @EFanZh in https://github.com/rust-lang/log/pull/602
+* Remove `ok_or` in favor of `Option::ok_or` by @AngelicosPhosphoros in https://github.com/rust-lang/log/pull/607
+* Use `Acquire` ordering for initialization check by @AngelicosPhosphoros in https://github.com/rust-lang/log/pull/610
+* Get structured logging API ready for stabilization by @KodrAus in https://github.com/rust-lang/log/pull/613
+
+### New Contributors
+* @nyurik made their first contribution in https://github.com/rust-lang/log/pull/578
+* @dimo414 made their first contribution in https://github.com/rust-lang/log/pull/590
+* @peterjoel made their first contribution in https://github.com/rust-lang/log/pull/587
+* @ptosi made their first contribution in https://github.com/rust-lang/log/pull/594
+* @brummer-simon made their first contribution in https://github.com/rust-lang/log/pull/589
+* @AngelicosPhosphoros made their first contribution in https://github.com/rust-lang/log/pull/607
+
+## [0.4.20] - 2023-07-11
+
+* Remove rustversion dev-dependency by @Thomasdezeeuw in https://github.com/rust-lang/log/pull/568
+* Remove `local_inner_macros` usage by @EFanZh in https://github.com/rust-lang/log/pull/570
+
+## [0.4.19] - 2023-06-10
+
+* Use target_has_atomic instead of the old atomic_cas cfg by @GuillaumeGomez in https://github.com/rust-lang/log/pull/555
+* Put MSRV into Cargo.toml by @est31 in https://github.com/rust-lang/log/pull/557
+
+## [0.4.18] - 2023-05-28
+
+* fix Markdown links (again) by @hellow554 in https://github.com/rust-lang/log/pull/513
+* add cargo doc to workflow by @hellow554 in https://github.com/rust-lang/log/pull/515
+* Apply Clippy lints by @hellow554 in https://github.com/rust-lang/log/pull/516
+* Replace ad-hoc eq_ignore_ascii_case with slice::eq_ignore_ascii_case by @glandium in https://github.com/rust-lang/log/pull/519
+* fix up windows targets by @KodrAus in https://github.com/rust-lang/log/pull/528
+* typo fix by @jiangying000 in https://github.com/rust-lang/log/pull/529
+* Remove dependency on cfg_if by @EriKWDev in https://github.com/rust-lang/log/pull/536
+* GitHub Workflows security hardening by @sashashura in https://github.com/rust-lang/log/pull/538
+* Fix build status badge by @atouchet in https://github.com/rust-lang/log/pull/539
+* Add call_logger to the documentation by @a1ecbr0wn in https://github.com/rust-lang/log/pull/547
+* Use stable internals for key-value API by @KodrAus in https://github.com/rust-lang/log/pull/550
+* Change wording of list of implementations by @Thomasdezeeuw in https://github.com/rust-lang/log/pull/553
+* Add std-logger to list of implementations by @Thomasdezeeuw in https://github.com/rust-lang/log/pull/554
+* Add `set_max_level_racy` and gate `set_max_level` by @djkoloski in https://github.com/rust-lang/log/pull/544
+* [doc] src/lib.rs : prefix an unused variable with an underscore by @OccupyMars2025 in https://github.com/rust-lang/log/pull/561
+* [doc] src/macros.rs : correct grammar errors of an example in lib documentation by @OccupyMars2025 in https://github.com/rust-lang/log/pull/562
+
+## [0.4.17] - 2022-04-29
+
+* Update `kv_unstable` internal dependencies.
+
+## [0.4.16] - 2022-03-22
+
+* Fix a conflict with unqualified `Option` use in macros.
+
+## [0.4.15] - 2022-02-23
+
+* Silence a warning about the deprecated `spin_loop_hint`.
+* Relax ordering in the atomic `set_max_level` call.
+* Add thumbv4t-none-eabi to targets that don't support atomics
+* Allow levels to be iterated over.
+* Implement `Log` on some common wrapper types.
+* Improvements to test coverage.
+* Improvements to documentation.
+* Add key-value support to the `log!` macros.
+* Tighten `kv_unstable` internal dependencies, so they don't bump past their current alpha.
+* Add a simple visit API to `kv_unstable`.
+* Support `NonZero*` integers as values in structured logging
+* Support static strings as keys in structured logging
+
+## [0.4.14] - 2021-01-27
+
+* Remove the `__private_api_log_lit` special case.
+* Fixed incorrect combination of `kv_unstable` and `std` features causing compile failures.
+* Remove unstable `Value::to_*` conversions that were incorrectly using `as`.
+* Rename unstable `Value::to_error` to `Value::to_borrowed_error`.
+
+## [0.4.13] - 2021-01-11
+
+* This is the same as `0.4.11`, except with a `kv_unstable_std` feature added to aid migrating current dependents to `0.4.14` (which was originally going to be `0.4.13` until it was decided to create a patch from `0.4.11` to minimize disruption).
+
+## [0.4.12] - 2020-12-24
+
+### New
+
+* Support platforms without atomics by racing instead of failing to compile
+* Implement `Log` for `Box<T: Log>`
+* Update `cfg-if` to `1.0`
+* Internal reworks of the structured logging API. Removed the `Fill` API
+and added `source::as_map` and `source::as_list` to easily serialize a `Source`
+as either a map of `{key: value, ..}` or as a list of `[(key, value), ..]`.
+
+### Fixed
+
+* Fixed deserialization of `LevelFilter` to use their `u64` index variants
+
+## [0.4.11] - 2020-07-09
+
+### New
+
+* Support coercing structured values into concrete types.
+* Reference the `win_dbg_logger` in the readme.
+
+### Fixed
+
+* Updates a few deprecated items used internally.
+* Fixed issues in docs and expands sections.
+* Show the correct build badge in the readme.
+* Fix up a possible inference breakage with structured value errors.
+* Respect formatting flags in structured value formatting.
+
+## [0.4.10] - 2019-12-16 (yanked)
+
+### Fixed
+
+* Fixed the `log!` macros, so they work in expression context (this regressed in `0.4.9`, which has been yanked).
+
+## [0.4.9] - 2019-12-12 (yanked)
+
+### Minimum Supported Rust Version
+
+This release bumps the minimum compiler version to `1.31.0`. This was mainly needed for `cfg-if`,
+but between `1.16.0` and `1.31.0` there are a lot of language and library improvements we now
+take advantage of.
+
+### New
+
+* Unstable support for capturing key-value pairs in a record using the `log!` macros
+
+### Improved
+
+* Better documentation for max level filters.
+* Internal updates to line up with bumped MSRV
+
+## [0.4.8] - 2019-07-28
+
+### New
+
+* Support attempting to get `Record` fields as static strings.
+
+## [0.4.7] - 2019-07-06
+
+### New
+
+* Support for embedded environments with thread-unsafe initialization.
+* Initial unstable support for capturing structured data under the `kv_unstable`
+feature gate. This new API doesn't affect existing users and may change in future
+patches (so those changes may not appear in the changelog until it stabilizes).
+
+### Improved
+
+* Docs for using `log` with the 2018 edition.
+* Error messages for macros missing arguments.
+
+## [0.4.6] - 2018-10-27
+
+### Improved
+
+* Support 2018-style macro import for the `log_enabled!` macro.
+
+## [0.4.5] - 2018-09-03
+
+### Improved
+
+* Make `log`'s internal helper macros less likely to conflict with user-defined
+ macros.
+
+## [0.4.4] - 2018-08-17
+
+### Improved
+
+* Support 2018-style imports of the log macros.
+
+## [0.4.3] - 2018-06-29
+
+### Improved
+
+* More code generation improvements.
+
+## [0.4.2] - 2018-06-05
+
+### Improved
+
+* Log invocations now generate less code.
+
+### Fixed
+
+* Example Logger implementations now properly set the max log level.
+
+## [0.4.1] - 2017-12-30
+
+### Fixed
+
+* Some doc links were fixed.
+
+## [0.4.0] - 2017-12-24
+
+The changes in this release include cleanup of some obscure functionality and a more robust public
+API designed to support bridges to other logging systems, and provide more flexibility to new
+features in the future.
+
+### Compatibility
+
+Vast portions of the Rust ecosystem use the 0.3.x release series of log, and we don't want to force
+the community to go through the pain of upgrading every crate to 0.4.x at the exact same time. Along
+with 0.4.0, we've published a new 0.3.9 release which acts as a "shim" over 0.4.0. This will allow
+crates using either version to coexist without losing messages from one side or the other.
+
+There is one caveat - a log message generated by a crate using 0.4.x but consumed by a logging
+implementation using 0.3.x will not have a file name or module path. Applications affected by this
+can upgrade their logging implementations to one using 0.4.x to avoid losing this information. The
+other direction does not lose any information, fortunately!
+
+**TL;DR** Libraries should feel comfortable upgrading to 0.4.0 without treating that as a breaking
+change. Applications may need to update their logging implementation (e.g. env-logger) to a newer
+version using log 0.4.x to avoid losing module and file information.
+
+### New
+
+* The crate is now `no_std` by default.
+* `Level` and `LevelFilter` now implement `Serialize` and `Deserialize` when the `serde` feature is
+ enabled.
+* The `Record` and `Metadata` types can now be constructed by third-party code via a builder API.
+* The `logger` free function returns a reference to the logger implementation. This, along with the
+ ability to construct `Record`s, makes it possible to bridge from another logging framework to
+ this one without digging into the private internals of the crate. The standard `error!` `warn!`,
+ etc., macros now exclusively use the public API of the crate rather than "secret" internal APIs.
+* `Log::flush` has been added to allow crates to tell the logging implementation to ensure that all
+ "in flight" log events have been persisted. This can be used, for example, just before an
+ application exits to ensure that asynchronous log sinks finish their work.
+
+### Removed
+
+* The `shutdown` and `shutdown_raw` functions have been removed. Supporting shutdown significantly
+ complicated the implementation and imposed a performance cost on each logging operation.
+* The `log_panics` function and its associated `nightly` Cargo feature have been removed. Use the
+ [log-panics](https://crates.io/crates/log-panics) instead.
+
+### Changed
+
+* The `Log` prefix has been removed from type names. For example, `LogLevelFilter` is now
+ `LevelFilter`, and `LogRecord` is now `Record`.
+* The `MaxLogLevelFilter` object has been removed in favor of a `set_max_level` free function.
+* The `set_logger` free functions have been restructured. The logger is now directly passed to the
+ functions rather than a closure which returns the logger. `set_logger` now takes a `&'static
+ Log` and is usable in `no_std` contexts in place of the old `set_logger_raw`. `set_boxed_logger`
+ is a convenience function which takes a `Box<Log>` but otherwise acts like `set_logger`. It
+ requires the `std` feature.
+* The `file` and `module_path` values in `Record` no longer have the `'static` lifetime to support
+ integration with other logging frameworks that don't provide a `'static` lifetime for the
+ equivalent values.
+* The `file`, `line`, and `module_path` values in `Record` are now `Option`s to support integration
+ with other logging frameworks that don't provide those values.
+
+### In the Future
+
+* We're looking to add support for *structured* logging - the inclusion of extra key-value pairs of
+ information in a log event in addition to the normal string message. This should be able to be
+ added in a backwards compatible manner to the 0.4.x series when the design is worked out.
+
+## Older
+
+Look at the [release tags] for information about older releases.
+
+[Unreleased]: https://github.com/rust-lang-nursery/log/compare/0.4.29...HEAD
+[0.4.29]: https://github.com/rust-lang/log/compare/0.4.28...0.4.29
+[0.4.28]: https://github.com/rust-lang/log/compare/0.4.27...0.4.28
+[0.4.27]: https://github.com/rust-lang/log/compare/0.4.26...0.4.27
+[0.4.26]: https://github.com/rust-lang/log/compare/0.4.25...0.4.26
+[0.4.25]: https://github.com/rust-lang/log/compare/0.4.24...0.4.25
+[0.4.24]: https://github.com/rust-lang/log/compare/0.4.23...0.4.24
+[0.4.23]: https://github.com/rust-lang/log/compare/0.4.22...0.4.23
+[0.4.22]: https://github.com/rust-lang/log/compare/0.4.21...0.4.22
+[0.4.21]: https://github.com/rust-lang/log/compare/0.4.20...0.4.21
+[0.4.20]: https://github.com/rust-lang-nursery/log/compare/0.4.19...0.4.20
+[0.4.19]: https://github.com/rust-lang-nursery/log/compare/0.4.18...0.4.19
+[0.4.18]: https://github.com/rust-lang-nursery/log/compare/0.4.17...0.4.18
+[0.4.17]: https://github.com/rust-lang-nursery/log/compare/0.4.16...0.4.17
+[0.4.16]: https://github.com/rust-lang-nursery/log/compare/0.4.15...0.4.16
+[0.4.15]: https://github.com/rust-lang-nursery/log/compare/0.4.13...0.4.15
+[0.4.14]: https://github.com/rust-lang-nursery/log/compare/0.4.13...0.4.14
+[0.4.13]: https://github.com/rust-lang-nursery/log/compare/0.4.11...0.4.13
+[0.4.12]: https://github.com/rust-lang-nursery/log/compare/0.4.11...0.4.12
+[0.4.11]: https://github.com/rust-lang-nursery/log/compare/0.4.10...0.4.11
+[0.4.10]: https://github.com/rust-lang-nursery/log/compare/0.4.9...0.4.10
+[0.4.9]: https://github.com/rust-lang-nursery/log/compare/0.4.8...0.4.9
+[0.4.8]: https://github.com/rust-lang-nursery/log/compare/0.4.7...0.4.8
+[0.4.7]: https://github.com/rust-lang-nursery/log/compare/0.4.6...0.4.7
+[0.4.6]: https://github.com/rust-lang-nursery/log/compare/0.4.5...0.4.6
+[0.4.5]: https://github.com/rust-lang-nursery/log/compare/0.4.4...0.4.5
+[0.4.4]: https://github.com/rust-lang-nursery/log/compare/0.4.3...0.4.4
+[0.4.3]: https://github.com/rust-lang-nursery/log/compare/0.4.2...0.4.3
+[0.4.2]: https://github.com/rust-lang-nursery/log/compare/0.4.1...0.4.2
+[0.4.1]: https://github.com/rust-lang-nursery/log/compare/0.4.0...0.4.1
+[0.4.0]: https://github.com/rust-lang-nursery/log/compare/0.3.8...0.4.0
+[release tags]: https://github.com/rust-lang-nursery/log/releases
diff --git a/external/vendor/log/Cargo.lock b/external/vendor/log/Cargo.lock
new file mode 100644
index 0000000..5268618
--- /dev/null
+++ b/external/vendor/log/Cargo.lock
@@ -0,0 +1,283 @@
+# This file is automatically @generated by Cargo.
+# It is not intended for manual editing.
+version = 3
+
+[[package]]
+name = "erased-serde"
+version = "0.4.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "89e8918065695684b2b0702da20382d5ae6065cf3327bc2d6436bd49a71ce9f3"
+dependencies = [
+ "serde",
+ "serde_core",
+ "typeid",
+]
+
+[[package]]
+name = "itoa"
+version = "1.0.15"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c"
+
+[[package]]
+name = "log"
+version = "0.4.29"
+dependencies = [
+ "proc-macro2",
+ "serde",
+ "serde_core",
+ "serde_json",
+ "serde_test",
+ "sval",
+ "sval_derive",
+ "sval_ref",
+ "value-bag",
+]
+
+[[package]]
+name = "memchr"
+version = "2.7.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f52b00d39961fc5b2736ea853c9cc86238e165017a493d1d5c8eac6bdc4cc273"
+
+[[package]]
+name = "proc-macro2"
+version = "1.0.103"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5ee95bc4ef87b8d5ba32e8b7714ccc834865276eab0aed5c9958d00ec45f49e8"
+dependencies = [
+ "unicode-ident",
+]
+
+[[package]]
+name = "quote"
+version = "1.0.42"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a338cc41d27e6cc6dce6cefc13a0729dfbb81c262b1f519331575dd80ef3067f"
+dependencies = [
+ "proc-macro2",
+]
+
+[[package]]
+name = "ryu"
+version = "1.0.20"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f"
+
+[[package]]
+name = "serde"
+version = "1.0.228"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e"
+dependencies = [
+ "serde_core",
+ "serde_derive",
+]
+
+[[package]]
+name = "serde_core"
+version = "1.0.228"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad"
+dependencies = [
+ "serde_derive",
+]
+
+[[package]]
+name = "serde_derive"
+version = "1.0.228"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn",
+]
+
+[[package]]
+name = "serde_fmt"
+version = "1.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6e497af288b3b95d067a23a4f749f2861121ffcb2f6d8379310dcda040c345ed"
+dependencies = [
+ "serde_core",
+]
+
+[[package]]
+name = "serde_json"
+version = "1.0.145"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "402a6f66d8c709116cf22f558eab210f5a50187f702eb4d7e5ef38d9a7f1c79c"
+dependencies = [
+ "itoa",
+ "memchr",
+ "ryu",
+ "serde",
+ "serde_core",
+]
+
+[[package]]
+name = "serde_test"
+version = "1.0.177"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7f901ee573cab6b3060453d2d5f0bae4e6d628c23c0a962ff9b5f1d7c8d4f1ed"
+dependencies = [
+ "serde",
+]
+
+[[package]]
+name = "sval"
+version = "2.16.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "502b8906c4736190684646827fbab1e954357dfe541013bbd7994d033d53a1ca"
+
+[[package]]
+name = "sval_buffer"
+version = "2.16.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c4b854348b15b6c441bdd27ce9053569b016a0723eab2d015b1fd8e6abe4f708"
+dependencies = [
+ "sval",
+ "sval_ref",
+]
+
+[[package]]
+name = "sval_derive"
+version = "2.16.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d32579aae2a134498be6d360355d7f085260377479d08cb032f0a90340bfd72d"
+dependencies = [
+ "sval_derive_macros",
+]
+
+[[package]]
+name = "sval_derive_macros"
+version = "2.16.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c855576b719497b925e9646ec865ffb79122027aeafee855b18f0612cc998947"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn",
+]
+
+[[package]]
+name = "sval_dynamic"
+version = "2.16.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a0bd9e8b74410ddad37c6962587c5f9801a2caadba9e11f3f916ee3f31ae4a1f"
+dependencies = [
+ "sval",
+]
+
+[[package]]
+name = "sval_fmt"
+version = "2.16.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6fe17b8deb33a9441280b4266c2d257e166bafbaea6e66b4b34ca139c91766d9"
+dependencies = [
+ "itoa",
+ "ryu",
+ "sval",
+]
+
+[[package]]
+name = "sval_json"
+version = "2.16.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "854addb048a5bafb1f496c98e0ab5b9b581c3843f03ca07c034ae110d3b7c623"
+dependencies = [
+ "itoa",
+ "ryu",
+ "sval",
+]
+
+[[package]]
+name = "sval_nested"
+version = "2.16.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "96cf068f482108ff44ae8013477cb047a1665d5f1a635ad7cf79582c1845dce9"
+dependencies = [
+ "sval",
+ "sval_buffer",
+ "sval_ref",
+]
+
+[[package]]
+name = "sval_ref"
+version = "2.16.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ed02126365ffe5ab8faa0abd9be54fbe68d03d607cd623725b0a71541f8aaa6f"
+dependencies = [
+ "sval",
+]
+
+[[package]]
+name = "sval_serde"
+version = "2.16.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a263383c6aa2076c4ef6011d3bae1b356edf6ea2613e3d8e8ebaa7b57dd707d5"
+dependencies = [
+ "serde_core",
+ "sval",
+ "sval_nested",
+]
+
+[[package]]
+name = "syn"
+version = "2.0.111"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "390cc9a294ab71bdb1aa2e99d13be9c753cd2d7bd6560c77118597410c4d2e87"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "unicode-ident",
+]
+
+[[package]]
+name = "typeid"
+version = "1.0.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bc7d623258602320d5c55d1bc22793b57daff0ec7efc270ea7d55ce1d5f5471c"
+
+[[package]]
+name = "unicode-ident"
+version = "1.0.22"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9312f7c4f6ff9069b165498234ce8be658059c6728633667c526e27dc2cf1df5"
+
+[[package]]
+name = "value-bag"
+version = "1.12.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7ba6f5989077681266825251a52748b8c1d8a4ad098cc37e440103d0ea717fc0"
+dependencies = [
+ "value-bag-serde1",
+ "value-bag-sval2",
+]
+
+[[package]]
+name = "value-bag-serde1"
+version = "1.12.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "16530907bfe2999a1773ca5900a65101e092c70f642f25cc23ca0c43573262c5"
+dependencies = [
+ "erased-serde",
+ "serde_core",
+ "serde_fmt",
+]
+
+[[package]]
+name = "value-bag-sval2"
+version = "1.12.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d00ae130edd690eaa877e4f40605d534790d1cf1d651e7685bd6a144521b251f"
+dependencies = [
+ "sval",
+ "sval_buffer",
+ "sval_dynamic",
+ "sval_fmt",
+ "sval_json",
+ "sval_ref",
+ "sval_serde",
+]
diff --git a/external/vendor/log/Cargo.toml b/external/vendor/log/Cargo.toml
new file mode 100644
index 0000000..e8c88a9
--- /dev/null
+++ b/external/vendor/log/Cargo.toml
@@ -0,0 +1,152 @@
+# THIS FILE IS AUTOMATICALLY GENERATED BY CARGO
+#
+# When uploading crates to the registry Cargo will automatically
+# "normalize" Cargo.toml files for maximal compatibility
+# with all versions of Cargo and also rewrite `path` dependencies
+# to registry (e.g., crates.io) dependencies.
+#
+# If you are reading this file be aware that the original Cargo.toml
+# will likely look very different (and much more reasonable).
+# See Cargo.toml.orig for the original contents.
+
+[package]
+edition = "2021"
+rust-version = "1.68.0"
+name = "log"
+version = "0.4.29"
+authors = ["The Rust Project Developers"]
+build = false
+exclude = ["rfcs/**/*"]
+autolib = false
+autobins = false
+autoexamples = false
+autotests = false
+autobenches = false
+description = """
+A lightweight logging facade for Rust
+"""
+documentation = "https://docs.rs/log"
+readme = "README.md"
+keywords = ["logging"]
+categories = ["development-tools::debugging"]
+license = "MIT OR Apache-2.0"
+repository = "https://github.com/rust-lang/log"
+
+[package.metadata.docs.rs]
+features = [
+ "std",
+ "serde",
+ "kv_std",
+ "kv_sval",
+ "kv_serde",
+]
+
+[features]
+kv = []
+kv_serde = [
+ "kv_std",
+ "value-bag/serde",
+ "serde",
+]
+kv_std = [
+ "std",
+ "kv",
+ "value-bag/error",
+]
+kv_sval = [
+ "kv",
+ "value-bag/sval",
+ "sval",
+ "sval_ref",
+]
+kv_unstable = [
+ "kv",
+ "value-bag",
+]
+kv_unstable_serde = [
+ "kv_serde",
+ "kv_unstable_std",
+]
+kv_unstable_std = [
+ "kv_std",
+ "kv_unstable",
+]
+kv_unstable_sval = [
+ "kv_sval",
+ "kv_unstable",
+]
+max_level_debug = []
+max_level_error = []
+max_level_info = []
+max_level_off = []
+max_level_trace = []
+max_level_warn = []
+release_max_level_debug = []
+release_max_level_error = []
+release_max_level_info = []
+release_max_level_off = []
+release_max_level_trace = []
+release_max_level_warn = []
+serde = ["serde_core"]
+std = []
+
+[lib]
+name = "log"
+path = "src/lib.rs"
+
+[[test]]
+name = "integration"
+path = "tests/integration.rs"
+
+[[test]]
+name = "macros"
+path = "tests/macros.rs"
+
+[[bench]]
+name = "value"
+path = "benches/value.rs"
+
+[dependencies.serde_core]
+version = "1.0"
+optional = true
+default-features = false
+
+[dependencies.sval]
+version = "2.16"
+optional = true
+default-features = false
+
+[dependencies.sval_ref]
+version = "2.16"
+optional = true
+default-features = false
+
+[dependencies.value-bag]
+version = "1.12"
+features = ["inline-i128"]
+optional = true
+default-features = false
+
+[dev-dependencies.proc-macro2]
+version = "1.0.63"
+default-features = false
+
+[dev-dependencies.serde]
+version = "1.0"
+features = ["derive"]
+
+[dev-dependencies.serde_json]
+version = "1.0"
+
+[dev-dependencies.serde_test]
+version = "1.0"
+
+[dev-dependencies.sval]
+version = "2.16"
+
+[dev-dependencies.sval_derive]
+version = "2.16"
+
+[dev-dependencies.value-bag]
+version = "1.12"
+features = ["test"]
diff --git a/external/vendor/log/Cargo.toml.orig b/external/vendor/log/Cargo.toml.orig
new file mode 100644
index 0000000..964b887
--- /dev/null
+++ b/external/vendor/log/Cargo.toml.orig
@@ -0,0 +1,76 @@
+[package]
+
+name = "log"
+version = "0.4.29" # remember to update html_root_url
+authors = ["The Rust Project Developers"]
+license = "MIT OR Apache-2.0"
+readme = "README.md"
+repository = "https://github.com/rust-lang/log"
+documentation = "https://docs.rs/log"
+description = """
+A lightweight logging facade for Rust
+"""
+categories = ["development-tools::debugging"]
+keywords = ["logging"]
+exclude = ["rfcs/**/*"]
+rust-version = "1.68.0"
+edition = "2021"
+
+[package.metadata.docs.rs]
+features = ["std", "serde", "kv_std", "kv_sval", "kv_serde"]
+
+[features]
+max_level_off = []
+max_level_error = []
+max_level_warn = []
+max_level_info = []
+max_level_debug = []
+max_level_trace = []
+
+release_max_level_off = []
+release_max_level_error = []
+release_max_level_warn = []
+release_max_level_info = []
+release_max_level_debug = []
+release_max_level_trace = []
+
+std = []
+
+kv = []
+kv_sval = ["kv", "value-bag/sval", "sval", "sval_ref"]
+kv_std = ["std", "kv", "value-bag/error"]
+kv_serde = ["kv_std", "value-bag/serde", "serde"]
+
+# This is here to not break backwards compatibility with the implicit feature
+# that enables support for serde based on the dependency name. Since we're now
+# using serde_core, the implicit feature was renamed, this adds back an alias.
+serde = ["serde_core"]
+
+# Deprecated: use `kv_*` instead
+# These `*_unstable` features will be removed in a future release
+kv_unstable = ["kv", "value-bag"]
+kv_unstable_sval = ["kv_sval", "kv_unstable"]
+kv_unstable_std = ["kv_std", "kv_unstable"]
+kv_unstable_serde = ["kv_serde", "kv_unstable_std"]
+
+[dependencies]
+serde_core = { version = "1.0", optional = true, default-features = false }
+sval = { version = "2.16", optional = true, default-features = false }
+sval_ref = { version = "2.16", optional = true, default-features = false }
+value-bag = { version = "1.12", optional = true, default-features = false, features = ["inline-i128"] }
+
+[dev-dependencies]
+serde = { version = "1.0", features = ["derive"] }
+serde_json = { version = "1.0" }
+serde_test = { version = "1.0" }
+sval = { version = "2.16" }
+sval_derive = { version = "2.16" }
+value-bag = { version = "1.12", features = ["test"] }
+
+# NOTE: log doesn't actually depend on this crate. However, our dependencies,
+# serde and sval, dependent on version 1.0 of the crate, which has problem fixed
+# in 1.0.60, specifically in the following commit
+# https://github.com/dtolnay/proc-macro2/commit/e31d61910049e097afdd3d27c37786309082bdcb.
+# By defining the crate as direct dependency we can increase its minimal
+# version making the minimal (crate) version CI happy.
+proc-macro2 = { version = "1.0.63", default-features = false }
diff --git a/external/vendor/log/LICENSE-APACHE b/external/vendor/log/LICENSE-APACHE
new file mode 100644
index 0000000..16fe87b
--- /dev/null
+++ b/external/vendor/log/LICENSE-APACHE
@@ -0,0 +1,201 @@
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+END OF TERMS AND CONDITIONS
+
+APPENDIX: How to apply the Apache License to your work.
+
+ To apply the Apache License to your work, attach the following
+ boilerplate notice, with the fields enclosed by brackets "[]"
+ replaced with your own identifying information. (Don't include
+ the brackets!) The text should be enclosed in the appropriate
+ comment syntax for the file format. We also recommend that a
+ file or class name and description of purpose be included on the
+ same "printed page" as the copyright notice for easier
+ identification within third-party archives.
+
+Copyright [yyyy] [name of copyright owner]
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
diff --git a/external/vendor/log/LICENSE-MIT b/external/vendor/log/LICENSE-MIT
new file mode 100644
index 0000000..39d4bdb
--- /dev/null
+++ b/external/vendor/log/LICENSE-MIT
@@ -0,0 +1,25 @@
+Copyright (c) 2014 The Rust Project Developers
+
+Permission is hereby granted, free of charge, to any
+person obtaining a copy of this software and associated
+documentation files (the "Software"), to deal in the
+Software without restriction, including without
+limitation the rights to use, copy, modify, merge,
+publish, distribute, sublicense, and/or sell copies of
+the Software, and to permit persons to whom the Software
+is furnished to do so, subject to the following
+conditions:
+
+The above copyright notice and this permission notice
+shall be included in all copies or substantial portions
+of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF
+ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
+TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
+PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
+SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR
+IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+DEALINGS IN THE SOFTWARE.
diff --git a/external/vendor/log/README.md b/external/vendor/log/README.md
new file mode 100644
index 0000000..9d5113d
--- /dev/null
+++ b/external/vendor/log/README.md
@@ -0,0 +1,134 @@
+log
+===
+
+A Rust library providing a lightweight logging *facade*.
+
+[](https://github.com/rust-lang/log/actions)
+[](https://crates.io/crates/log)
+[](https://docs.rs/log)
+
+
+* [`log` documentation](https://docs.rs/log)
+
+A logging facade provides a single logging API that abstracts over the actual
+logging implementation. Libraries can use the logging API provided by this
+crate, and the consumer of those libraries can choose the logging
+implementation that is most suitable for its use case.
+
+
+## Minimum supported `rustc`
+
+`1.61.0+`
+
+This version is explicitly tested in CI and may be bumped in any release as needed. Maintaining compatibility with older compilers is a priority though, so the bar for bumping the minimum supported version is set very high. Any changes to the supported minimum version will be called out in the release notes.
+
+## Usage
+
+### In libraries
+
+Libraries should link only to the `log` crate, and use the provided macros to
+log whatever information will be useful to downstream consumers:
+
+```toml
+[dependencies]
+log = "0.4"
+```
+
+```rust
+use log::{info, trace, warn};
+
+pub fn shave_the_yak(yak: &mut Yak) {
+ trace!("Commencing yak shaving");
+
+ loop {
+ match find_a_razor() {
+ Ok(razor) => {
+ info!("Razor located: {razor}");
+ yak.shave(razor);
+ break;
+ }
+ Err(err) => {
+ warn!("Unable to locate a razor: {err}, retrying");
+ }
+ }
+ }
+}
+```
+
+### In executables
+
+In order to produce log output, executables have to use a logger implementation compatible with the facade.
+There are many available implementations to choose from, here are some options:
+
+* Simple minimal loggers:
+ * [`env_logger`](https://docs.rs/env_logger/*/env_logger/)
+ * [`colog`](https://docs.rs/colog/*/colog/)
+ * [`simple_logger`](https://docs.rs/simple_logger/*/simple_logger/)
+ * [`simplelog`](https://docs.rs/simplelog/*/simplelog/)
+ * [`pretty_env_logger`](https://docs.rs/pretty_env_logger/*/pretty_env_logger/)
+ * [`stderrlog`](https://docs.rs/stderrlog/*/stderrlog/)
+ * [`flexi_logger`](https://docs.rs/flexi_logger/*/flexi_logger/)
+ * [`call_logger`](https://docs.rs/call_logger/*/call_logger/)
+ * [`std-logger`](https://docs.rs/std-logger/*/std_logger/)
+ * [`structured-logger`](https://docs.rs/structured-logger/latest/structured_logger/)
+ * [`clang_log`](https://docs.rs/clang_log/latest/clang_log)
+ * [`ftail`](https://docs.rs/ftail/latest/ftail/)
+* Complex configurable frameworks:
+ * [`log4rs`](https://docs.rs/log4rs/*/log4rs/)
+ * [`logforth`](https://docs.rs/logforth/*/logforth/)
+ * [`fern`](https://docs.rs/fern/*/fern/)
+ * [`spdlog-rs`](https://docs.rs/spdlog-rs/*/spdlog/)
+* Adaptors for other facilities:
+ * [`syslog`](https://docs.rs/syslog/*/syslog/)
+ * [`systemd-journal-logger`](https://docs.rs/systemd-journal-logger/*/systemd_journal_logger/)
+ * [`slog-stdlog`](https://docs.rs/slog-stdlog/*/slog_stdlog/)
+ * [`android_log`](https://docs.rs/android_log/*/android_log/)
+ * [`win_dbg_logger`](https://docs.rs/win_dbg_logger/*/win_dbg_logger/)
+ * [`db_logger`](https://docs.rs/db_logger/*/db_logger/)
+ * [`log-to-defmt`](https://docs.rs/log-to-defmt/*/log_to_defmt/)
+ * [`logcontrol-log`](https://docs.rs/logcontrol-log/*/logcontrol_log/)
+* For WebAssembly binaries:
+ * [`console_log`](https://docs.rs/console_log/*/console_log/)
+* For dynamic libraries:
+ * You may need to construct [an FFI-safe wrapper over `log`](https://github.com/rust-lang/log/issues/421) to initialize in your libraries.
+* Utilities:
+ * [`log_err`](https://docs.rs/log_err/*/log_err/)
+ * [`log-reload`](https://docs.rs/log-reload/*/log_reload/)
+ * [`alterable_logger`](https://docs.rs/alterable_logger/*/alterable_logger)
+
+Executables should choose a logger implementation and initialize it early in the
+runtime of the program. Logger implementations will typically include a
+function to do this. Any log messages generated before the logger is
+initialized will be ignored.
+
+The executable itself may use the `log` crate to log as well.
+
+## Structured logging
+
+If you enable the `kv` feature, you can associate structured data with your log records:
+
+```rust
+use log::{info, trace, warn};
+
+pub fn shave_the_yak(yak: &mut Yak) {
+ // `yak:serde` will capture `yak` using its `serde::Serialize` impl
+ //
+ // You could also use `:?` for `Debug`, or `:%` for `Display`. For a
+ // full list, see the `log` crate documentation
+ trace!(target = "yak_events", yak:serde; "Commencing yak shaving");
+
+ loop {
+ match find_a_razor() {
+ Ok(razor) => {
+ info!(razor; "Razor located");
+ yak.shave(razor);
+ break;
+ }
+ Err(e) => {
+ // `e:err` will capture `e` using its `std::error::Error` impl
+ warn!(e:err; "Unable to locate a razor, retrying");
+ }
+ }
+ }
+}
+```
diff --git a/external/vendor/log/benches/value.rs b/external/vendor/log/benches/value.rs
new file mode 100644
index 0000000..3d0f18b
--- /dev/null
+++ b/external/vendor/log/benches/value.rs
@@ -0,0 +1,27 @@
+#![cfg(feature = "kv")]
+#![feature(test)]
+
+use log::kv::Value;
+
+#[bench]
+fn u8_to_value(b: &mut test::Bencher) {
+ b.iter(|| Value::from(1u8));
+}
+
+#[bench]
+fn u8_to_value_debug(b: &mut test::Bencher) {
+ b.iter(|| Value::from_debug(&1u8));
+}
+
+#[bench]
+fn str_to_value_debug(b: &mut test::Bencher) {
+ b.iter(|| Value::from_debug(&"a string"));
+}
+
+#[bench]
+fn custom_to_value_debug(b: &mut test::Bencher) {
+ #[derive(Debug)]
+ struct A;
+
+ b.iter(|| Value::from_debug(&A));
+}
diff --git a/external/vendor/log/src/__private_api.rs b/external/vendor/log/src/__private_api.rs
new file mode 100644
index 0000000..8d44467
--- /dev/null
+++ b/external/vendor/log/src/__private_api.rs
@@ -0,0 +1,151 @@
+//! WARNING: this is not part of the crate's public API and is subject to change at any time
+
+use self::sealed::KVs;
+use crate::{logger, Level, Log, Metadata, Record};
+use std::fmt::Arguments;
+use std::panic::Location;
+pub use std::{format_args, module_path, stringify};
+
+#[cfg(not(feature = "kv"))]
+pub type Value<'a> = &'a str;
+
+mod sealed {
+ /// Types for the `kv` argument.
+ pub trait KVs<'a> {
+ fn into_kvs(self) -> Option<&'a [(&'a str, super::Value<'a>)]>;
+ }
+}
+
+// Types for the `kv` argument.
+
+impl<'a> KVs<'a> for &'a [(&'a str, Value<'a>)] {
+ #[inline]
+ fn into_kvs(self) -> Option<&'a [(&'a str, Value<'a>)]> {
+ Some(self)
+ }
+}
+
+impl<'a> KVs<'a> for () {
+ #[inline]
+ fn into_kvs(self) -> Option<&'a [(&'a str, Value<'a>)]> {
+ None
+ }
+}
+
+// Log implementation.
+
+/// The global logger proxy.
+#[derive(Debug)]
+pub struct GlobalLogger;
+
+impl Log for GlobalLogger {
+ fn enabled(&self, metadata: &Metadata) -> bool {
+ logger().enabled(metadata)
+ }
+
+ fn log(&self, record: &Record) {
+ logger().log(record)
+ }
+
+ fn flush(&self) {
+ logger().flush()
+ }
+}
+
+// Split from `log` to reduce generics and code size
+fn log_impl<L: Log>(
+ logger: L,
+ args: Arguments,
+ level: Level,
+ &(target, module_path, loc): &(&str, &'static str, &'static Location),
+ kvs: Option<&[(&str, Value)]>,
+) {
+ #[cfg(not(feature = "kv"))]
+ if kvs.is_some() {
+ panic!("key-value support is experimental and must be enabled using the `kv` feature")
+ }
+
+ let mut builder = Record::builder();
+
+ builder
+ .args(args)
+ .level(level)
+ .target(target)
+ .module_path_static(Some(module_path))
+ .file_static(Some(loc.file()))
+ .line(Some(loc.line()));
+
+ #[cfg(feature = "kv")]
+ builder.key_values(&kvs);
+
+ logger.log(&builder.build());
+}
+
+pub fn log<'a, K, L>(
+ logger: L,
+ args: Arguments,
+ level: Level,
+ target_module_path_and_loc: &(&str, &'static str, &'static Location),
+ kvs: K,
+) where
+ K: KVs<'a>,
+ L: Log,
+{
+ log_impl(
+ logger,
+ args,
+ level,
+ target_module_path_and_loc,
+ kvs.into_kvs(),
+ )
+}
+
+pub fn enabled<L: Log>(logger: L, level: Level, target: &str) -> bool {
+ logger.enabled(&Metadata::builder().level(level).target(target).build())
+}
+
+#[track_caller]
+pub fn loc() -> &'static Location<'static> {
+ Location::caller()
+}
+
+#[cfg(feature = "kv")]
+mod kv_support {
+ use crate::kv;
+
+ pub type Value<'a> = kv::Value<'a>;
+
+ // NOTE: Many functions here accept a double reference &&V
+ // This is so V itself can be ?Sized, while still letting us
+ // erase it to some dWhy this scored 15/100
Community notes
Notes can correct, qualify, or add evidence to the AI analysis. Every note shown here has been validated by a human moderator.
The AI analysis stands alone for now. Submit a note if you can add evidence or important context.