fips203-0.2.1/.cargo_vcs_info.json0000644000000001360000000000100122220ustar { "git": { "sha1": "a52d758bf3486152acc3f2a668a86d72599ed704" }, "path_in_vcs": "" }fips203-0.2.1/.github/workflows/test.yml000064400000000000000000000105221046102023000161110ustar 00000000000000name: test on: [ push, pull_request ] env: CARGO_INCREMENTAL: 0 RUSTFLAGS: "-Dwarnings" RUSTDOCFLAGS: "-Dwarnings" jobs: build: runs-on: ubuntu-latest strategy: matrix: rust: - 1.72 # MSRV 1.70 GA flaky - stable target: - thumbv7em-none-eabi - wasm32-unknown-unknown - s390x-unknown-linux-gnu - powerpc64-unknown-linux-gnu - riscv64gc-unknown-none-elf - x86_64-pc-windows-gnu - x86_64-apple-darwin steps: - uses: actions/checkout@v4 - uses: dtolnay/rust-toolchain@master with: toolchain: ${{ matrix.rust }} targets: ${{ matrix.target }} - run: cargo build --target ${{ matrix.target }} --release --no-default-features --features "ml-kem-512 ml-kem-768 ml-kem-1024" cargo_audit: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - uses: rustsec/audit-check@v1.4.1 with: token: ${{ secrets.GITHUB_TOKEN }} cargo_deny: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - uses: EmbarkStudios/cargo-deny-action@v1 cargo_outdated: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - uses: dtolnay/rust-toolchain@stable - name: Install cargo outdated run: cargo install --locked cargo-outdated - name: Run cargo outdated run: cargo outdated -R clippy: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - name: Run Clippy run: cargo clippy --all-targets --all-features coverage: runs-on: ubuntu-latest env: CARGO_TERM_COLOR: always steps: - uses: actions/checkout@v4 - uses: dtolnay/rust-toolchain@stable - name: Install cargo-llvm-cov uses: taiki-e/install-action@cargo-llvm-cov - name: Generate code coverage run: cargo llvm-cov --all-features --workspace --exclude fips203-ffi # No codecov account, so stop here for now # - name: Upload coverage to Codecov # uses: codecov/codecov-action@v3 # with: # files: lcov.info # fail_ci_if_error: true cross: strategy: matrix: include: # ARM32 - target: armv7-unknown-linux-gnueabihf rust: 1.72 # MSRV 1.70 GA flaky - target: armv7-unknown-linux-gnueabihf rust: stable # ARM64 - target: aarch64-unknown-linux-gnu rust: 1.72 # MSRV 1.70 GA flaky - target: aarch64-unknown-linux-gnu rust: stable # PPC32 - target: powerpc-unknown-linux-gnu rust: 1.72 # MSRV 1.70 GA flaky - target: powerpc-unknown-linux-gnu rust: stable runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - run: ${{ matrix.deps }} - uses: dtolnay/rust-toolchain@master with: toolchain: ${{ matrix.rust }} targets: ${{ matrix.target }} - uses: RustCrypto/actions/cross-install@master - run: cross test --release --target ${{ matrix.target }} --no-default-features --features "ml-kem-512 ml-kem-768 ml-kem-1024" doc: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - uses: RustCrypto/actions/cargo-cache@master - uses: dtolnay/rust-toolchain@master with: toolchain: stable - run: cargo doc --all-features test: runs-on: ubuntu-latest strategy: matrix: include: # 32-bit Linux - target: i686-unknown-linux-gnu rust: 1.72 # MSRV 1.70 GA flaky deps: sudo apt update && sudo apt install gcc-multilib - target: i686-unknown-linux-gnu rust: stable deps: sudo apt update && sudo apt install gcc-multilib # 64-bit Linux - target: x86_64-unknown-linux-gnu rust: 1.72 # MSRV 1.70 GA flaky - target: x86_64-unknown-linux-gnu rust: stable steps: - uses: actions/checkout@v4 - uses: dtolnay/rust-toolchain@master with: toolchain: ${{ matrix.rust }} targets: ${{ matrix.target }} - run: ${{ matrix.deps }} - run: cargo check --target ${{ matrix.target }} --all-features - run: cargo test --release --target ${{ matrix.target }} fips203-0.2.1/.gitignore000064400000000000000000000001561046102023000130040ustar 00000000000000/.idea **/Cargo.lock **/artifacts **/corpus **/coverate **/target **/pkg **/node_modules **/package-lock.json fips203-0.2.1/CHANGELOG.md000064400000000000000000000022641046102023000126270ustar 00000000000000# Changelog All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). ## 0.2.1 (2024-05-01) - Very minor dev dependency downgrade for compat (flate2) ## 0.2.0 (2024-04-26) - Removed `_vt` suffix from top-level API as constant-time operation is now measured ## 0.1.6 (2024-04-24) - Additional tests in `validate_keypair_vt()`, implemented second round review feedback ## 0.1.5 (2024-04-14) - Significant performance optimizations and internal revisions based upon review feedback ## 0.1.4 (2024-04-01) - Constant-time fixes and measurement - Significant internal clean up, additional SerDes validation ## 0.1.3 (2024-02-27) - Adjustments to dependency versions to support MSRV 1.70 ## 0.1.2 (2024-02-21) - Added (serialized) keypair validation functionality - General clean-up, refined checks, some constant-time work - Cargo deny and codecov; revised bench, fuzz, dudect and ct_cm4 ## 0.1.1 (2023-10-30) - Fully functional in all three parameter sets ## 0.1.0 (2023-10-15) - Initial API release skeleton fips203-0.2.1/Cargo.toml0000644000000040540000000000100102230ustar # 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.70" name = "fips203" version = "0.2.1" authors = ["Eric Schorn "] description = "FIPS 203 (draft): Module-Lattice-Based Key-Encapsulation Mechanism" documentation = "https://docs.rs/fips203" readme = "README.md" keywords = [ "kem", "FIPS203", "lattice", "kyber", "encapsulation", ] categories = [ "cryptography", "no-std", ] license = "MIT OR Apache-2.0" repository = "https://github.com/integritychain/fips203" [profile.bench] opt-level = 3 lto = true codegen-units = 1 debug = 2 debug-assertions = false overflow-checks = false incremental = false [profile.dev] debug = 2 [profile.release] opt-level = "s" lto = true codegen-units = 1 [[bench]] name = "benchmark" harness = false [dependencies.rand_core] version = "0.6.4" default-features = false [dependencies.sha3] version = "0.10.2" default-features = false [dependencies.subtle] version = "2.5.0" features = ["const-generics"] default-features = false [dependencies.zeroize] version = "1.6.0" features = ["zeroize_derive"] default-features = false [dev-dependencies.criterion] version = "0.4.0" [dev-dependencies.flate2] version = "1.0.27" [dev-dependencies.hex] version = "0.4.3" [dev-dependencies.hex-literal] version = "0.4.1" [dev-dependencies.rand] version = "0.8.5" [dev-dependencies.rand_chacha] version = "0.3.1" [dev-dependencies.regex] version = "1.10.2" [features] default = [ "default-rng", "ml-kem-512", "ml-kem-768", "ml-kem-1024", ] default-rng = ["rand_core/getrandom"] ml-kem-1024 = [] ml-kem-512 = [] ml-kem-768 = [] fips203-0.2.1/Cargo.toml.orig000064400000000000000000000033451046102023000137060ustar 00000000000000workspace = { members = ['ffi'], exclude = ["ct_cm4", "dudect", "fuzz", "wasm"] } [package] name = "fips203" version = "0.2.1" edition = "2021" license = "MIT OR Apache-2.0" description = "FIPS 203 (draft): Module-Lattice-Based Key-Encapsulation Mechanism" authors = ["Eric Schorn "] documentation = "https://docs.rs/fips203" categories = ["cryptography", "no-std"] repository = "https://github.com/integritychain/fips203" keywords = ["kem", "FIPS203", "lattice", "kyber", "encapsulation"] # MSRV set at 1.70 for debian testing, e.g. https://packages.debian.org/search?keywords=rustc # This requires several marginally outdated dependencies, see below rust-version = "1.70" [features] default = ["default-rng", "ml-kem-512", "ml-kem-768", "ml-kem-1024"] default-rng = ["rand_core/getrandom"] ml-kem-512 = [] ml-kem-768 = [] ml-kem-1024 = [] [dependencies] # Some are marginally outdated to retain MSRV 1.70 rand_core = { version = "0.6.4", default-features = false } sha3 = { version = "0.10.2", default-features = false } subtle = { version = "2.5.0", default-features = false, features = ['const-generics'] } zeroize = { version = "1.6.0", default-features = false, features = ["zeroize_derive"] } [dev-dependencies] # Some are marginally outdated to retain MSRV 1.70 rand = "0.8.5" regex = "1.10.2" hex = "0.4.3" rand_chacha = "0.3.1" criterion = "0.4.0" flate2 = "1.0.27" hex-literal = "0.4.1" [[bench]] name = "benchmark" harness = false [profile.dev] debug = true #lto = true #opt-level = 3 #codegen-units = 1 [profile.release] lto = true opt-level = "s" codegen-units = 1 [profile.bench] debug = true debug-assertions = false incremental = false lto = true opt-level = 3 overflow-checks = false codegen-units = 1 fips203-0.2.1/LICENSE-APACHE000064400000000000000000000251411046102023000127410ustar 00000000000000 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. fips203-0.2.1/LICENSE-MIT000064400000000000000000000020561046102023000124510ustar 00000000000000Copyright (c) 2020-2022 RustCrypto 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. fips203-0.2.1/README.md000064400000000000000000000113521046102023000122730ustar 00000000000000# [IntegrityChain]: FIPS 203 Module-Lattice-Based Key-Encapsulation Mechanism Standard [![crate][crate-image]][crate-link] [![Docs][docs-image]][docs-link] [![Build Status][build-image]][build-link] ![Apache2/MIT licensed][license-image] ![Rust Version][rustc-image] [FIPS 203] (Initial Public Draft) Module-Lattice-Based Key-Encapsulation Mechanism Standard written in pure Rust for server, desktop, browser and embedded applications. The source repository includes examples demonstrating benchmarking, an embedded target, constant-time statistical measurements, fuzzing, WASM execution, C FFI and Python bindings. This crate implements the FIPS 203 **draft** standard in pure Rust with minimal and mainstream dependencies, **and without any unsafe code**. All three security parameter sets are fully supported and tested. The implementation operates in constant-time (outside of rho, which is part of the encapsulation key sent across the trust boundary in the clear), does not require the standard library, e.g. `#[no_std]`, has no heap allocations, e.g. no `alloc` needed, and optionally exposes the `RNG` so it is suitable for the full range of applications down to the bare-metal. The API is stabilized and the code is heavily biased towards safety and correctness; further performance optimizations will be implemented as the standard matures. This crate will quickly follow any changes to FIPS 203 as they become available. See for a full description of the target functionality. The functionality is extremely simple to use, as demonstrated by the following example. ~~~rust // Use the desired target parameter set. use fips203::ml_kem_512; // Could also be ml_kem_768 or ml_kem_1024. use fips203::traits::{Decaps, Encaps, KeyGen, SerDes}; // Alice runs `try_keygen()` and then serializes the encaps key `ek` for Bob (to bytes). let (alice_ek, alice_dk) = ml_kem_512::KG::try_keygen().unwrap(); let alice_ek_bytes = alice_ek.into_bytes(); // Alice sends the encaps key `ek_bytes` to Bob. let bob_ek_bytes = alice_ek_bytes; // Bob deserializes the encaps `ek_bytes` and then runs `encaps() to get the shared // secret `ssk` and ciphertext `ct`. He serializes the ciphertext `ct` for Alice (to bytes). let bob_ek = ml_kem_512::EncapsKey::try_from_bytes(bob_ek_bytes).unwrap(); let (bob_ssk_bytes, bob_ct) = bob_ek.try_encaps().unwrap(); let bob_ct_bytes = bob_ct.into_bytes(); // Bob sends the ciphertext `ct_bytes` to Alice let alice_ct_bytes = bob_ct_bytes; // Alice deserializes the ciphertext `ct` and runs `decaps()` with her decaps key let alice_ct = ml_kem_512::CipherText::try_from_bytes(alice_ct_bytes).unwrap(); let alice_ssk_bytes = alice_dk.try_decaps(&alice_ct).unwrap(); // Alice and Bob will now have the same secret key assert_eq!(bob_ssk_bytes, alice_ssk_bytes); ~~~ The Rust [Documentation][docs-link] lives under each **Module** corresponding to the desired [security parameter](#modules) below. ## Notes * This crate is fully functional and corresponds to the first initial public draft of FIPS 203. * Constant-time operation targets the source-code level only on MSRV, with confirmation via manual review/inspection, the embedded target, and the `dudect` dynamic tests. * Note that FIPS 203 places specific requirements on randomness per section 3.3, hence the exposed `RNG`. * Requires Rust **1.70** or higher. The minimum supported Rust version (MSRV) may be changed in the future, but it will be done with a minor version bump (when the major version is larger than 0). * All on-by-default features of this library are covered by SemVer. * The FIPS 203 draft standard and this software is experimental -- USE AT YOUR OWN RISK! ## License Contents are licensed under either the [Apache License Version 2.0](http://www.apache.org/licenses/LICENSE-2.0) or [MIT license](http://opensource.org/licenses/MIT) at your option. ### Contribution Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in the work by you, as defined in the Apache-2.0 license, shall be dual licensed as above without any additional terms or conditions. [//]: # (badges) [crate-image]: https://buildstats.info/crate/fips203 [crate-link]: https://crates.io/crates/fips203 [docs-image]: https://docs.rs/fips203/badge.svg [docs-link]: https://docs.rs/fips203/ [build-image]: https://github.com/integritychain/fips203/workflows/test/badge.svg [build-link]: https://github.com/integritychain/fips203/actions?query=workflow%3Atest [license-image]: https://img.shields.io/badge/license-Apache2.0/MIT-blue.svg [rustc-image]: https://img.shields.io/badge/rustc-1.70+-blue.svg [//]: # (general links) [IntegrityChain]: https://github.com/integritychain/ [FIPS 203]: https://csrc.nist.gov/pubs/fips/203/ipd fips203-0.2.1/SECURITY.md000064400000000000000000000012751046102023000126100ustar 00000000000000# Security Policy ## Supported Versions Security updates are applied only to the most recent release. ## Reporting a Vulnerability If you have discovered a security vulnerability in this project, please report it privately. **Do not disclose it as a public issue.** This gives us time to work with you to fix the issue before public exposure, reducing the chance that the exploit will be used before a patch is released. Please disclose it at [security advisory](https://github.com/integritychain/ml-kem-rs/security/advisories/new). This project is maintained by a team of volunteers on a reasonable-effort basis. As such, please give us at least 90 days to work on a fix before public exposure.fips203-0.2.1/benches/README.md000064400000000000000000000021751046102023000137050ustar 00000000000000Figure-of-merit only; no particular care has been taken to disable turbo-boost etc. Note that constant-time restrictions on the implementation do impact performance. Additional performance optimizations will follow the next update to FIPS 203. Near-obvious uplift can be had with more careful modular multiplication & addition using fewer reductions. Also, 'u16' arithmetic has a performance penalty. ~~~ April 26, 2024 Intel® Core™ i7-7700K CPU @ 4.20GHz × 8 Circa 2017 w/ Rust 1.77 $ RUSTFLAGS="-C target-cpu=native" cargo bench ml_kem_512 KeyGen time: [28.597 µs 28.599 µs 28.600 µs] ml_kem_768 KeyGen time: [47.513 µs 47.534 µs 47.553 µs] ml_kem_1024 KeyGen time: [74.790 µs 74.796 µs 74.804 µs] ml_kem_512 Encaps time: [29.674 µs 29.688 µs 29.705 µs] ml_kem_768 Encaps time: [46.599 µs 46.616 µs 46.635 µs] ml_kem_1024 Encaps time: [70.481 µs 70.485 µs 70.491 µs] ml_kem_512 Decaps time: [39.454 µs 39.471 µs 39.495 µs] ml_kem_768 Decaps time: [61.607 µs 62.091 µs 62.701 µs] ml_kem_1024 Decaps time: [86.873 µs 86.894 µs 86.908 µs] ~~~ fips203-0.2.1/benches/benchmark.rs000064400000000000000000000047261046102023000147320ustar 00000000000000use criterion::{criterion_group, criterion_main, Criterion}; use fips203::traits::{Decaps, Encaps, KeyGen}; use fips203::{ml_kem_1024, ml_kem_512, ml_kem_768}; use rand_core::{CryptoRng, RngCore}; // Test RNG to regurgitate incremented values when 'asked' struct TestRng { value: u32, } impl RngCore for TestRng { fn next_u32(&mut self) -> u32 { unimplemented!() } fn next_u64(&mut self) -> u64 { unimplemented!() } fn fill_bytes(&mut self, _out: &mut [u8]) { unimplemented!() } fn try_fill_bytes(&mut self, out: &mut [u8]) -> Result<(), rand_core::Error> { out.iter_mut().for_each(|b| *b = 0); out[0..4].copy_from_slice(&self.value.to_be_bytes()); self.value = self.value.wrapping_add(1); Ok(()) } } impl CryptoRng for TestRng {} #[allow(clippy::redundant_closure)] pub fn criterion_benchmark(c: &mut Criterion) { // Generate intermediate values needed for the actual benchmark functions let mut bench_rng = TestRng { value: 0 }; let (ek_512, dk_512) = ml_kem_512::KG::try_keygen_with_rng(&mut bench_rng).unwrap(); let (_, ct_512) = ek_512.try_encaps().unwrap(); let (ek_768, dk_768) = ml_kem_768::KG::try_keygen_with_rng(&mut bench_rng).unwrap(); let (_, ct_768) = ek_768.try_encaps().unwrap(); let (ek_1024, dk_1024) = ml_kem_1024::KG::try_keygen_with_rng(&mut bench_rng).unwrap(); let (_, ct_1024) = ek_1024.try_encaps().unwrap(); c.bench_function("ml_kem_512 KeyGen", |b| { b.iter(|| ml_kem_512::KG::try_keygen_with_rng(&mut bench_rng)) }); c.bench_function("ml_kem_768 KeyGen", |b| { b.iter(|| ml_kem_768::KG::try_keygen_with_rng(&mut bench_rng)) }); c.bench_function("ml_kem_1024 KeyGen", |b| { b.iter(|| ml_kem_1024::KG::try_keygen_with_rng(&mut bench_rng)) }); c.bench_function("ml_kem_512 Encaps", |b| { b.iter(|| ek_512.try_encaps_with_rng(&mut bench_rng)) }); c.bench_function("ml_kem_768 Encaps", |b| { b.iter(|| ek_768.try_encaps_with_rng(&mut bench_rng)) }); c.bench_function("ml_kem_1024 Encaps", |b| { b.iter(|| ek_1024.try_encaps_with_rng(&mut bench_rng)) }); c.bench_function("ml_kem_512 Decaps", |b| b.iter(|| dk_512.try_decaps(&ct_512))); c.bench_function("ml_kem_768 Decaps", |b| b.iter(|| dk_768.try_decaps(&ct_768))); c.bench_function("ml_kem_1024 Decaps", |b| b.iter(|| dk_1024.try_decaps(&ct_1024))); } criterion_group!(benches, criterion_benchmark); criterion_main!(benches); fips203-0.2.1/deny.toml000064400000000000000000000302161046102023000126500ustar 00000000000000# This template contains all of the possible sections and their default values # Note that all fields that take a lint level have these possible values: # * deny - An error will be produced and the check will fail # * warn - A warning will be produced, but the check will not fail # * allow - No warning or error will be produced, though in some cases a note # will be # The values provided in this template are the default values that will be used # when any section or field is not specified in your own configuration # Root options # If 1 or more target triples (and optionally, target_features) are specified, # only the specified targets will be checked when running `cargo deny check`. # This means, if a particular package is only ever used as a target specific # dependency, such as, for example, the `nix` crate only being used via the # `target_family = "unix"` configuration, that only having windows targets in # this list would mean the nix crate, as well as any of its exclusive # dependencies not shared by any other crates, would be ignored, as the target # list here is effectively saying which targets you are building for. targets = [ # The triple can be any string, but only the target triples built in to # rustc (as of 1.40) can be checked against actual config expressions #{ triple = "x86_64-unknown-linux-musl" }, # You can also specify which target_features you promise are enabled for a # particular target. target_features are currently not validated against # the actual valid features supported by the target architecture. #{ triple = "wasm32-unknown-unknown", features = ["atomics"] }, ] # When creating the dependency graph used as the source of truth when checks are # executed, this field can be used to prune crates from the graph, removing them # from the view of cargo-deny. This is an extremely heavy hammer, as if a crate # is pruned from the graph, all of its dependencies will also be pruned unless # they are connected to another crate in the graph that hasn't been pruned, # so it should be used with care. The identifiers are [Package ID Specifications] # (https://doc.rust-lang.org/cargo/reference/pkgid-spec.html) #exclude = [] # If true, metadata will be collected with `--all-features`. Note that this can't # be toggled off if true, if you want to conditionally enable `--all-features` it # is recommended to pass `--all-features` on the cmd line instead all-features = false # If true, metadata will be collected with `--no-default-features`. The same # caveat with `all-features` applies no-default-features = false # If set, these feature will be enabled when collecting metadata. If `--features` # is specified on the cmd line they will take precedence over this option. #features = [] # When outputting inclusion graphs in diagnostics that include features, this # option can be used to specify the depth at which feature edges will be added. # This option is included since the graphs can be quite large and the addition # of features from the crate(s) to all of the graph roots can be far too verbose. # This option can be overridden via `--feature-depth` on the cmd line feature-depth = 1 # This section is considered when running `cargo deny check advisories` # More documentation for the advisories section can be found here: # https://embarkstudios.github.io/cargo-deny/checks/advisories/cfg.html [advisories] # The path where the advisory database is cloned/fetched into db-path = "~/.cargo/advisory-db" # The url(s) of the advisory databases to use db-urls = ["https://github.com/rustsec/advisory-db"] # The lint level for security vulnerabilities vulnerability = "deny" # The lint level for unmaintained crates unmaintained = "warn" # The lint level for crates that have been yanked from their source registry yanked = "warn" # The lint level for crates with security notices. notice = "warn" # A list of advisory IDs to ignore. Note that ignored advisories will still # output a note when they are encountered. ignore = [ "RUSTSEC-2021-0139", "RUSTSEC-2021-0145" #"RUSTSEC-0000-0000", ] # Threshold for security vulnerabilities, any vulnerability with a CVSS score # lower than the range specified will be ignored. Note that ignored advisories # will still output a note when they are encountered. # * None - CVSS Score 0.0 # * Low - CVSS Score 0.1 - 3.9 # * Medium - CVSS Score 4.0 - 6.9 # * High - CVSS Score 7.0 - 8.9 # * Critical - CVSS Score 9.0 - 10.0 #severity-threshold = # If this is true, then cargo deny will use the git executable to fetch advisory database. # If this is false, then it uses a built-in git library. # Setting this to true can be helpful if you have special authentication requirements that cargo-deny does not support. # See Git Authentication for more information about setting up git authentication. #git-fetch-with-cli = true # This section is considered when running `cargo deny check licenses` # More documentation for the licenses section can be found here: # https://embarkstudios.github.io/cargo-deny/checks/licenses/cfg.html [licenses] # The lint level for crates which do not have a detectable license unlicensed = "deny" # List of explicitly allowed licenses # See https://spdx.org/licenses/ for list of possible licenses # [possible values: any SPDX 3.11 short identifier (+ optional exception)]. allow = [ "MIT", "Apache-2.0", "BSD-3-Clause" #"Apache-2.0 WITH LLVM-exception", ] # List of explicitly disallowed licenses # See https://spdx.org/licenses/ for list of possible licenses # [possible values: any SPDX 3.11 short identifier (+ optional exception)]. deny = [ #"Nokia", ] # Lint level for licenses considered copyleft copyleft = "warn" # Blanket approval or denial for OSI-approved or FSF Free/Libre licenses # * both - The license will be approved if it is both OSI-approved *AND* FSF # * either - The license will be approved if it is either OSI-approved *OR* FSF # * osi - The license will be approved if it is OSI approved # * fsf - The license will be approved if it is FSF Free # * osi-only - The license will be approved if it is OSI-approved *AND NOT* FSF # * fsf-only - The license will be approved if it is FSF *AND NOT* OSI-approved # * neither - This predicate is ignored and the default lint level is used allow-osi-fsf-free = "neither" # Lint level used when no other predicates are matched # 1. License isn't in the allow or deny lists # 2. License isn't copyleft # 3. License isn't OSI/FSF, or allow-osi-fsf-free = "neither" default = "deny" # The confidence threshold for detecting a license from license text. # The higher the value, the more closely the license text must be to the # canonical license text of a valid SPDX license file. # [possible values: any between 0.0 and 1.0]. confidence-threshold = 0.8 # Allow 1 or more licenses on a per-crate basis, so that particular licenses # aren't accepted for every possible crate as with the normal allow list exceptions = [ # Each entry is the crate and version constraint, and its specific allow # list { allow = ["Unicode-DFS-2016"], name = "unicode-ident", version = "*" }, ] # Some crates don't have (easily) machine readable licensing information, # adding a clarification entry for it allows you to manually specify the # licensing information #[[licenses.clarify]] # The name of the crate the clarification applies to #name = "ring" # The optional version constraint for the crate #version = "*" # The SPDX expression for the license requirements of the crate #expression = "MIT AND ISC AND OpenSSL" # One or more files in the crate's source used as the "source of truth" for # the license expression. If the contents match, the clarification will be used # when running the license check, otherwise the clarification will be ignored # and the crate will be checked normally, which may produce warnings or errors # depending on the rest of your configuration #license-files = [ # Each entry is a crate relative path, and the (opaque) hash of its contents #{ path = "LICENSE", hash = 0xbd0eed23 } #] [licenses.private] # If true, ignores workspace crates that aren't published, or are only # published to private registries. # To see how to mark a crate as unpublished (to the official registry), # visit https://doc.rust-lang.org/cargo/reference/manifest.html#the-publish-field. ignore = false # One or more private registries that you might publish crates to, if a crate # is only published to private registries, and ignore is true, the crate will # not have its license(s) checked registries = [ #"https://sekretz.com/registry ] # This section is considered when running `cargo deny check bans`. # More documentation about the 'bans' section can be found here: # https://embarkstudios.github.io/cargo-deny/checks/bans/cfg.html [bans] # Lint level for when multiple versions of the same crate are detected multiple-versions = "allow" # Lint level for when a crate version requirement is `*` wildcards = "allow" # The graph highlighting used when creating dotgraphs for crates # with multiple versions # * lowest-version - The path to the lowest versioned duplicate is highlighted # * simplest-path - The path to the version with the fewest edges is highlighted # * all - Both lowest-version and simplest-path are used highlight = "all" # The default lint level for `default` features for crates that are members of # the workspace that is being checked. This can be overridden by allowing/denying # `default` on a crate-by-crate basis if desired. workspace-default-features = "allow" # The default lint level for `default` features for external crates that are not # members of the workspace. This can be overridden by allowing/denying `default` # on a crate-by-crate basis if desired. external-default-features = "allow" # List of crates that are allowed. Use with care! allow = [ #{ name = "unicode-ident", version = "=1.0.12" }, # Unicode-DFS-2016 ] # List of crates to deny deny = [ # Each entry the name of a crate and a version range. If version is # not specified, all versions will be matched. #{ name = "ansi_term", version = "=0.11.0" }, # # Wrapper crates can optionally be specified to allow the crate when it # is a direct dependency of the otherwise banned crate #{ name = "ansi_term", version = "=0.11.0", wrappers = [] }, ] # List of features to allow/deny # Each entry the name of a crate and a version range. If version is # not specified, all versions will be matched. #[[bans.features]] #name = "reqwest" # Features to not allow #deny = ["json"] # Features to allow #allow = [ # "rustls", # "__rustls", # "__tls", # "hyper-rustls", # "rustls", # "rustls-pemfile", # "rustls-tls-webpki-roots", # "tokio-rustls", # "webpki-roots", #] # If true, the allowed features must exactly match the enabled feature set. If # this is set there is no point setting `deny` #exact = true # Certain crates/versions that will be skipped when doing duplicate detection. skip = [ #{ name = "ansi_term", version = "=0.11.0" }, ] # Similarly to `skip` allows you to skip certain crates during duplicate # detection. Unlike skip, it also includes the entire tree of transitive # dependencies starting at the specified crate, up to a certain depth, which is # by default infinite. skip-tree = [ #{ name = "ansi_term", version = "=0.11.0", depth = 20 }, ] # This section is considered when running `cargo deny check sources`. # More documentation about the 'sources' section can be found here: # https://embarkstudios.github.io/cargo-deny/checks/sources/cfg.html [sources] # Lint level for what to happen when a crate from a crate registry that is not # in the allow list is encountered unknown-registry = "warn" # Lint level for what to happen when a crate from a git repository that is not # in the allow list is encountered unknown-git = "warn" # List of URLs for allowed crate registries. Defaults to the crates.io index # if not specified. If it is specified but empty, no registries are allowed. allow-registry = ["https://github.com/rust-lang/crates.io-index"] # List of URLs for allowed Git repositories allow-git = [] [sources.allow-org] # 1 or more github.com organizations to allow git sources for #github = [""] # 1 or more gitlab.com organizations to allow git sources for #gitlab = [""] # 1 or more bitbucket.org organizations to allow git sources for #bitbucket = [""] fips203-0.2.1/rustfmt.toml000064400000000000000000000040461046102023000134170ustar 00000000000000max_width = 100 hard_tabs = false tab_spaces = 4 newline_style = "Auto" indent_style = "Block" use_small_heuristics = "Default" fn_call_width = 80 attr_fn_like_width = 100 struct_lit_width = 60 struct_variant_width = 60 array_width = 60 chain_width = 100 single_line_if_else_max_width = 50 single_line_let_else_max_width = 50 wrap_comments = false format_code_in_doc_comments = true doc_comment_code_block_width = 100 comment_width = 80 normalize_comments = false normalize_doc_attributes = false format_strings = false format_macro_matchers = false format_macro_bodies = true skip_macro_invocations = [] hex_literal_case = "Preserve" empty_item_single_line = true struct_lit_single_line = true fn_single_line = true where_single_line = false imports_indent = "Block" imports_layout = "Mixed" imports_granularity = "Preserve" group_imports = "Preserve" reorder_imports = true reorder_modules = true reorder_impl_items = true type_punctuation_density = "Wide" space_before_colon = false space_after_colon = true spaces_around_ranges = false binop_separator = "Front" remove_nested_parens = true combine_control_expr = true short_array_element_width_threshold = 10 overflow_delimited_expr = false struct_field_align_threshold = 0 enum_discrim_align_threshold = 0 match_arm_blocks = true match_arm_leading_pipes = "Never" force_multiline_blocks = false fn_params_layout = "Compressed" brace_style = "SameLineWhere" control_brace_style = "AlwaysSameLine" trailing_semicolon = true trailing_comma = "Vertical" match_block_trailing_comma = false blank_lines_upper_bound = 2 blank_lines_lower_bound = 0 edition = "2021" version = "One" inline_attribute_width = 0 format_generated_files = true merge_derives = true use_try_shorthand = false use_field_init_shorthand = false force_explicit_abi = true condense_wildcard_suffixes = false color = "Auto" required_version = "1.7.0" unstable_features = false disable_all_formatting = false skip_children = false hide_parse_errors = false error_on_line_overflow = false error_on_unformatted = false ignore = [] emit_mode = "Files" make_backup = false fips203-0.2.1/src/byte_fns.rs000064400000000000000000000122731046102023000137650ustar 00000000000000use crate::helpers::ensure; use crate::types::Z; use crate::Q; // Note: Algorithm 2 and 3 have been "optimized away" as they had a lot of overhead // and made memory allocations tricky. The definitions are left here for reference. // /// Algorithm 2 `BitsToBytes(b)` on page 17. // /// Converts a bit string (of length a multiple of eight) into an array of bytes. // /// // /// Input: bit array b ∈ {0,1}^{8·ℓ}
// /// Output: byte array B ∈ B^ℓ // /// Algorithm 3 `BytesToBits(B)` on page 18. // /// Performs the inverse of `BitsToBytes`, converting a byte array into a bit array. // /// // /// Input: byte array B ∈ B^ℓ
// /// Output: bit array b ∈ {0,1}^{8·ℓ} /// Algorithm 4 `ByteEncode_d(F)` on page 19. /// Encodes an array of `d`-bit integers into a byte array, for `1 ≤ d ≤ 12`. /// This is an optimized variant (which does not use individual bit functions). /// /// Input: integer array `F ∈ Z^{256}_m`, where `m = 2^d if d < 12` and `m = q if d = 12`
/// Output: byte array B ∈ B^{32·d} pub(crate) fn byte_encode(d: u32, integers_f: &[Z; 256], bytes_b: &mut [u8]) { debug_assert_eq!(bytes_b.len(), 32 * d as usize, "Alg 4: bytes_b len is not 32 * d"); debug_assert!( integers_f .iter() .all(|f| f.get_u16() <= if d < 12 { 1 << d } else { Q }), "Alg 4: integers_f out of range" ); // // Our "working" register, from which to drop bytes out of let mut temp = 0u32; // Bit index of current temp contents, and byte index of current output let mut bit_index = 0; let mut byte_index = 0; // Work through each of the input integers for coeff in integers_f { // // Get coeff and clean off top bits let coeff = coeff.get_u32() & ((1 << d) - 1); // Drop coeff into the upper unused bit positions of coeff; adjust bit index temp |= coeff << bit_index; bit_index += d as usize; // While we have enough bits to drop a byte, do so while bit_index > 7 { // // Drop the byte bytes_b[byte_index] = temp.to_le_bytes()[0]; // avoids u8 cast // Update the indices temp >>= 8; byte_index += 1; bit_index -= 8; } } } /// Algorithm 5 `ByteDecode_d(B)` on page 19. /// Decodes a byte array into an array of d-bit integers, for 1 ≤ d ≤ 12. /// This is an optimized variant (which does not use individual bit functions). /// /// Input: byte array B ∈ B^{32·d}
/// Output: integer array `F ∈ Z^256_m`, where `m = 2^d if d < 12` and `m = q if d = 12` pub(crate) fn byte_decode( d: u32, bytes_b: &[u8], integers_f: &mut [Z; 256], ) -> Result<(), &'static str> { debug_assert_eq!(bytes_b.len(), 32 * d as usize, "Alg 5: bytes len is not 32 * d"); // // Our "working" register let mut temp = 0u32; // Bit index of current temp contents, and int index of current output let mut bit_index = 0; let mut int_index = 0; // Work through every byte in the input for byte in bytes_b { // // Drop the byte into the upper/empty portion of temp; update bit index temp |= u32::from(*byte) << bit_index; bit_index += 8; // If we have enough bits to drop an int, do so #[allow(clippy::cast_possible_truncation)] // Intentional truncation, temp as u16 while bit_index >= d { // // Mask off the upper portion and drop it in let mut z = Z::default(); z.set_u16((temp & ((1 << d) - 1)) as u16); integers_f[int_index] = z; // Update the indices bit_index -= d; temp >>= d; int_index += 1; } } // Supports modulus check per FIPS 203 section 6.2.2 let m = if d < 12 { 1 << d } else { u32::from(Q) }; ensure!(integers_f.iter().all(|e| e.get_u32() < m), "Alg 5: integers out of range"); Ok(()) } #[cfg(test)] mod tests { extern crate alloc; use alloc::vec; use alloc::vec::Vec; use rand::{Rng, SeedableRng}; use crate::byte_fns::{byte_decode, byte_encode}; use crate::types::Z; // Simple round trip tests... #[test] fn test_decode_and_encode() { let mut rng = rand_chacha::ChaCha8Rng::seed_from_u64(123); let mut integer_array = [Z::default(); 256]; for num_bits in 2..12_u32 { for _i in 0..100 { let num_bytes = 32 * num_bits as usize; let mut bytes2 = vec![0u8; num_bytes]; let bytes1: Vec = (0..num_bytes).map(|_| rng.gen()).collect(); byte_decode(num_bits, &bytes1, &mut integer_array).unwrap(); byte_encode(num_bits, &integer_array, &mut bytes2); assert_eq!(bytes1, bytes2); } } } #[test] fn test_result_errs() { let mut integer_array = [Z::default(); 256]; let num_bits = 12; let num_bytes = 32 * num_bits as usize; let bytes1: Vec = (0..num_bytes).map(|_| 0xFF).collect(); let ret = byte_decode(num_bits, &bytes1, &mut integer_array); assert!(ret.is_err()); integer_array.iter_mut().for_each(|x| x.set_u16(u16::MAX)); } } fips203-0.2.1/src/helpers.rs000064400000000000000000000127201046102023000136130ustar 00000000000000use crate::ntt::multiply_ntts; use crate::types::Z; use crate::Q; use sha3::digest::{ExtendableOutput, Update, XofReader}; use sha3::{Digest, Sha3_256, Sha3_512, Shake128, Shake256}; /// If the condition is not met, return an error message. Borrowed from the `anyhow` crate. macro_rules! ensure { ($cond:expr, $msg:literal $(,)?) => { if !$cond { return Err($msg); } }; } pub(crate) use ensure; // make available throughout crate /// Vector addition; See bottom of page 9, second row: `z_hat` = `u_hat` + `v_hat` #[must_use] pub(crate) fn add_vecs( vec_a: &[[Z; 256]; K], vec_b: &[[Z; 256]; K], ) -> [[Z; 256]; K] { let mut result = [[Z::default(); 256]; K]; for i in 0..K { for n in 0..256 { result[i][n] = vec_a[i][n].add(vec_b[i][n]); } } result } /// Matrix by vector multiplication; See top of page 10, first row: `w_hat` = `A_hat` mul `u_hat` #[must_use] pub(crate) fn mul_mat_vec( a_hat: &[[[Z; 256]; K]; K], u_hat: &[[Z; 256]; K], ) -> [[Z; 256]; K] { let mut w_hat = [[Z::default(); 256]; K]; for i in 0..K { #[allow(clippy::needless_range_loop)] // alternative is harder to understand for j in 0..K { let tmp = multiply_ntts(&a_hat[i][j], &u_hat[j]); for n in 0..256 { w_hat[i][n] = w_hat[i][n].add(tmp[n]); } } } w_hat } /// Matrix transpose by vector multiplication; See top of page 10, second row: `y_hat` = `A_hat^T` mul `u_hat` #[must_use] pub(crate) fn mul_mat_t_vec( a_hat: &[[[Z; 256]; K]; K], u_hat: &[[Z; 256]; K], ) -> [[Z; 256]; K] { let mut y_hat = [[Z::default(); 256]; K]; #[allow(clippy::needless_range_loop)] // alternative is harder to understand for i in 0..K { #[allow(clippy::needless_range_loop)] // alternative is harder to understand for j in 0..K { let tmp = multiply_ntts(&a_hat[j][i], &u_hat[j]); for n in 0..256 { y_hat[i][n] = y_hat[i][n].add(tmp[n]); } } } y_hat } /// Vector dot product; See top of page 10, third row: `z_hat` = `u_hat^T` mul `v_hat` #[must_use] pub(crate) fn dot_t_prod(u_hat: &[[Z; 256]; K], v_hat: &[[Z; 256]; K]) -> [Z; 256] { let mut result = [Z::default(); 256]; for j in 0..K { let tmp = multiply_ntts(&u_hat[j], &v_hat[j]); for n in 0..256 { result[n] = result[n].add(tmp[n]); } } result } /// Function PRF on page 16 (4.1). #[must_use] pub(crate) fn prf(s: &[u8; 32], b: u8) -> [u8; ETA_64] { let mut hasher = Shake256::default(); hasher.update(s); hasher.update(&[b]); let mut reader = hasher.finalize_xof(); let mut result = [0u8; ETA_64]; reader.read(&mut result); result } /// Function XOF on page 16 (4.2), used with 32-byte `rho` #[must_use] pub(crate) fn xof(rho: &[u8; 32], i: u8, j: u8) -> impl XofReader { //debug_assert_eq!(rho.len(), 32); let mut hasher = Shake128::default(); hasher.update(rho); hasher.update(&[i]); hasher.update(&[j]); hasher.finalize_xof() } /// Function G on page 17 (4.4).
/// `g()` is utilized in several different fashions: on a single array as well /// as on two concatenated arrays. The single signature here has sufficient /// flexibility for reuse and avoiding an unnecessary prior concatenation. pub(crate) fn g(bytes: &[&[u8]]) -> ([u8; 32], [u8; 32]) { let mut hasher = Sha3_512::new(); bytes.iter().for_each(|b| Digest::update(&mut hasher, b)); let digest = hasher.finalize(); let a = digest[0..32].try_into().expect("g_a fail"); let b = digest[32..64].try_into().expect("g_b fail"); (a, b) } /// Function H on page 17 (4.3).
/// `h()` is used on a variable-length ek, so the signature here is a slice. #[must_use] pub(crate) fn h(bytes: &[u8]) -> [u8; 32] { let mut hasher = Sha3_256::new(); Digest::update(&mut hasher, bytes); let digest = hasher.finalize(); digest.into() } /// Function J n page 17 (4.4).
/// `j()` is similar to `g()` above in that the second operand is a variable /// length `ct`. The signature here is for ease of use. #[must_use] pub(crate) fn j(z: &[u8; 32], ct: &[u8]) -> [u8; 32] { let mut hasher = Shake256::default(); hasher.update(z); hasher.update(ct); let mut reader = hasher.finalize_xof(); let mut result = [0u8; 32]; reader.read(&mut result); result } /// Compress from page 18 (4.5). /// x → ⌈(2^d/q) · x⌋ /// `d` comes from fixed security parameter, `inout` saves some allocation. /// This works for all odd q = 17 to 6307, d = 0 to 11, and x = 0 to q-1. #[allow(clippy::cast_possible_truncation)] // last line (and const) pub(crate) fn compress_vector(d: u32, inout: &mut [Z]) { const M: u32 = (((1u64 << 36) + Q as u64 - 1) / Q as u64) as u32; for x_ref in &mut *inout { let y = (x_ref.get_u32() << d) + (u32::from(Q) >> 1); let result = (u64::from(y) * u64::from(M)) >> 36; x_ref.set_u16(result as u16); } } /// Decompress from page 18 (4.6). /// y → ⌈(q/2^d) · y⌋ /// `d` comes from fixed security parameter, `inout` saves some allocation #[allow(clippy::cast_possible_truncation)] // last line pub(crate) fn decompress_vector(d: u32, inout: &mut [Z]) { for y_ref in &mut *inout { let qy = u32::from(Q) * y_ref.get_u32() + (1 << d) - 1; y_ref.set_u16((qy >> d) as u16); } } fips203-0.2.1/src/k_pke.rs000064400000000000000000000240201046102023000132360ustar 00000000000000use crate::byte_fns::{byte_decode, byte_encode}; use crate::helpers::{ add_vecs, compress_vector, decompress_vector, dot_t_prod, g, mul_mat_t_vec, mul_mat_vec, prf, xof, }; use crate::ntt::{ntt, ntt_inv}; use crate::sampling::{sample_ntt, sample_poly_cbd}; use crate::types::Z; use rand_core::CryptoRngCore; /// Algorithm 12 `K-PKE.KeyGen()` on page 26. /// Generates an encryption key and a corresponding decryption key. /// /// Output: encryption key `ekPKE ∈ B^{384·k+32}`
/// Output: decryption key `dkPKE ∈ B^{384·k}` #[allow(clippy::similar_names)] pub(crate) fn k_pke_key_gen( rng: &mut impl CryptoRngCore, ek_pke: &mut [u8], dk_pke: &mut [u8], ) -> Result<(), &'static str> { debug_assert_eq!(ek_pke.len(), 384 * K + 32, "Alg12: ek_pke not 384 * K + 32"); debug_assert_eq!(dk_pke.len(), 384 * K, "Alg12: dk_pke not 384 * K"); // 1: d ←− B^{32} ▷ d is 32 random bytes (see Section 3.3) let mut d = [0u8; 32]; rng.try_fill_bytes(&mut d).map_err(|_| "Alg12: random number generator failed")?; // 2: (ρ, σ) ← G(d) ▷ expand to two pseudorandom 32-byte seeds let (rho, sigma) = g(&[&d]); // 3: N ← 0 let mut n = 0; // Steps 4-8 in gen_a_hat() below let a_hat = gen_a_hat(&rho); // 9: for (i ← 0; i < k; i ++) ▷ generate s ∈ (Z_q^{256})^k // 10: s[i] ← SamplePolyCBDη1(PRFη1(σ, N)) ▷ s[i] ∈ Z^{256}_q sampled from CBD // 11: N ← N +1 // 12: end for let s: [[Z; 256]; K] = core::array::from_fn(|_| { let x = sample_poly_cbd(&prf::(&sigma, n)); n += 1; x }); // 13: for (i ← 0; i < k; i++) ▷ generate e ∈ (Z_q^{256})^k // 14: e[i] ← SamplePolyCBDη1(PRFη1(σ, N)) ▷ e[i] ∈ Z^{256}_q sampled from CBD // 15: N ← N +1 // 16: end for let e: [[Z; 256]; K] = core::array::from_fn(|_| { let x = sample_poly_cbd(&prf::(&sigma, n)); n += 1; x }); // 17: s_hat ← NTT(s) ▷ NTT is run k times (once for each coordinate of s) let s_hat: [[Z; 256]; K] = core::array::from_fn(|i| ntt(&s[i])); // 18: ê ← NTT(e) ▷ NTT is run k times let e_hat: [[Z; 256]; K] = core::array::from_fn(|i| ntt(&e[i])); // 19: t̂ ←  ◦ ŝ + ê let as_hat = mul_mat_vec(&a_hat, &s_hat); let t_hat = add_vecs(&as_hat, &e_hat); // 20: ek_{PKE} ← ByteEncode12(t̂)∥ρ ▷ ByteEncode12 is run k times; include seed for  for i in 0..K { byte_encode(12, &t_hat[i], &mut ek_pke[i * 384..(i + 1) * 384]); } ek_pke[K * 384..].copy_from_slice(&rho); // 21: dk_{PKE} ← ByteEncode12(ŝ) ▷ ByteEncode12 is run k times for i in 0..K { byte_encode(12, &s_hat[i], &mut dk_pke[i * 384..(i + 1) * 384]); } // 22: return (ekPKE , dkPKE ) Ok(()) } /// Shared function for `k_pke_key_gen()` and `k_pke_encrypt()`; steps 4-8 fn gen_a_hat(rho: &[u8; 32]) -> [[[Z; 256]; K]; K] { // // 4: for (i ← 0; i < k; i++) ▷ generate matrix A ∈ (Z^{256}_q)^{k×k} let mut a_hat = [[[Z::default(); 256]; K]; K]; for (i, row) in a_hat.iter_mut().enumerate().take(K) { // // 5: for (j ← 0; j < k; j++) for (j, entry) in row.iter_mut().enumerate().take(K) { // // 6: A_hat[i, j] ← SampleNTT(XOF(ρ, i, j)) ▷ each entry of  uniform in NTT domain // See page 21 regarding transpose of i, j -? j, i in XOF() https://csrc.nist.gov/files/pubs/fips/203/ipd/docs/fips-203-initial-public-comments-2023.pdf *entry = sample_ntt(xof(rho, j.to_le_bytes()[0], i.to_le_bytes()[0])); // 7: end for } // 8: end for } a_hat } /// Algorithm 13 `K-PKE.Encrypt(ekPKE , m, r)` on page 27. /// Uses the encryption key to encrypt a plaintext message using the randomness r. /// /// Input: encryption key `ekPKE` ∈ `B^{384·k+32}`
/// Input: message `m` ∈ `B^{32}`
/// Input: encryption randomness `r` ∈ `B^{32}`
/// Output: ciphertext `c` ∈ `B^{32(du·k+dv)}`
#[allow(clippy::many_single_char_names, clippy::too_many_arguments)] pub(crate) fn k_pke_encrypt( du: u32, dv: u32, ek: &[u8], m: &[u8], randomness: &[u8; 32], ct: &mut [u8], ) -> Result<(), &'static str> { debug_assert_eq!(ek.len(), 384 * K + 32, "Alg 13: ek len not 384 * K + 32"); debug_assert_eq!(m.len(), 32, "Alg 13: m len not 32"); // 1: N ← 0 let mut n = 0; // 2: t̂ ← ByteDecode12 (ekPKE [0 : 384k]) let mut t_hat = [[Z::default(); 256]; K]; for i in 0..K { byte_decode(12, &ek[384 * i..384 * (i + 1)], &mut t_hat[i])?; } // 3: ρ ← ekPKE [384k : 384k + 32] ▷ extract 32-byte seed from ekPKE let rho = &ek[384 * K..(384 * K + 32)].try_into().unwrap(); // Steps 4-8 in gen_a_hat() above let a_hat = gen_a_hat(rho); // 9: for (i ← 0; i < k; i ++) // 10: r[i] ← SamplePolyCBDη 1 (PRFη 1 (r, N)) ▷ r[i] ∈ Z^{256}_q sampled from CBD // 11: N ← N +1 // 12: end for let r: [[Z; 256]; K] = core::array::from_fn(|_| { let x = sample_poly_cbd(&prf::(randomness, n)); n += 1; x }); // 13: for (i ← 0; i < k; i ++) ▷ generate e1 ∈ (Z_q^{256})^k // 14: e1 [i] ← SamplePolyCBDη2(PRFη2(r, N)) ▷ e1 [i] ∈ Z^{256}_q sampled from CBD // 15: N ← N +1 // 16: end for let e1: [[Z; 256]; K] = core::array::from_fn(|_| { let x = sample_poly_cbd(&prf::(randomness, n)); n += 1; x }); // 17: e2 ← SamplePolyCBDη(PRFη2(r, N)) ▷ sample e2 ∈ Z^{256}_q from CBD let e2 = sample_poly_cbd(&prf::(randomness, n)); // 18: r̂ ← NTT(r) ▷ NTT is run k times let r_hat: [[Z; 256]; K] = core::array::from_fn(|i| ntt(&r[i])); // 19: u ← NTT−1 (Â⊺ ◦ r̂) + e1 let mut u = mul_mat_t_vec(&a_hat, &r_hat); for u_i in &mut u { *u_i = ntt_inv(u_i); } u = add_vecs(&u, &e1); // 20: µ ← Decompress1(ByteDecode1(m))) let mut mu = [Z::default(); 256]; byte_decode(1, m, &mut mu)?; decompress_vector(1, &mut mu); // 21: v ← NTT−1 (t̂⊺ ◦ r̂) + e2 + µ ▷ encode plaintext m into polynomial v. let mut v = ntt_inv(&dot_t_prod(&t_hat, &r_hat)); v = add_vecs(&add_vecs(&[v], &[e2]), &[mu])[0]; // 22: c1 ← ByteEncode_{du}(Compress_{du}(u)) ▷ ByteEncode_{du} is run k times let step = 32 * du as usize; for i in 0..K { compress_vector(du, &mut u[i]); byte_encode(du, &u[i], &mut ct[i * step..(i + 1) * step]); } // 23: c2 ← ByteEncode_{dv}(Compress_{dv}(v)) compress_vector(dv, &mut v); byte_encode(dv, &v, &mut ct[K * step..(K * step + 32 * dv as usize)]); // 24: return c ← (c1 ∥ c2 ) Ok(()) } /// Algorithm 14 `K-PKE.Decrypt(dkPKE, c)` on page 28. /// Uses the decryption key to decrypt a ciphertext. /// /// Input: decryption key `dk_{PKE}` ∈ `B^{384·k}` /// Input: ciphertext `c` ∈ `B^{32(du·k+dv)}` /// Output: message `m` ∈ `B^{32}` pub(crate) fn k_pke_decrypt( du: u32, dv: u32, dk: &[u8], ct: &[u8], ) -> Result<[u8; 32], &'static str> { debug_assert_eq!(dk.len(), 384 * K, "Alg 14: dk len not 384 * K"); debug_assert_eq!( ct.len(), 32 * (du as usize * K + dv as usize), "Alg 14: ct len not 32 * (DU * K + DV)" ); // 1: c1 ← c[0 : 32du k] let c1 = &ct[0..32 * du as usize * K]; // 2: c2 ← c[32du k : 32(du*k + dv)] let c2 = &ct[32 * du as usize * K..32 * (du as usize * K + dv as usize)]; // 3: u ← Decompress_{du}(ByteDecode_{du}(c_1)) ▷ ByteDecode_{du} invoked k times let mut u = [[Z::default(); 256]; K]; for i in 0..K { byte_decode(du, &c1[32 * du as usize * i..32 * du as usize * (i + 1)], &mut u[i])?; decompress_vector(du, &mut u[i]); } // 4: v ← Decompress_{dv}(ByteDecode_{dv}(c_2)) let mut v = [Z::default(); 256]; byte_decode(dv, c2, &mut v)?; decompress_vector(dv, &mut v); // 5: s_hat ← ByteDecode_{12}(dk_{PKE}) let mut s_hat = [[Z::default(); 256]; K]; for i in 0..K { byte_decode(12, &dk[384 * i..384 * (i + 1)], &mut s_hat[i])?; } // 6: w ← v − NTT−1 (ŝ⊺ ◦ NTT(u)) ▷ NTT−1 and NTT invoked k times let mut w = [Z::default(); 256]; let ntt_u: [[Z; 256]; K] = core::array::from_fn(|i| ntt(&u[i])); let st_ntt_u = dot_t_prod(&s_hat, &ntt_u); let yy = ntt_inv(&st_ntt_u); for i in 0..256 { w[i] = v[i].sub(yy[i]); } // 7: m ← ByteEncode1 (Compress1 (w)) ▷ decode plaintext m from polynomial v compress_vector(1, &mut w); let mut m = [0u8; 32]; byte_encode(1, &w, &mut m); // 8: return m Ok(m) } #[cfg(test)] mod tests { use rand_core::SeedableRng; use crate::k_pke::{k_pke_decrypt, k_pke_encrypt, k_pke_key_gen}; const ETA1: u32 = 3; const ETA2: u32 = 2; const DU: u32 = 10; const DV: u32 = 4; const K: usize = 2; const ETA1_64: usize = ETA1 as usize * 64; const ETA2_64: usize = ETA2 as usize * 64; const EK_LEN: usize = 800; const DK_LEN: usize = 1632; const CT_LEN: usize = 768; #[test] #[allow(clippy::similar_names)] fn test_result_errs() { let mut rng = rand_chacha::ChaCha8Rng::seed_from_u64(123); let mut ek = [0u8; EK_LEN]; let mut dk = [0u8; DK_LEN]; let mut ct = [0u8; CT_LEN]; let m = [0u8; 32]; let r = [0u8; 32]; let res = k_pke_key_gen::(&mut rng, &mut ek, &mut dk[0..384 * K]); assert!(res.is_ok()); let res = k_pke_encrypt::(DU, DV, &ek, &m, &r, &mut ct); assert!(res.is_ok()); let ff_ek = [0xFFu8; EK_LEN]; // oversized values let res = k_pke_encrypt::(DU, DV, &ff_ek, &m, &r, &mut ct); assert!(res.is_err()); let res = k_pke_decrypt::(DU, DV, &dk[0..384 * K], &ct); assert!(res.is_ok()); } } fips203-0.2.1/src/lib.rs000064400000000000000000000446601046102023000127270ustar 00000000000000#![no_std] #![deny(clippy::pedantic, warnings, missing_docs, unsafe_code)] // Most of the 'allow' category... #![deny(absolute_paths_not_starting_with_crate, box_pointers, dead_code)] #![deny(elided_lifetimes_in_paths, explicit_outlives_requirements, keyword_idents)] #![deny(let_underscore_drop, macro_use_extern_crate, meta_variable_misuse, missing_abi)] #![deny(non_ascii_idents, rust_2021_incompatible_closure_captures)] #![deny(rust_2021_incompatible_or_patterns, rust_2021_prefixes_incompatible_syntax)] #![deny(rust_2021_prelude_collisions, single_use_lifetimes, trivial_casts)] #![deny(trivial_numeric_casts, unreachable_pub, unsafe_op_in_unsafe_fn, unstable_features)] #![deny(unused_extern_crates, unused_import_braces, unused_lifetimes, unused_macro_rules)] #![deny(unused_qualifications, unused_results, variant_size_differences)] // #![doc = include_str!("../README.md")] // Implements FIPS 203 draft Module-Lattice-based Key-Encapsulation Mechanism Standard. // See // TODO Roadmap // 1. Stay current with FIPS 203 updates (due late summer 2024) // 2. Expand test coverage, looping test w/ check, add report badge // 3. Perf: optimize/minimize modular reductions, minimize u16 arith, consider avx2/aarch64 // (currently, code is 'optimized' for safety and change-support, with reasonable perf) // 4. Slightly more intelligent fuzzing (e.g., as dk contains h(ek)) // Functionality map per FIPS 203 draft // // Algorithm 2 BitsToBytes(b) on page 17 --> optimized out (byte_fns.rs) // Algorithm 3 BytesToBits(B) on page 18 --> optimized out (byte_fns.rs) // Algorithm 4 ByteEncode_d(F) on page 19 --> byte_fns.rs // Algorithm 5 ByteDecode_d(B) on page 19 --> byte_fns.rs // Algorithm 6 SampleNTT(B) on page 20 --> sampling.rs // Algorithm 7 SamplePolyCBDη(B) on page 20 --> sampling.rs // Algorithm 8 NTT(f) on page 22 --> ntt.rs // Algorithm 9 NTT−1(fˆ) on page 23 --> ntt.rs // Algorithm 10 MultiplyNTTs(fˆ,ĝ) on page 24 --> ntt.rs // Algorithm 11 BaseCaseMultiply(a0,a1,b0,b1,γ) on page 24 --> ntt.rs // Algorithm 12 K-PKE.KeyGen() on page 26 --> k_pke.rs // Algorithm 13 K-PKE.Encrypt(ekPKE,m,r) on page 27 --> k_pke.rs // Algorithm 14 K-PKE.Decrypt(dkPKE,c) on page 28 --> k_pke.rs // Algorithm 15 ML-KEM.KeyGen() on page 29 --> ml_kem.rs // Algorithm 16 ML-KEM.Encaps(ek) on page 30 --> ml_kem.rs // Algorithm 17 ML-KEM.Decaps(c,dk) on page 32 --> ml_kem.rs // PRF and XOF on page 16 --> helpers.rs // Three hash functions: G, H, J on page 17 --> helpers.rs // Compress and Decompress on page 18 --> helpers.rs // // The three parameter sets are modules in this file with injected macro code that connects // them into the functionality in ml_kem.rs. Some of the 'obtuse' coding style is driven by // `clippy pedantic`. While the API suggests the code is not constant-time, this has been // confirmed as constant-time (outside of rho) by both /fips203/dudect and /fips203/ct_cm4 // functionality. // // Note that the use of generics has been constrained to storage allocation purposes, // e.g. `[0u8; EK_LEN];` (where arithmetic expressions are not allowed), while the remainder // of the security parameters are generally passed as normal function parameters. // // The ensure!() instances are for validation purposes and cannot be turned off. The // debug_assert!() instances are (effectively) targeted by the fuzzer in /fips203/fuzz and // will support quicker future changes from the FIPS 203 specification update. /// The `rand_core` types are re-exported so that users of fips203 do not /// have to worry about using the exact correct version of `rand_core`. pub use rand_core::{CryptoRng, Error as RngError, RngCore}; use crate::traits::SerDes; use subtle::ConstantTimeEq; use zeroize::{Zeroize, ZeroizeOnDrop}; mod byte_fns; mod helpers; mod k_pke; mod ml_kem; mod ntt; mod sampling; mod types; /// All functionality is covered by traits, such that consumers can utilize trait objects if desired. pub mod traits; // Relevant to all parameter sets const Q: u16 = 3329; const ZETA: u16 = 17; /// Shared Secret Key length for all ML-KEM variants (in bytes) pub const SSK_LEN: usize = 32; /// The (opaque) secret key that can be de/serialized by each party. #[derive(Clone, Debug, Zeroize, ZeroizeOnDrop)] pub struct SharedSecretKey([u8; SSK_LEN]); impl SerDes for SharedSecretKey { type ByteArray = [u8; SSK_LEN]; fn into_bytes(self) -> Self::ByteArray { self.0 } fn try_from_bytes(ssk: Self::ByteArray) -> Result { // The `try_` is not really needed but implemented for symmetry/consistency, e.g., there // is no opportunity for validation (yet), but using a Result for the future possibility Ok(SharedSecretKey(ssk)) } } // Conservative (constant-time) support... impl PartialEq for SharedSecretKey { fn eq(&self, other: &Self) -> bool { bool::from(self.0.ct_eq(&other.0)) } } // This common functionality is injected into each parameter set module macro_rules! functionality { () => { use crate::byte_fns::byte_decode; use crate::helpers::{ensure, h}; use crate::ml_kem::{ml_kem_decaps, ml_kem_encaps, ml_kem_key_gen}; use crate::traits::{Decaps, Encaps, KeyGen, SerDes}; use crate::types::Z; use crate::SharedSecretKey; use rand_core::{CryptoRng, CryptoRngCore, RngCore}; /// Correctly sized encapsulation key specific to the target security parameter set. pub type EncapsKey = crate::types::EncapsKey; /// Correctly sized decapsulation key specific to the target security parameter set. pub type DecapsKey = crate::types::DecapsKey; /// Correctly sized ciphertext specific to the target security parameter set. pub type CipherText = crate::types::CipherText; /// Supports the `KeyGen` trait, allowing for keypair generation pub struct KG(); impl KeyGen for KG { type DecapsByteArray = [u8; DK_LEN]; type DecapsKey = DecapsKey; type EncapsByteArray = [u8; EK_LEN]; type EncapsKey = EncapsKey; fn try_keygen_with_rng( rng: &mut impl CryptoRngCore, ) -> Result<(EncapsKey, DecapsKey), &'static str> { let (mut ek, mut dk) = ([0u8; EK_LEN], [0u8; DK_LEN]); ml_kem_key_gen::(rng, &mut ek, &mut dk)?; Ok((EncapsKey { 0: ek }, DecapsKey { 0: dk })) } #[allow(clippy::items_after_statements)] // Introduce A5Rng just when needed prior to encaps fn validate_keypair_vartime( ek: &Self::EncapsByteArray, dk: &Self::DecapsByteArray, ) -> bool { // Note that size is checked by only accepting a ref to a correctly sized byte array let len_ek_pke = 384 * K + 32; let len_dk_pke = 384 * K; // 1. dk should contain ek if !(*ek == dk[len_dk_pke..(len_dk_pke + len_ek_pke)]) { return false; }; // 2. dk should contain hash of ek if !(h(ek) == dk[(len_dk_pke + len_ek_pke)..(len_dk_pke + len_ek_pke + 32)]) { return false; }; // 3. ek and dk should deserialize ok let ek = EncapsKey::try_from_bytes(*ek); let dk = DecapsKey::try_from_bytes(*dk); if ek.is_err() || dk.is_err() { return false; }; // A dummy RNG for use in `try_encaps_with_rng()` so that it doesn't require an external RNG struct A5Rng(); impl RngCore for A5Rng { fn next_u32(&mut self) -> u32 { unimplemented!() } fn next_u64(&mut self) -> u64 { unimplemented!() } fn fill_bytes(&mut self, _out: &mut [u8]) { unimplemented!() } fn try_fill_bytes(&mut self, out: &mut [u8]) -> Result<(), rand_core::Error> { out.iter_mut().for_each(|b| *b = 0xa5); Ok(()) } } impl CryptoRng for A5Rng {} let mut a5rng = A5Rng {}; // 4. encaps should run without a problem let ek_res = ek.unwrap().try_encaps_with_rng(&mut a5rng); if ek_res.is_err() { return false; }; // 5. decaps should run without a problem let dk_res = dk.unwrap().try_decaps(&ek_res.as_ref().unwrap().1); if dk_res.is_err() { return false; }; // 6. encaps and decaps should produce the same shared secret return ek_res.unwrap().0 == dk_res.unwrap(); } } impl Encaps for EncapsKey { type CipherText = CipherText; type SharedSecretKey = SharedSecretKey; fn try_encaps_with_rng( &self, rng: &mut impl CryptoRngCore, ) -> Result<(Self::SharedSecretKey, Self::CipherText), &'static str> { let mut ct = [0u8; CT_LEN]; let ssk = ml_kem_encaps::( rng, DU, DV, &self.0, &mut ct, )?; Ok((ssk, CipherText { 0: ct })) } } impl Decaps for DecapsKey { type CipherText = CipherText; type SharedSecretKey = SharedSecretKey; fn try_decaps(&self, ct: &CipherText) -> Result { let ssk = ml_kem_decaps::< K, { ETA1 as usize * 64 }, { ETA2 as usize * 64 }, { 32 + 32 * (DU as usize * K + DV as usize) }, CT_LEN, >(DU, DV, &self.0, &ct.0); ssk } } impl SerDes for EncapsKey { type ByteArray = [u8; EK_LEN]; fn into_bytes(self) -> Self::ByteArray { self.0 } fn try_from_bytes(ek: Self::ByteArray) -> Result { // Validation per pg 2 "the byte array containing the encapsulation key correctly // decodes to an array of integers modulo q without any modular reductions". See // also page 30. Note that accepting a byte array of fixed size, rather than a // slice of varied size, addresses check #1. let mut ek_hat = [Z::default(); 256]; for i in 0..K { byte_decode(12, &ek[384 * i..384 * (i + 1)], &mut ek_hat)?; } Ok(EncapsKey { 0: ek }) } } impl SerDes for DecapsKey { type ByteArray = [u8; DK_LEN]; fn into_bytes(self) -> Self::ByteArray { self.0 } fn try_from_bytes(dk: Self::ByteArray) -> Result { // Validation per pg 31. Note that the two checks specify fixed sizes, and these // functions take only byte arrays of correct size. Nonetheless, we take the // opportunity to validate the ek and h(ek). let len_ek_pke = 384 * K + 32; let len_dk_pke = 384 * K; let ek = &dk[len_dk_pke..len_dk_pke + EK_LEN]; let _res = EncapsKey::try_from_bytes(ek.try_into().map_err(|_| "Malformed encaps key")?)?; ensure!( h(ek) == dk[(len_dk_pke + len_ek_pke)..(len_dk_pke + len_ek_pke + 32)], "Encaps hash wrong" ); Ok(DecapsKey { 0: dk }) } } impl SerDes for CipherText { type ByteArray = [u8; CT_LEN]; fn into_bytes(self) -> Self::ByteArray { self.0 } fn try_from_bytes(ct: Self::ByteArray) -> Result { // Validation per pg 31. Note that the two checks specify fixed sizes, and these // functions take only byte arrays of correct size. Nonetheless, we use a Result // here in case future opportunities for further validation arise. Ok(CipherText { 0: ct }) } } #[cfg(test)] mod tests { use super::*; use crate::types::EncapsKey; use rand_chacha::rand_core::SeedableRng; #[test] fn smoke_test() { let mut rng = rand_chacha::ChaCha8Rng::seed_from_u64(123); for _i in 0..100 { let (ek, dk) = KG::try_keygen_with_rng(&mut rng).unwrap(); let (ssk1, ct) = ek.try_encaps_with_rng(&mut rng).unwrap(); let ssk2 = dk.try_decaps(&ct).unwrap(); assert!(KG::validate_keypair_vartime( &ek.clone().into_bytes(), &dk.clone().into_bytes() )); assert_eq!(ssk1, ssk2); assert_eq!(ek.clone().0, EncapsKey::try_from_bytes(ek.into_bytes()).unwrap().0); assert_eq!(dk.clone().0, DecapsKey::try_from_bytes(dk.into_bytes()).unwrap().0); } } } }; } /// Functionality for the ML-KEM-512 security parameter set, which is claimed to be in security category 1, see /// table 2 & 3 on page 33 of spec. #[cfg(feature = "ml-kem-512")] pub mod ml_kem_512 { //! //! See //! //! Typical usage flow entails: //! 1. The originator runs `try_keygen()` to get an encaps key `encapsKey` and decaps key `decapsKey`. //! 2. The originator serializes the encaps key via `encapsKey.into_bytes()` and sends to the remote party. //! 3. The remote party deserializes the bytes via `try_from_bytes()` and runs `try_encaps()` to get the //! shared secret key `ssk` and ciphertext `cipherText`. //! 4. The remote party serializes the cipertext via `cipherText.into_bytes()` and sends to the originator. //! 5. The originator deserializes the ciphertext via `try_from_bytes()` then //! runs `decapsKey.try_decaps(cipherText)` to the get shared secret ket `ssk`. //! 6. Both the originator and remote party now have the same shared secret key `ssk`. //! //! **--> See [`traits`] for the keygen, encapsulation, decapsulation, and serialization/deserialization functionality.** const K: usize = 2; const ETA1: u32 = 3; const ETA2: u32 = 2; const DU: u32 = 10; const DV: u32 = 4; /// Serialized Encapsulation Key Length (in bytes) pub const EK_LEN: usize = 800; /// Serialized Decapsulation Key Length (in bytes) pub const DK_LEN: usize = 1632; /// Serialized Ciphertext Key Length (in bytes) pub const CT_LEN: usize = 768; functionality!(); } /// Functionality for the ML-KEM-768 security parameter set, which is claimed to be in security category 3, see /// table 2 & 3 on page 33 of spec. #[cfg(feature = "ml-kem-768")] pub mod ml_kem_768 { //! //! See //! //! Typical usage flow entails: //! 1. The originator runs `try_keygen()` to get an encaps key `encapsKey` and decaps key `decapsKey`. //! 2. The originator serializes the encaps key via `encapsKey.into_bytes()` and sends to the remote party. //! 3. The remote party deserializes the bytes via `try_from_bytes()` and runs `try_encaps()` to get the //! shared secret key `ssk` and ciphertext `cipherText`. //! 4. The remote party serializes the cipertext via `cipherText.into_bytes()` and sends to the originator. //! 5. The originator deserializes the ciphertext via `try_from_bytes()` then //! runs `decapsKey.try_decaps(cipherText)` to the get shared secret ket `ssk`. //! 6. Both the originator and remote party now have the same shared secret key `ssk`. //! //! **--> See [`traits`] for the keygen, encapsulation, decapsulation, and serialization/deserialization functionality.** const K: usize = 3; const ETA1: u32 = 2; const ETA2: u32 = 2; const DU: u32 = 10; const DV: u32 = 4; /// Serialized Encapsulation Key Length (in bytes) pub const EK_LEN: usize = 1184; /// Serialized Decapsulation Key Length (in bytes) pub const DK_LEN: usize = 2400; /// Serialized Ciphertext Key Length (in bytes) pub const CT_LEN: usize = 1088; functionality!(); } /// Functionality for the ML-KEM-1024 security parameter set, which is claimed to be in security category 5, see /// table 2 & 3 on page 33 of spec. #[cfg(feature = "ml-kem-1024")] pub mod ml_kem_1024 { //! //! See //! //! Typical usage flow entails: //! 1. The originator runs `try_keygen()` to get an encaps key `encapsKey` and decaps key `decapsKey`. //! 2. The originator serializes the encaps key via `encapsKey.into_bytes()` and sends to the remote party. //! 3. The remote party deserializes the bytes via `try_from_bytes()` and runs `try_encaps()` to get the //! shared secret key `ssk` and ciphertext `cipherText`. //! 4. The remote party serializes the cipertext via `cipherText.into_bytes()` and sends to the originator. //! 5. The originator deserializes the ciphertext via `try_from_bytes()` then //! runs `decapsKey.try_decaps(cipherText)` to the get shared secret ket `ssk`. //! 6. Both the originator and remote party now have the same shared secret key `ssk`. //! //! **--> See [`traits`] for the keygen, encapsulation, decapsulation, and serialization/deserialization functionality.** const K: usize = 4; const ETA1: u32 = 2; const ETA2: u32 = 2; const DU: u32 = 11; const DV: u32 = 5; /// Serialized Encapsulation Key Length (in bytes) pub const EK_LEN: usize = 1568; /// Serialized Decapsulation Key Length (in bytes) pub const DK_LEN: usize = 3168; /// Serialized Ciphertext Key Length (in bytes) pub const CT_LEN: usize = 1568; functionality!(); } fips203-0.2.1/src/ml_kem.rs000064400000000000000000000160351046102023000134200ustar 00000000000000use crate::byte_fns::{byte_decode, byte_encode}; use crate::helpers::{g, h, j}; use crate::k_pke::{k_pke_decrypt, k_pke_encrypt, k_pke_key_gen}; use crate::types::Z; use crate::SharedSecretKey; use rand_core::CryptoRngCore; use subtle::{ConditionallySelectable, ConstantTimeEq}; /// Algorithm 15 `ML-KEM.KeyGen()` on page 29. /// Generates an encapsulation key and a corresponding decapsulation key. /// /// Output: Encapsulation key `ek` ∈ `B^{384·k+32}`
/// Output: Decapsulation key `dk` ∈ `B^{768·k+96}` pub(crate) fn ml_kem_key_gen( rng: &mut impl CryptoRngCore, ek: &mut [u8], dk: &mut [u8], ) -> Result<(), &'static str> { debug_assert_eq!(ek.len(), 384 * K + 32, "Alg 15: ek len not 384 * K + 32"); debug_assert_eq!(dk.len(), 768 * K + 96, "Alg 15: dk len not 768 * K + 96"); // 1: z ←− B32 ▷ z is 32 random bytes (see Section 3.3) let mut z = [0u8; 32]; rng.try_fill_bytes(&mut z) .map_err(|_| "Alg 15: Random number generator failed")?; // 2: (ek_{PKE}, dk_{PKE}) ← K-PKE.KeyGen() ▷ run key generation for K-PKE let p1 = 384 * K; k_pke_key_gen::(rng, ek, &mut dk[..p1])?; // 3: ek ← ekPKE // 4: dk ← (dkPKE ∥ek∥H(ek)∥z) (first concat element is done above alongside ek) let h_ek = h(ek); let p2 = p1 + ek.len(); let p3 = p2 + h_ek.len(); dk[p1..p2].copy_from_slice(ek); dk[p2..p3].copy_from_slice(&h_ek); dk[p3..].copy_from_slice(&z); // 5: return (ek, dk) Ok(()) } /// Algorithm 16 `ML-KEM.Encaps(ek)` on page 30. /// Uses the encapsulation key to generate a shared key and an associated ciphertext. /// /// Validated input: encapsulation key `ek` ∈ `B^{384·k+32}`
/// Output: shared key `K` ∈ `B^{32}`
/// Output: ciphertext `c` ∈ `B^{32(du·k+dv)}`
pub(crate) fn ml_kem_encaps( rng: &mut impl CryptoRngCore, du: u32, dv: u32, ek: &[u8], ct: &mut [u8], ) -> Result { debug_assert_eq!(ek.len(), 384 * K + 32, "Alg 16: ek len not 384 * K + 32"); // also: size check at top level debug_assert_eq!( ct.len(), 32 * (du as usize * K + dv as usize), "Alg 16: ct len not 32*(DU*K+DV)" ); // also: size check at top level // modulus check: perform/confirm the computation ek ← ByteEncode12(ByteDecode12(ek_tilde). // Note: An *external* ek can only arrive via try_from_bytes() which does this validation already. // As such, this check is redundant but is left in for caution, as it is removed in release builds // anyway. It also supports quicker changes if the spec moves... debug_assert!( { let mut pass = true; let mut ek_hat = [Z::default(); 256]; for i in 0..K { let mut ek_tilde = [0u8; 384]; byte_decode(12, &ek[384 * i..384 * (i + 1)], &mut ek_hat).unwrap(); // btw, going to panic byte_encode(12, &ek_hat, &mut ek_tilde); pass &= ek_tilde == ek[384 * i..384 * (i + 1)]; } pass }, "Alg 16: ek fails modulus check" ); // 1: m ←− B32 ▷ m is 32 random bytes (see Section 3.3) let mut m = [0u8; 32]; rng.try_fill_bytes(&mut m) .map_err(|_| "Alg16: random number generator failed")?; // 2: (K, r) ← G(m∥H(ek)) ▷ derive shared secret key K and randomness r let h_ek = h(ek); let (k, r) = g(&[&m, &h_ek]); // 3: c ← K-PKE.Encrypt(ek, m, r) ▷ encrypt m using K-PKE with randomness r k_pke_encrypt::(du, dv, ek, &m, &r, ct)?; // 4: return (K, c) (note: ct is mutable input) Ok(SharedSecretKey(k)) } /// Algorithm 17 `ML-KEM.Decaps(c, dk)` on page 32. /// Uses the decapsulation key to produce a shared key from a ciphertext. /// /// Validated input: ciphertext `c` ∈ `B^{32(du·k+dv)}`
/// Validated input: decapsulation key `dk` ∈ `B^{768·k+96}`
/// Output: shared key `K` ∈ `B^{32}` #[allow(clippy::similar_names)] pub(crate) fn ml_kem_decaps< const K: usize, const ETA1_64: usize, const ETA2_64: usize, const J_LEN: usize, const CT_LEN: usize, >( du: u32, dv: u32, dk: &[u8], ct: &[u8], ) -> Result { // Ciphertext type check debug_assert_eq!(ct.len(), 32 * (du as usize * K + dv as usize), "Alg17: ct len not 32 * ..."); // Decapsulation key type check debug_assert_eq!(dk.len(), 768 * K + 96, "Alg17: dk len not 768 ..."); // Note: decaps key is either correctly sourced from KeyGen, or validated by try_from_bytes(). As // such, the two above checks are redundant but will be removed in release builds. The are left // here for A) caution, B) give guardrails for future changes // 1: dkPKE ← dk[0 : 384k] ▷ extract (from KEM decaps key) the PKE decryption key let dk_pke = &dk[0..384 * K]; // 2: ekPKE ← dk[384k : 768k + 32] ▷ extract PKE encryption key let ek_pke = &dk[384 * K..768 * K + 32]; // 3: h ← dk[768k + 32 : 768k + 64] ▷ extract hash of PKE encryption key let h = &dk[768 * K + 32..768 * K + 64]; // 4: z ← dk[768k + 64 : 768k + 96] ▷ extract implicit rejection value let z = &dk[768 * K + 64..768 * K + 96]; // 5: m′ ← K-PKE.Decrypt(dkPKE,c) let m_prime = k_pke_decrypt::(du, dv, dk_pke, ct)?; // 6: (K′, r′) ← G(m′ ∥ h) let (mut k_prime, r_prime) = g(&[&m_prime, h]); // 7: K̄ ← J(z∥c, 32) let k_bar = j(z.try_into().unwrap(), ct); // 8: c′ ← K-PKE.Encrypt(ekPKE , m′ , r′ ) ▷ re-encrypt using the derived randomness r′ let mut c_prime = [0u8; CT_LEN]; k_pke_encrypt::( du, dv, ek_pke, &m_prime, &r_prime, &mut c_prime[0..ct.len()], )?; k_prime.conditional_assign(&k_bar, ct.ct_ne(&c_prime)); Ok(SharedSecretKey(k_prime)) } #[cfg(test)] mod tests { use rand_core::SeedableRng; use crate::ml_kem::{ml_kem_decaps, ml_kem_encaps, ml_kem_key_gen}; const ETA1: u32 = 3; const ETA2: u32 = 2; const DU: u32 = 10; const DV: u32 = 4; const K: usize = 2; const ETA1_64: usize = ETA1 as usize * 64; const ETA2_64: usize = ETA2 as usize * 64; const EK_LEN: usize = 800; const DK_LEN: usize = 1632; const CT_LEN: usize = 768; const J_LEN: usize = 32 + 32 * (DU as usize * K + DV as usize); #[test] #[allow(clippy::similar_names)] fn test_result_errs() { let mut rng = rand_chacha::ChaCha8Rng::seed_from_u64(123); let mut ek = [0u8; EK_LEN]; let mut dk = [0u8; DK_LEN]; let mut ct = [0u8; CT_LEN]; let res = ml_kem_key_gen::(&mut rng, &mut ek, &mut dk); assert!(res.is_ok()); let res = ml_kem_encaps::(&mut rng, DU, DV, &ek, &mut ct); assert!(res.is_ok()); let res = ml_kem_decaps::(DU, DV, &dk, &ct); assert!(res.is_ok()); } } fips203-0.2.1/src/ntt.rs000064400000000000000000000143001046102023000127520ustar 00000000000000use crate::types::Z; use crate::{Q, ZETA}; /// Algorithm 8 `NTT(f)` on page 22. /// Computes the NTT representation `f_hat` of the given polynomial f ∈ `R_q`. /// /// Input: array `f` ∈ `Z^{256}_q` ▷ the coefficients of the input polynomial
/// Output: array `f_hat` ∈ `Z^{256}_q` ▷ the coefficients of the NTT of the input polynomial #[must_use] #[allow(clippy::module_name_repetitions)] pub(crate) fn ntt(array_f: &[Z; 256]) -> [Z; 256] { // // 1: f_hat ← f ▷ will compute NTT in-place on a copy of input array let mut f_hat: [Z; 256] = core::array::from_fn(|i| array_f[i]); // 2: k ← 1 let mut k = 1; // 3: for (len ← 128; len ≥ 2; len ← len/2) for len in [128, 64, 32, 16, 8, 4, 2] { // // 4: for (start ← 0; start < 256; start ← start + 2 · len) for start in (0..256).step_by(2 * len) { // // 5: zeta ← ζ^{BitRev7 (k)} mod q let mut zeta = Z::default(); zeta.set_u16(ZETA_TABLE[k << 1]); // 6: k ← k+1 k += 1; // 7: for ( j ← start; j < start + len; j ++) for j in start..(start + len) { // // 8: t ← zeta · f_hat[ j + len] ▷ steps 8-10 done modulo q let t = f_hat[j + len].mul(zeta); // 9: f_hat[ j + len] ← f_hat [ j] − t f_hat[j + len] = f_hat[j].sub(t); // 10: f_hat[ j] ← f_hat[ j] + t f_hat[j] = f_hat[j].add(t); // 11: end for } // 12: end for } // 13: end for } // 14: return f_hat f_hat } /// Algorithm 9 `NTTinv(f)` on page 23. /// Computes the polynomial `f` ∈ `R_q` corresponding to the given NTT representation `f_hat` ∈ `T_q`. /// /// Input: array `f_hat` ∈ `Z^{256}` ▷ the coefficients of input NTT representation
/// Output: array `f` ∈ `Z^{256}` ▷ the coefficients of the inverse-NTT of the input #[must_use] #[allow(clippy::module_name_repetitions)] pub(crate) fn ntt_inv(f_hat: &[Z; 256]) -> [Z; 256] { // 1: f ← f_hat ▷ will compute in-place on a copy of input array let mut f: [Z; 256] = core::array::from_fn(|i| f_hat[i]); // 2: k ← 127 let mut k = 127; // 3: for (len ← 2; len ≤ 128; len ← 2 · len) for len in [2, 4, 8, 16, 32, 64, 128] { // // 4: for (start ← 0; start < 256; start ← start + 2 · len) for start in (0..256).step_by(2 * len) { // // 5: zeta ← ζ^{BitRev7(k)} mod q let mut zeta = Z::default(); zeta.set_u16(ZETA_TABLE[k << 1]); // 6: k ← k − 1 k -= 1; // 7: for ( j ← start; j < start + len; j ++) for j in start..(start + len) { // // 8: t ← f [ j] let t = f[j]; // 9: f [ j] ← t + f [ j + len] ▷ steps 9-10 done modulo q f[j] = t.add(f[j + len]); // 10: f [ j + len] ← zeta · ( f [ j + len] − t) f[j + len] = zeta.mul(f[j + len].sub(t)); // 11: end for } // 12: end for } // 13: end for } // 14: f ← f · 3303 mod q ▷ multiply every entry by 3303 ≡ 128^{−1} mod q let mut z3303 = Z::default(); z3303.set_u16(3303); f.iter_mut().for_each(|item| *item = item.mul(z3303)); // 15: return f f } /// Algorithm 10 `MultiplyNTTs(f, g)` on page 24. /// Computes the product (in the ring `T_q` ) of two NTT representations. /// /// Input: Two arrays `f_hat` ∈ `Z^{256}_q` and `g_hat` ∈ `Z^{256}_q` ▷ the coefficients of two NTT representations
/// Output: An array `h_hat` ∈ `Z^{256}_q` ▷ the coefficients of the product of the inputs #[must_use] pub(crate) fn multiply_ntts(f_hat: &[Z; 256], g_hat: &[Z; 256]) -> [Z; 256] { let mut h_hat: [Z; 256] = [Z::default(); 256]; // for (i ← 0; i < 128; i ++) for i in 0..128 { // // 2: (h_hat[2i], h_hat[2i + 1]) ← BaseCaseMultiply( f_hat[2i], f_hat[2i + 1], g_hat[2i], g_hat[2i + 1], ζ^{2BitRev7(i) + 1}) let mut zt = Z::default(); zt.set_u16(ZETA_TABLE[i ^ 0x80]); let (h_hat_2i, h_hat_2ip1) = base_case_multiply(f_hat[2 * i], f_hat[2 * i + 1], g_hat[2 * i], g_hat[2 * i + 1], zt); h_hat[2 * i] = h_hat_2i; h_hat[2 * i + 1] = h_hat_2ip1; // 3: end for } // 4: return h_hat h_hat } /// Algorithm 11 `BaseCaseMultiply(a0, a1, b0, b1, gamma)` on page 24. /// Computes the product of two degree-one polynomials with respect to a quadratic modulus. /// /// Input: `a0`, `a1`, `b0`, `b1` ∈ `Z_q` ▷ the coefficients of `a0` + `a1` X and `b0` + `b1` X /// Input: `γ` ∈ `Z_q` ▷ the modulus is `X^2 − γ` /// Output: `c0`, `c1` ∈ `Z_q` ▷ the coefficients of the product of the two polynomials #[must_use] pub(crate) fn base_case_multiply(a0: Z, a1: Z, b0: Z, b1: Z, gamma: Z) -> (Z, Z) { // 1: c0 ← a0 · b0 + a1 · b1 · γ ▷ steps 1-2 done modulo q let c0 = a0.mul(b0).add(a1.mul(b1).mul(gamma)); // 2: 2: c1 ← a0 · b1 + a1 · b0 let c1 = a0.mul(b1).add(a1.mul(b0)); // 3: return c0 , c1 (c0, c1) } // ---------- // The functionality below calculates the Zeta array at compile-time. Thus, not particularly optimal or CT. #[must_use] #[allow(clippy::cast_possible_truncation)] // const fns cannot use u32::from() etc... const fn gen_zeta_table() -> [u16; 256] { let mut result = [0u16; 256]; let mut x = 1u32; let mut i = 0u32; while i < 256 { result[(i as u8).reverse_bits() as usize] = x as u16; x = (x * (ZETA as u32)) % (Q as u32); i += 1; } result } pub(crate) static ZETA_TABLE: [u16; 256] = gen_zeta_table(); #[cfg(test)] mod tests { use crate::ntt::gen_zeta_table; use crate::traits::SerDes; use crate::SharedSecretKey; #[test] fn test_zeta_misc() { let res = gen_zeta_table(); assert_eq!(res[4], 2580); let ssk_bytes = [0u8; 32]; let ssk = SharedSecretKey::try_from_bytes(ssk_bytes); assert!(ssk.is_ok()); } } fips203-0.2.1/src/sampling.rs000064400000000000000000000103421046102023000137610ustar 00000000000000use crate::types::Z; use crate::Q; use sha3::digest::XofReader; /// Algorithm 6 `SampleNTT(B)` on page 20. /// If the input is a stream of uniformly random bytes, the output is a uniformly random element of `T_q`. /// /// Input: byte stream B ∈ B^{∗}
/// Output: array `a_hat` ∈ `Z^{256}_q` ▷ the coefficients of the NTT of a polynomial pub(crate) fn sample_ntt(mut byte_stream_b: impl XofReader) -> [Z; 256] { // let mut array_a_hat = [Z::default(); 256]; let mut bbb = [0u8; 3]; // Space for 3 random (byte) draws // 1: i ← 0 (not needed as three bytes are repeatedly drawn from the rng bytestream via bbb) // 2: j ← 0 let mut j = 0usize; // This rejection sampling loop is solely dependent upon rho which crosses a trust boundary // in the clear. Thus, it does not need to be constant time. // 3: while j < 256 do #[allow(clippy::cast_possible_truncation)] // d1 as u16, d2 as u16 while j < 256 { // // Note: two samples (d1, d2) are drawn from these per loop iteration byte_stream_b.read(&mut bbb); // Draw 3 bytes // 4: d1 ← B[i] + 256 · (B[i + 1] mod 16) let d1 = u32::from(bbb[0]) + 256 * (u32::from(bbb[1]) & 0x0F); // 5: d2 ← ⌊B[i + 1]/16⌋ + 16 · B[i + 2] let d2 = (u32::from(bbb[1]) >> 4) + 16 * u32::from(bbb[2]); // 6: if d1 < q then if d1 < u32::from(Q) { // // 7: a_hat[j] ← d1 ▷ a_hat ∈ Z256 array_a_hat[j].set_u16(d1 as u16); // 8: j ← j+1 j += 1; // 9: end if } // 10: if d2 < q and j < 256 then if (d2 < u32::from(Q)) & (j < 256) { // // 11: a_hat[j] ← d2 array_a_hat[j].set_u16(d2 as u16); // 12: j ← j+1 j += 1; // 13: end if } // 14: i ← i+3 (not needed as we draw 3 more bytes next time // 15: end while } // 16: return a_hat array_a_hat } /// Algorithm 7 `SamplePolyCBDη(B)` on page 20. /// If the input is a stream of uniformly random bytes, outputs a sample from the distribution `D_η(R_q)`.
/// This function is an optimized version that avoids the `BytesToBits` function (algorithm 3). /// /// Input: byte array B ∈ B^{64·η}
/// Output: array f ∈ `Z^{256}_q` #[must_use] pub(crate) fn sample_poly_cbd(byte_array_b: &[u8]) -> [Z; 256] { let eta = u32::try_from(byte_array_b.len()).unwrap() >> 6; debug_assert_eq!(byte_array_b.len(), 64 * eta as usize, "Alg 7: byte array not 64 * eta"); let mut array_f: [Z; 256] = [Z::default(); 256]; let mut temp = 0; let mut int_index = 0; let mut bit_index = 0; for byte in byte_array_b { temp |= u32::from(*byte) << bit_index; bit_index += 8; while bit_index >= 2 * (eta as usize) { let tmask_x = temp & ((1 << eta) - 1); let x = count_ones(tmask_x); let tmask_y = (temp >> eta) & ((1 << eta) - 1); let y = count_ones(tmask_y); let (mut xx, mut yy) = (Z::default(), Z::default()); xx.set_u16(x); yy.set_u16(y); array_f[int_index] = xx.sub(yy); bit_index -= 2 * (eta as usize); temp >>= 2 * (eta as usize); int_index += 1; } } array_f } // the u types below and above could use a bit more thought // Count u8 ones in constant time (u32 helps perf) #[allow(clippy::cast_possible_truncation)] // return x as u16 fn count_ones(x: u32) -> u16 { let x = (x & 0x5555_5555) + ((x >> 1) & 0x5555_5555); let x = (x & 0x3333_3333) + ((x >> 2) & 0x3333_3333); let x = (x & 0x0F0F_0F0F) + ((x >> 4) & 0x0F0F_0F0F); x as u16 } // The original pseudocode for Algorithm 7 follows... // Algorithm 7 `SamplePolyCBDη(B)` on page 20. // If the input is a stream of uniformly random bytes, outputs a sample from the distribution `D_η(R_q)`. // // Input: byte array B ∈ B^{64·η} // Output: array f ∈ Z^{256}_q // 1: b ← BytesToBits(B) // 2: for (i ← 0; i < 256; i ++) // 3: x ← ∑_{j=0}^{η-1} b[2iη + j] // // 4: y ← ∑_{j=0}^{η-1} b[2iη + η + j] // 5: f [i] ← x − y mod q // 6: end for // 7: return f // } fips203-0.2.1/src/traits.rs000064400000000000000000000363041046102023000134630ustar 00000000000000use rand_core::CryptoRngCore; #[cfg(feature = "default-rng")] use rand_core::OsRng; /// The `KeyGen` trait is defined to allow trait objects. pub trait KeyGen { /// The (public) encapsulation key sent from the originator to the remote party. type EncapsKey; /// The (private) decapsulation key used by the originator to generate the shared secret. type DecapsKey; /// A serialized (public) encapsulation key byte array of the correct length type EncapsByteArray; /// A serialized (private) decapsulation key of the correct length type DecapsByteArray; /// Generates an encapsulation and decapsulation key pair specific to this security parameter set.
/// This function utilizes the OS default random number generator and is intended to operate in constant /// time outside of `rho` which crosses the trust boundary in the clear. /// # Errors /// Returns an error when the random number generator fails. /// # Examples /// ```rust /// # use std::error::Error; /// # fn main() -> Result<(), Box> { /// use fips203::ml_kem_512; // Could also be ml_kem_768 or ml_kem_1024. /// use fips203::traits::{KeyGen, SerDes, Decaps, Encaps}; /// /// let (ek1, dk1) = ml_kem_512::KG::try_keygen()?; // Party 1 generates both encaps and decaps keys /// let ek1_bytes = ek1.into_bytes(); // Party 1 serializes the encaps key /// /// let ek2_bytes = ek1_bytes; // Party 1 sends encaps bytes to party 2 /// /// let ek2 = ml_kem_512::EncapsKey::try_from_bytes(ek2_bytes)?; // Party 2 deserializes the encaps key /// let (ssk2, ct2) = ek2.try_encaps()?; // Party 2 generates shared secret and ciphertext /// let ct2_bytes = ct2.into_bytes(); // Party 2 serializes the ciphertext /// /// let ct1_bytes = ct2_bytes; // Party 2 sends the ciphertext to party 1 /// /// let ct1 = ml_kem_512::CipherText::try_from_bytes(ct1_bytes)?; // Party 1 deserializes the ciphertext /// let ssk1 = dk1.try_decaps(&ct1)?; // Party 1 runs decaps to generate the shared secret /// /// assert_eq!(ssk1, ssk2); // Each party has the same shared secret /// # Ok(())} /// ``` #[cfg(feature = "default-rng")] fn try_keygen() -> Result<(Self::EncapsKey, Self::DecapsKey), &'static str> { Self::try_keygen_with_rng(&mut OsRng) } /// Generates an encapsulation and decapsulation key key pair specific to this security parameter set.
/// This function utilizes a provided random number generator and is intended to operate in constant /// time outside of `rho` which crosses the trust boundary in the clear. /// # Errors /// Returns an error when the random number generator fails. /// # Examples /// ```rust /// # use std::error::Error; /// # fn main() -> Result<(), Box> { /// use rand_core::OsRng; /// use fips203::ml_kem_512; // Could also be ml_kem_768 or ml_kem_1024. /// use fips203::traits::{KeyGen, SerDes, Decaps, Encaps}; /// /// let (ek1, dk1) = ml_kem_512::KG::try_keygen_with_rng(&mut OsRng)?; // Party 1 generates both encaps and decaps keys /// let ek1_bytes = ek1.into_bytes(); // Party 1 serializes the encaps key /// /// let ek2_bytes = ek1_bytes; // Party 1 sends encaps bytes to party 2 /// /// let ek2 = ml_kem_512::EncapsKey::try_from_bytes(ek2_bytes)?; // Party 2 deserializes the encaps key /// let (ssk2, ct2) = ek2.try_encaps()?; // Party 2 generates shared secret and ciphertext /// let ct2_bytes = ct2.into_bytes(); // Party 2 serializes the ciphertext /// /// let ct1_bytes = ct2_bytes; // Party 2 sends the ciphertext to party 1 /// /// let ct1 = ml_kem_512::CipherText::try_from_bytes(ct1_bytes)?; // Party 1 deserializes the ciphertext /// let ssk1 = dk1.try_decaps(&ct1)?; // Party 1 runs decaps to generate the shared secret /// /// assert_eq!(ssk1, ssk2); // Each party has the same shared secret /// # Ok(())} /// ``` fn try_keygen_with_rng( rng: &mut impl CryptoRngCore, ) -> Result<(Self::EncapsKey, Self::DecapsKey), &'static str>; /// Performs validation between an encapsulation key and a decapsulation key (both in byte arrays), perhaps in the /// scenario where both have been serialized, stored to disk, and then retrieved. This function is not intended /// to operate in constant-time. /// # Examples /// ```rust /// # use std::error::Error; /// # fn main() -> Result<(), Box> { /// use rand_core::OsRng; /// use fips203::ml_kem_512; // Could also be ml_kem_768 or ml_kem_1024. /// use fips203::traits::{KeyGen, SerDes, Decaps, Encaps}; /// /// let (ek, dk) = ml_kem_512::KG::try_keygen_with_rng(&mut OsRng)?; /// let ek_bytes = ek.into_bytes(); // Serialize and perhaps store-then-restore encaps key /// let dk_bytes = dk.into_bytes(); // Serialize and perhaps store-then-restore decaps key /// assert!(ml_kem_512::KG::validate_keypair_vartime(&ek_bytes, &dk_bytes)); // Validate their correspondence /// /// # Ok(())} /// ``` fn validate_keypair_vartime(ek: &Self::EncapsByteArray, dk: &Self::DecapsByteArray) -> bool; } /// The `Encaps` trait uses the encapsulation key to generate the ciphertext and shared secret. pub trait Encaps { /// The common shared secret type SharedSecretKey; /// The ciphertext transmitted from the remote party to the originator. type CipherText; /// Generates a shared secret and ciphertext from an encapsulation key specific to this security parameter set.
/// This function utilizes the OS default random number generator and is intended to operate in constant /// time outside of `rho` which crosses the trust boundary in the clear. /// # Errors /// Returns an error when the random number generator fails or an internal error condition arises. /// # Examples /// ```rust /// # use std::error::Error; /// # fn main() -> Result<(), Box> { /// use rand_core::OsRng; /// use fips203::ml_kem_512; // Could also be ml_kem_768 or ml_kem_1024. /// use fips203::traits::{KeyGen, SerDes, Decaps, Encaps}; /// /// let (ek1, dk1) = ml_kem_512::KG::try_keygen_with_rng(&mut OsRng)?; // Party 1 generates both encaps and decaps keys /// let ek1_bytes = ek1.into_bytes(); // Party 1 serializes the encaps key /// /// let ek2_bytes = ek1_bytes; // Party 1 sends encaps bytes to party 2 /// /// let ek2 = ml_kem_512::EncapsKey::try_from_bytes(ek2_bytes)?; // Party 2 deserializes the encaps key /// let (ssk2, ct2) = ek2.try_encaps()?; // Party 2 generates shared secret and ciphertext /// let ct2_bytes = ct2.into_bytes(); // Party 2 serializes the ciphertext /// /// let ct1_bytes = ct2_bytes; // Party 2 sends the ciphertext to party 1 /// /// let ct1 = ml_kem_512::CipherText::try_from_bytes(ct1_bytes)?; // Party 1 deserializes the ciphertext /// let ssk1 = dk1.try_decaps(&ct1)?; // Party 1 runs decaps to generate the shared secret /// /// assert_eq!(ssk1, ssk2); // Each party has the same shared secret /// # Ok(())} /// ``` #[cfg(feature = "default-rng")] fn try_encaps(&self) -> Result<(Self::SharedSecretKey, Self::CipherText), &'static str> { self.try_encaps_with_rng(&mut OsRng) } /// Generates a shared secret and ciphertext from an encapsulation key specific to this security parameter set.
/// This function utilizes a provided random number generator and is intended to operate in constant /// time. /// # Errors /// Returns an error when the random number generator fails or an internal error condition arises. /// # Examples /// ```rust /// # use std::error::Error; /// # fn main() -> Result<(), Box> { /// use rand_core::OsRng; /// use fips203::ml_kem_512; // Could also be ml_kem_768 or ml_kem_1024. /// use fips203::traits::{KeyGen, SerDes, Decaps, Encaps}; /// /// let (ek1, dk1) = ml_kem_512::KG::try_keygen_with_rng(&mut OsRng)?; // Party 1 generates both encaps and decaps keys /// let ek1_bytes = ek1.into_bytes(); // Party 1 serializes the encaps key /// /// let ek2_bytes = ek1_bytes; // Party 1 sends encaps bytes to party 2 /// /// let ek2 = ml_kem_512::EncapsKey::try_from_bytes(ek2_bytes)?; // Party 2 deserializes the encaps key /// let (ssk2, ct2) = ek2.try_encaps_with_rng(&mut OsRng)?; // Party 2 generates shared secret and ciphertext /// let ct2_bytes = ct2.into_bytes(); // Party 2 serializes the ciphertext /// /// let ct1_bytes = ct2_bytes; // Party 2 sends the ciphertext to party 1 /// /// let ct1 = ml_kem_512::CipherText::try_from_bytes(ct1_bytes)?; // Party 1 deserializes the ciphertext /// let ssk1 = dk1.try_decaps(&ct1)?; // Party 1 runs decaps to generate the shared secret /// /// assert_eq!(ssk1, ssk2); // Each party has the same shared secret /// # Ok(())} /// ``` fn try_encaps_with_rng( &self, rng: &mut impl CryptoRngCore, ) -> Result<(Self::SharedSecretKey, Self::CipherText), &'static str>; } /// The `Decaps` trait uses the decapsulation key and ciphertext to generate the shared secret. pub trait Decaps { /// Ciphertext struct type CipherText; /// Shared secret struct type SharedSecretKey; /// Generates a shared secret from a decapsulation key and ciphertext specific to this security parameter set.
/// This function is intended to operate in constant-time. /// # Errors /// Returns an error when the random number generator fails or an internal error condition arises. /// # Examples /// ```rust /// # use std::error::Error; /// # fn main() -> Result<(), Box> { /// use rand_core::OsRng; /// use fips203::ml_kem_512; // Could also be ml_kem_768 or ml_kem_1024. /// use fips203::traits::{KeyGen, SerDes, Decaps, Encaps}; /// /// let (ek1, dk1) = ml_kem_512::KG::try_keygen_with_rng(&mut OsRng)?; // Party 1 generates both encaps and decaps keys /// let ek1_bytes = ek1.into_bytes(); // Party 1 serializes the encaps key /// /// let ek2_bytes = ek1_bytes; // Party 1 sends encaps bytes to party 2 /// /// let ek2 = ml_kem_512::EncapsKey::try_from_bytes(ek2_bytes)?; // Party 2 deserializes the encaps key /// let (ssk2, ct2) = ek2.try_encaps_with_rng(&mut OsRng)?; // Party 2 generates shared secret and ciphertext /// let ct2_bytes = ct2.into_bytes(); // Party 2 serializes the ciphertext /// /// let ct1_bytes = ct2_bytes; // Party 2 sends the ciphertext to party 1 /// /// let ct1 = ml_kem_512::CipherText::try_from_bytes(ct1_bytes)?; // Party 1 deserializes the ciphertext /// let ssk1 = dk1.try_decaps(&ct1)?; // Party 1 runs decaps to generate the shared secret /// /// assert_eq!(ssk1, ssk2); // Each party has the same shared secret /// # Ok(())} /// ``` fn try_decaps(&self, ct: &Self::CipherText) -> Result; } /// Serialization and Deserialization of structs pub trait SerDes { /// Correctly sized byte array for struct type ByteArray; /// Produces a byte array of fixed-size specific to the struct being serialized. /// # Examples /// ```rust /// # use std::error::Error; /// # fn main() -> Result<(), Box> { /// use rand_core::OsRng; /// use fips203::ml_kem_512; // Could also be ml_kem_768 or ml_kem_1024. /// use fips203::traits::{KeyGen, SerDes, Decaps, Encaps}; /// /// let (ek1, dk1) = ml_kem_512::KG::try_keygen_with_rng(&mut OsRng)?; // Party 1 generates both encaps and decaps keys /// let ek1_bytes = ek1.into_bytes(); // Party 1 serializes the encaps key /// /// let ek2_bytes = ek1_bytes; // Party 1 sends encaps bytes to party 2 /// /// let ek2 = ml_kem_512::EncapsKey::try_from_bytes(ek2_bytes)?; // Party 2 deserializes the encaps key /// let (ssk2, ct2) = ek2.try_encaps_with_rng(&mut OsRng)?; // Party 2 generates shared secret and ciphertext /// let ct2_bytes = ct2.into_bytes(); // Party 2 serializes the ciphertext /// /// let ct1_bytes = ct2_bytes; // Party 2 sends the ciphertext to party 1 /// /// let ct1 = ml_kem_512::CipherText::try_from_bytes(ct1_bytes)?; // Party 1 deserializes the ciphertext /// let ssk1 = dk1.try_decaps(&ct1)?; // Party 1 runs decaps to generate the shared secret /// /// assert_eq!(ssk1, ssk2); // Each party has the same shared secret /// # Ok(())} /// ``` fn into_bytes(self) -> Self::ByteArray; /// Consumes a byte array of fixed-size specific to the struct being deserialized; performs validation /// # Errors /// Returns an error on malformed input. /// # Examples /// ```rust /// # use std::error::Error; /// # fn main() -> Result<(), Box> { /// use rand_core::OsRng; /// use fips203::ml_kem_512; // Could also be ml_kem_768 or ml_kem_1024. /// use fips203::traits::{KeyGen, SerDes, Decaps, Encaps}; /// /// let (ek1, dk1) = ml_kem_512::KG::try_keygen_with_rng(&mut OsRng)?; // Party 1 generates both encaps and decaps keys /// let ek1_bytes = ek1.into_bytes(); // Party 1 serializes the encaps key /// /// let ek2_bytes = ek1_bytes; // Party 1 sends encaps bytes to party 2 /// /// let ek2 = ml_kem_512::EncapsKey::try_from_bytes(ek2_bytes)?; // Party 2 deserializes the encaps key /// let (ssk2, ct2) = ek2.try_encaps_with_rng(&mut OsRng)?; // Party 2 generates shared secret and ciphertext /// let ct2_bytes = ct2.into_bytes(); // Party 2 serializes the ciphertext /// /// let ct1_bytes = ct2_bytes; // Party 2 sends the ciphertext to party 1 /// /// let ct1 = ml_kem_512::CipherText::try_from_bytes(ct1_bytes)?; // Party 1 deserializes the ciphertext /// let ssk1 = dk1.try_decaps(&ct1)?; // Party 1 runs decaps to generate the shared secret /// /// assert_eq!(ssk1, ssk2); // Each party has the same shared secret /// # Ok(())} /// ``` fn try_from_bytes(ba: Self::ByteArray) -> Result where Self: Sized; } fips203-0.2.1/src/types.rs000064400000000000000000000053261046102023000133210ustar 00000000000000use crate::Q; use zeroize::{Zeroize, ZeroizeOnDrop}; /// Correctly sized encapsulation key specific to the target security parameter set. #[derive(Clone, Zeroize, ZeroizeOnDrop)] #[repr(align(8))] pub struct EncapsKey(pub(crate) [u8; EK_LEN]); /// Correctly sized decapsulation key specific to the target security parameter set. #[derive(Clone, Zeroize, ZeroizeOnDrop)] #[repr(align(8))] pub struct DecapsKey(pub(crate) [u8; DK_LEN]); /// Correctly sized ciphertext specific to the target security parameter set. #[derive(Clone, Zeroize, ZeroizeOnDrop)] #[repr(align(8))] pub struct CipherText(pub(crate) [u8; CT_LEN]); // While Z is simple and correct, the performance is somewhat suboptimal. // This will be addressed (particularly in matrix operations etc) over // the medium-term - potentially using 256-entry rows. /// Stored as u16 for space, but arithmetic as u32 for perf #[derive(Clone, Copy, Default)] pub(crate) struct Z(u16); #[allow(clippy::inline_always)] impl Z { pub(crate) fn get_u16(self) -> u16 { self.0 } pub(crate) fn get_u32(self) -> u32 { u32::from(self.0) } pub(crate) fn set_u16(&mut self, a: u16) { self.0 = a } #[inline(always)] #[allow(clippy::cast_possible_truncation)] // rem as u16; for perf pub(crate) fn add(self, other: Self) -> Self { debug_assert!(self.0 < Q); debug_assert!(other.0 < Q); let res = u32::from(self.0) + u32::from(other.0); // + debug=strict, release=wrapping let res = res.wrapping_sub(u32::from(Q)); let res = res.wrapping_add((res >> 16) & (u32::from(Q))); debug_assert!(res < u32::from(Q)); Self(res as u16) } #[inline(always)] #[allow(clippy::cast_possible_truncation)] // res as u16; for perf pub(crate) fn sub(self, other: Self) -> Self { debug_assert!(self.0 < Q); debug_assert!(other.0 < Q); let res = u32::from(self.0).wrapping_sub(u32::from(other.0)); let res = res.wrapping_add((res >> 16) & (u32::from(Q))); debug_assert!(res < u32::from(Q)); Self(res as u16) } #[inline(always)] #[allow(clippy::items_after_statements, clippy::cast_possible_truncation)] // rem as u16; for perf pub(crate) fn mul(self, other: Self) -> Self { debug_assert!(self.0 < Q); debug_assert!(other.0 < Q); const M: u64 = ((1u64 << 36) + Q as u64 - 1) / Q as u64; let prod = u32::from(self.0) * u32::from(other.0); // * debug=strict, release=wrapping let quot = ((u64::from(prod) * M) >> 36) as u32; let rem = prod - quot * u32::from(Q); // further reduction is not needed debug_assert!(rem < u32::from(Q)); Self(rem as u16) } } fips203-0.2.1/tests/cctv_vectors/ML-KEM/README.md000064400000000000000000000171041046102023000170640ustar 00000000000000# ML-KEM Intermediate values https://c2sp.org/CCTV/ML-KEM This directory collects resources for testing (and developing) ML-KEM implementations, as specified in FIPS 203. In particular, it provides: * Intermediate values for testing and debugging each intermediate step and partial algorithm. * Negative test vectors for invalid encapsulation keys. * "Unlucky" vectors that require an unusually large number of XOF reads. * Vectors that fail if `strcmp()` is used in ML-KEM.Decaps. * Accumulated vectors (derived from the reference pq-crystals implementation) for testing randomly reachable edge cases without checking in large amounts of data, including an extended run of one million tests. * References to other test vectors. All test vectors are made available under the terms of the [CC0 1.0](http://creativecommons.org/publicdomain/zero/1.0). Implementers might also be interested in ["Enough Polynomials and Linear Algebra to Implement Kyber"](https://words.filippo.io/kyber-math/). ### Changes from the FIPS 203 draft Like the [official intermediate values][NIST vectors] from October 2023, all the vectors in this directory implement the following two changes: 1. The order of the input i and j to the XOF at step 6 in Algorithm 12 (K-PKE.KeyGen) is switched. 2. The order of the input i and j to the XOF at step 6 in Algorithm 13 (K-PKE.Encrypt) is switched. This reverts [an unintentional change][pqc-forum discussion] that will probably be reverted in the final document and makes K-PKE consistent with Kyber round 3. [NIST vectors]: https://csrc.nist.gov/Projects/post-quantum-cryptography/post-quantum-cryptography-standardization/example-files [pqc-forum discussion]: https://groups.google.com/a/list.nist.gov/g/pqc-forum/c/s-C-zIAeKfE/m/eZJmXYsSAQAJ ## Intermediate values The files in the `intermediate/` folder provide vectors for developing, debugging, and testing ML-KEM step-by-step. Each file lists every intermediate value of the ML-KEM.KeyGen, K-PKE.KeyGen, ML-KEM.Encaps, K-PKE.Encrypt, ML-KEM.Decaps, and K-PKE.Decrypt algorithms, all executed on the same set of keys and messages. Byte strings are encoded in hex. Polynomials, NTT representatives, vectors, and matrixes are encoded with ByteEncode12 and then in hex. Some polynomials are also presented as an array of decimal coefficients to aid in the implementation of ByteEncode, NTT, and Compress. Where values appear multiple times across algorithms, they are not repeated in the test files. uᵈ and vᵈ are the u and v values from K-PKE.Decrypt, after they went through a Compress/Decompress cycle. (Props to the spec for maintaining a consistent lexical scope across algorithms! The one exception is that r is reused for the 32-byte K-PKE.Encrypt input and for the vector of polynomials sampled from it. The two are easily distinguished.) ## Bad encapsulation keys Section 6.2 of FIPS 203 ipd (ML-KEM Encapsulation) requires input validation on the encapsulation key, checking that all encoded polynomial coefficients are reduced modulo the field prime (the "*Modulus check*"). The files in the `modulus/` folder provide invalid ML-KEM.Encaps inputs, hex-encoded, one per line. Every value in the range q to 2¹²-1 and every position in the key is tested individually. The vectors share most of the coefficients so that they compress from 1–3 MiB down to 12–28 KiB. ## Unlucky NTT sampling vector The SampleNTT algorithm reads a variable number of bytes from an Extendable Output Function to perform rejection sampling. The files in the `unlucky/` folder provide test vectors that cause many more rejections than usual. In particular, these vectors require reading more than 575 bytes from the SHAKE-128 XOF in SampleNTT, which would ordinarily happen [with probability 2⁻³⁸](https://www.wolframalpha.com/input?i=binomcdf%28384%2C+3329%2F4096%2C+255%29). Note that these vectors can be run through a regular deterministic ML-KEM testing API (i.e. one that injects the `d`, `z`, `m` random values) since they were bruteforced at the level of the `d` value. If for some reason an implementation needs to draw a fixed amount of bytes from the XOF, at least 704 bytes are necessary for [a negligible probability (~ 2⁻¹²⁸)](https://www.wolframalpha.com/input?i=binomcdf%28469%2C+3329%2F4096%2C+255%29) of failure. ## `strcmp` vectors In ML-KEM.Decaps the ciphertext is compared with the output of K-PKE.Encrypt for implicit rejection. If an implementation were to use `strcmp()` for that comparison it would fail to reject some ciphertexts if a zero byte terminates the comparison early. The files in the `strcmp/` folder provide test vectors that exercise this edge case. The chance of it occurring randomly is 2⁻¹⁶, and it is not covered by the pq-crystals vectors. ## Accumulated pq-crystals vectors The `ref/test/test_vectors.c` program in the *standard* branch of github.com/pq-crystals/kyber produces 10 000 randomly generated tests. Thanks to the limited range of fundamental integer types (at most 0–4096), this is sufficient to hit a lot of edge cases that don't need to be deliberately targeted with specific test vectors. The output of the three `test_vectors.c` programs amounts to 300MB. Instead of checking in such a large amount of data, or running a binary as part of testing, implementations can generate the test inputs from the deterministic RNG, and check that the test outputs hash to the expected value. The input format, output format, and output hash are provided below. The deterministic RNG is a single SHAKE-128 instance with an empty input. (The RNG stream starts with `7f9c2ba4e88f827d616045507605853e`.) For each test, the following values are drawn from the RNG in order: * `d` for K-PKE.KeyGen * `z` for ML-KEM.KeyGen * `m` for ML-KEM.Encaps * `ct` as an invalid ciphertext input to ML-KEM.Decaps Then, the following values are written to a running SHAKE-128 instance in order: * `ek` from ML-KEM.KeyGen * `dk` from ML-KEM.KeyGen * `ct` from ML-KEM.Encaps * `k` from ML-KEM.Encaps (which should be checked to match the output of ML-KEM.Decaps when provided with the correct `ct`) * `k` from ML-KEM.Decaps when provided with the random `ct` The resulting hashes for 10 000 consecutive tests are: * ML-KEM-512: `845913ea5a308b803c764a9ed8e9d814ca1fd9c82ba43c7b1e64b79c7a6ec8e4` * ML-KEM-768: `f7db260e1137a742e05fe0db9525012812b004d29040a5b606aad3d134b548d3` * ML-KEM-1024: `47ac888fe61544efc0518f46094b4f8a600965fc89822acb06dc7169d24f3543` The resulting hashes for 1 000 000 consecutive tests are: * ML-KEM-512: `578eeaa1156848cbf7a15bafef963b4ccabe3308ddfb7dbdd20ad965f634e81d` * ML-KEM-768: `70090cc5842aad0ec43d5042c783fae9bc320c047b5dafcb6e134821db02384d` * ML-KEM-1024: `7ccc6d803739d3db3c5ce39c7130f459db32a199c6605e3be210e5a89d4c4b95` ## Other Known Answer Tests The following vectors also target FIPS 203 ipd with the  fix described above. * [NIST's Intermediate Values](https://csrc.nist.gov/Projects/post-quantum-cryptography/post-quantum-cryptography-standardization/example-files) * Random values (such as d, z, and m) are equal. This is not spec compliant. * [pq-crystals](https://github.com/pq-crystals/kyber), *standard* branch * `ref/test/test_vectors.c` generates 10 000 vectors randomly. * Accumulated vectors are available above. * [post-quantum-cryptography/KAT](https://github.com/post-quantum-cryptography/KAT/tree/main/MLKEM) * Each file contains 100 randomly generated vectors. The s2n-tls project includes [vectors](https://github.com/aws/s2n-tls/tree/a6517c5fe97b1aa1898f2233498613dd53735bd8/tests/unit/kats) for Kyber round 3 as well as some of the hybrid KEMs, including those used in the TLS draft. fips203-0.2.1/tests/cctv_vectors/ML-KEM/intermediate/ML-KEM-1024.txt000064400000000000000000002664041046102023000223370ustar 00000000000000d = 2a62c39ef4fc499f2d132716f480bb7521a49558ae84ee80d9352e66daf1e3a8 ρ = db09edbe4f1a61a62a23531cf707976a861efef13e8347210d77f3d080e9ba89 σ = 567045c6a7bb78ffdb2c07dc8e18a68f242af76a72bf83c3b2c71bdd49a2974c A[0, 0] = {1221, 310, 2096, 2198, 2290, 1899, 984, 2261, 2224, 132, 1310, 3010, 626, 2170, 3038, 836, 2997, 1484, 2674, 2419, 167, 53, 1294, 484, 1820, 678, 516, 2194, 1984, 638, 1617, 2507, 244, 1692, 1103, 1238, 3172, 1224, 1328, 1001, 1431, 1347, 2870, 165, 211, 2952, 203, 196, 2262, 2297, 2150, 2026, 1094, 1608, 1666, 637, 32, 400, 2399, 2773, 1852, 1148, 403, 1502, 3174, 748, 1627, 1369, 1288, 587, 545, 2876, 1078, 695, 1306, 2856, 3263, 1791, 679, 3261, 2418, 3100, 780, 2237, 1530, 1130, 1824, 93, 2046, 1370, 2066, 1171, 1083, 2623, 2966, 1357, 862, 2079, 3157, 306, 2782, 2476, 1290, 2828, 2227, 1209, 574, 1731, 1845, 11, 1236, 2741, 1942, 529, 1537, 2310, 1580, 721, 41, 218, 2644, 2887, 746, 1377, 3212, 2330, 270, 1674, 1723, 1011, 2229, 1805, 50, 1262, 789, 2105, 1651, 745, 2043, 2406, 166, 3001, 2603, 2513, 180, 1193, 1254, 351, 1253, 415, 2768, 2052, 2032, 2846, 1079, 2134, 3197, 151, 2779, 2863, 2861, 2996, 366, 1254, 2563, 2071, 1839, 406, 1297, 169, 2349, 3308, 1181, 3019, 1762, 726, 195, 1612, 163, 672, 2583, 2486, 2285, 124, 1186, 1919, 582, 2462, 1241, 1961, 1711, 3232, 1851, 2143, 1245, 1524, 3184, 244, 2033, 543, 41, 1808, 1450, 330, 2609, 3127, 1819, 2811, 2181, 2648, 481, 2542, 3215, 1804, 647, 2644, 744, 153, 1057, 2641, 2416, 476, 3314, 109, 2411, 1985, 1311, 2902, 1356, 1392, 2993, 1817, 1747, 1944, 2347, 2438, 1013, 3167, 2474, 2098, 1752, 621, 1636, 2106, 337, 490, 1195, 3007, 1021, 1139, 2852, 1822, 208, 971, 525, 643} = c56413306889f2b876d8538db048081e25bc72a287de4b34b5cb5c723a97a750030e451e1c672a042289c0e72751b69cf4c0694f644d648c4c30953e973554365b0ad380b8cb400cd6988f66a87e46846482d6272000195f59ad3cc74793e15d66cc2e5b965508b52421c2b336742b1a85b2bffc6fa7d2cb72c9c10cd38bfaa54620d705fea7551238493bf4a396db545ef381552c13deca9a0ac5b0b3984b3e326c35b700d454ab9617210166902c162d29a00d547ab4ea12568cac910ea168bb363fb5d87032e04e15938373962efb6796a690bb2b1a9db4904ae6f415e5f419d04a80f0e7b13764857d7c09dbfab22d4bbb6e614e037a812f671911950a2dc9ce9db4bce2662dc3c064a3002a176a9bedc807a2f47746e299d9947aaf06ca3bf785dd445f704c0ff1f721290071aaa514317ac31bb7af8588a5e1e19e8fcc708742a5e892092114a570c91df2dc066b197c1f65b54c0557b19b71d386792b6998f5f3c5aa2983d8d62664a68351a11eabf4bbfd334724eb71d0b03c0d3228 A = c56413306889f2b876d8538db048081e25bc72a287de4b34b5cb5c723a97a750030e451e1c672a042289c0e72751b69cf4c0694f644d648c4c30953e973554365b0ad380b8cb400cd6988f66a87e46846482d6272000195f59ad3cc74793e15d66cc2e5b965508b52421c2b336742b1a85b2bffc6fa7d2cb72c9c10cd38bfaa54620d705fea7551238493bf4a396db545ef381552c13deca9a0ac5b0b3984b3e326c35b700d454ab9617210166902c162d29a00d547ab4ea12568cac910ea168bb363fb5d87032e04e15938373962efb6796a690bb2b1a9db4904ae6f415e5f419d04a80f0e7b13764857d7c09dbfab22d4bbb6e614e037a812f671911950a2dc9ce9db4bce2662dc3c064a3002a176a9bedc807a2f47746e299d9947aaf06ca3bf785dd445f704c0ff1f721290071aaa514317ac31bb7af8588a5e1e19e8fcc708742a5e892092114a570c91df2dc066b197c1f65b54c0557b19b71d386792b6998f5f3c5aa2983d8d62664a68351a11eabf4bbfd334724eb71d0b03c0d32285f14b352eaaf19762abb5c6edcc0a590e148e2359ac606af67632dccd3bcd3462d2532ccba60670ad2485f7a415876344573be94d70e444949d4d3ca760a8e77283626022c4a5579419881224a82bb545cefaa877528cedbe20ac9c9385c2461165c31d4b24b57b2556000205ff4b54f7c5a53d818bdf1cb3eb88120c42c0e3271285592573628e89495750a7e1c371c8cc69490609b864ba66823388e99b7484100fbe28ac5da228bd7c6e482bafac77b902c450720197151678d089bd161ace5c3199234b0a8180ad6445ea1ca1aae932409f66ea1dcbad17a8c4a372ac4eaac9b0858aa2b629147b6c22717a2a3b5f87b7be2dc9bd1a64f0cf2b29e06b0c30b3daaa4cd74d4ce25db265db2a6a6e4c093571b492372130b448e67309a2b7b8e457f6b2099d70956ff378c5f6787bb5b5405b30033a6a519134d64f3cbd0633ba266858cecc7a98570e8c1babd6a478c3528c7c47ec5997c798777165041c5657845b954ab6cce74d9782aa894f56cb430d334c50cb27dd32865a0937d6844d770761e784c1cd78fae35a6c3d415bdb2888fdaa5a65a2f17c625c00b8e78771fa0b12fff731999f647f3db547f565431395ff9d69f9d325e45b246eab84ff2fc4b9daa2ff110120a91c579b8024d18573c2a7203e15b05f58bda674f9b378c6c75c1a7903d06b94152b45ac9b04c55bb18c30335f7eb819141110c0720db331d07c69e669b4b6e0b4a09785d404b44dcf02f399124f00132ac939375c9394035951d4c1ed17a06ec546ad3fb0dcf6bb447982cffa55b4b220dc1fc94687b5ee45cb8e57b93c5b506e902a49b7ac6d2521ed9198b2b22ccbaa573b41b86bf758f31c7ce8a3090c7424cab4c1fb305cb758ca95b7984e492b2c20c5ec712563fd23d4162125f1103d3002ee43541965b8cf277bd2176a437b52464b801c2e4c803725834e9a9f7d635bcf06972ca0a828c02ea8957863580e5a93614293233f107b919294c84388e411418b3a5b6ca3f87e89203ac246005554db475d8d12fda4079291a4182d24a02465dc2fa1f65085fdc14ad2c16180d921721890121b83b97478de3e7935eb65f4777764f85b28e69b9cf2b38a1077a4058c84db8a4dcb6a07c29ac74fc7e6fb88b34c2c43dd282ac4b505bdabcf1910e8aa8933689a5e9583b01d151e0b2605c50859339525b630aab2c63ead3bb73a44027a2522bea6852d35ebc12acfd0a53b0026b7e07bb9d2a34a6a846ea60385cb88e85ebaae67cbe5a501b245709cb97398fda5f976232f8f71ee24a59d31c5a35a466e4da3ed1b9c76cf2c263754c8d96b7d8c6749f769fc8488949732016e29479ba2d07607450e4b7e2cb596687a9d01cb3c5130bdb8859c23231d8146163717721033b1e737cbb2070dd28a4573552e917689f4427d733717af46d3281a42899a438116ae08816cd5c2c969498ca9435da385d007c23a9d219e4689c01b647fd7883defa9e356807fd928a4a880d907442aee5cd944cc4c022478ac4a7aee8ac96b4a84a851b67bbb7fc5831c866178d2a0dc33196bd068618c7689ac3351e0242f16574a5472b56591572b432b46506ae99adc5da8b5273606c0a17da59443846cf96a904a95683ba10506b565be16143d468560bb908db63ce4683afc7556acfac9b48314e82914f5700776b6b9fc6745364e17d16611f94d76584422fd214c83ae8b481090dcab90d43a9a8555656a071cc15152f53793533cbb094044367f32257ab755d0452b150bf0a72cd8a89a414d7a1d0c281692426b6a0aa2605518ec26567469f54899d251bc3aaf3ccd0ca737db247b299be5fc07340183c3db1c9a83140cada9bb03c7705481788b2c91a37130b6b0cd5d5bb2a0a2fcbc88274426f883975b293178c03805b4920f3f4c4ad741a2d9c2c46914a97a66f9e62a46f58c43889b333392f715b0d81787b915692cc176977a5c04cfacc8070cdbfa20c5c020200b1a3030a55fc057ec39c5fe7d3a80ce640f63ccd00d2918b635dc906725db309dcbc644a1031e93c9438cb0b2a432f63c48b8f4a44d55888c3946f3dc61e6abc42e9ec9eb4c51bce055c437951df347bc216ae0fea2dc9a3334a514b4e4629d951801fc448f2d7ae28fc58667505213a62d154b3648636050049305074495001eb38219c89921d7b45ce9920a14c957f2b7e79ab7803e70f6b5191c44c642736b8d9408459884dc026cd73b96e43d598d9c1b8d18cac0cecb0b2cc9d94b3413f8269eb5072565ac86bb639f384b8b6b21401c416f0b11cc1e1612220244fd04f93fc44196b8d2aa07c01c1543864c9b40a933881b5e1a3cc566b848c176968b643c4803831016d6b6cb09b428a420c920ff82890151f3d87bada51a97d0875197a29aecc1c58896f46f405b492a91ad29fe77b09006a0bb5f6c101c46fc3036a89349f00b737475a3a25d28158456ee357528c9074126114c60aa7c6871bc174b95b1759d392b40e251b8dd0b042b82f5180460941273053916a2829a9b54ec57c6fb539c8b330b68fc58fda681a32a02e2dc41353b139db7663bc816262a07d95399b2ce53a5d55ae30dc436c789f19561ffaba899699cbcf5abdf9f948c45b7d369844ae7b5d9503579e4a1cd1fa21128b5b1d9906afdcb147552b459aaa1d85a23bdc09bfe4bb5c854406c255860a2ed3e7af4bf229edb7c8fbfa0f4b6054f449ae93acbd0a3593dfa318d3d840a1b01464f122fa7b46518682528bc381d55643891a970561026a34170b9d17352e2500442707922c81422e0486cb618309db60f9d25659258207ca0d4b6b46a985058fd48caba5650035ce41e2cb20a16e22788f70f7b460d9a05ce81d13b3258406830138b3eb01b2db9a6b9ea2bec2224dca4012b9b858dfd8002d366dbe852b1ea5461a509ee27919cb4574f62707c58160d6c255726b64bf66c4c1a371654556de16872dd66864849d5fe721bd3c04992024a4314961231e7871c53d40343070037529497465c7e9002b06077b15436cebdba1e0db742f2b040438ba0a08c96eabcd8352c04bfc536b80a4d5fc5393d44cac37c3454005b444577f206a253498098c1305c62ab38b3cb9a3c23f5aa769f5cb4a0acaaec745f07432ef90252572c61e10410b63641444073442466616303ef2c563f81c43632983428de9bcb92278066390c1caba63bb1661791341ea66b6add3343f16aef81131f35975e25b50c0e16b2b330962c218b3722201143eee74336a260180e5a5745465f483a6deb88276a183d16bbcec2c19c56771691804aa49250fac93e8227e8f9404ad57940d680666c9a3a2b03918c70ca83c2e14836fe8bc0ebdf1c1edabafecaa5559a22988acc0c914b2cd62bcf3b87e8f407cd4e10ee9a88be5e48068d508d04b8fbdb584fe14c4cfa05709a8298398ba4b527dbce5776c131572cc8c13b882ef2562e711a65fca022703206c5c7c3db114ce29a2b7a98bc81471c27c2581da29f738005df265c632ca2c1b5d96503aa90080c898a560467dde585c778481ef096a804396474a067ef33a37dc2af39c9984dbc8dbb36d027202bb272e539963af74c5e35bc69a727843d546269cadd55c15c1667a4f645523c44c29610bbbec135ada176b257e8a030c57925a0764339c68014acc77c3e0b108fb0034763ca866b3a8e3acb70540420b9ced65c8a9d97614648ce71838cdc08931a91804e97268a5b42675c2f82a2d800998f25a2940fcc02126188559879661b6c3a3329c1b3c86e62e0f9264830b98b4c245c077662cd51f0956bc2bc96a13352171d00a3fe74f1ab3b610a61a7948027988811aca8d299a7bf92c96ee11a201b29a04f1116639719a071bab4caed5a36bb18a155968c924fb64f6439ce993a88fc1a96be3cc2394755d675a8237ad7116460ccbc67508174d5970cc46c33ac4596b16a1bb28bc7fb11cb3a8b9fee6b03190cd5facb08a59b0bad85d320c4be707190d6306004ac9bfd57262d0bf50f7cff77b3a79f53f45dc03bfb7bdd6247d43cc23b8c2b7edd56d89e8568c67cc1d10725a56535e1b56c3215a1c85309bb4247b370c5d0c8f02d11a54f56115636157113b0548c2b224cc29ec408aba84e45ba815007eec1901a65c21927541fd6256d145cf7f0882b37b411d12a19bda49072bcd60f987258622bd3126558972f5332cd201a3d94531b062611df597f27a2c9e403f0ca2ac79bb1c37e013f5db5246766cb8d0a6b4139e2dfcb864db82fa96239c132ef01c0ec2d0ce3474a33c1b67ff1794df653c2cac2333b0257dc15f403b7b137cabc25c110b3999bc9a455e148c0d3946295a35ed08c40b3c9098d9969da9a702a1a34cb03944713ba19ccd98f92b05d8249ea776a9e16753b95b04eb4eda568e8edb91f8a119f040867e5594210c87fa5c204b626a1d4554ffe57adcf9131b0108a41b8411f63198395a11f3367f144df80c99554c32b8da405d1934b4d74b74e53279029b9223ae1cd141ac23aff28067f717a026998393eaa1bf810c996869f4f05a4134b0d129032ccb593fa0cc83556a377971e1ab4159c972a1e697486bc8ba70be6b67600d3110c36108db7cc840221f034952adf0beca487c8962a5a3d20f6c80c4a96125fb922baae578faaa72f3c4aeaf7212b18b5ba4da6504a45ca73266dfdc13e103845b8c39c0d48579e27081bc9bbe5aaeac84a943c656e9c19b050b061531097f80597ca8a73eea54c5acae8f85a34bba4221f4c78b2a9690617d90e3b21e03be91e0921364b459378607fb8e756b13f4b1cfbdc1762907848c847fc4ba72b9d80fa8590a5425742e6b56585277ab3b17c271b4747b85ff41888cca88042300f46555a261c3c7708f2f60a89692ce8c8717c6a89ede4777a281bffde0b5d33a2d1fb8cbd32c26600903a2b5a0d621af5adb8fa3f86334e4c5ca1ba2591c024938ac9d083732dc3a1726377cb9b88d5b200f6ba49f2414e754a11c105421919ca42cb59d483bc634993f9522573b9613e37ccde12edd3c885a8cbda8b56aa515c3a5a04cd91b0db2b77e6e43b5223b0391fb1c3b7055d3a58a9c46abae9a893f4368d0c77d8c8c7cf88b47905b9a5b979e10d19a65f01088ea3917238dd89296bab8430a9c5936902ec8c7caab65334b8c0f982108f8814b29b90d772a741dd48772d39eb551803c0cbd723395de3280c12466e58620adcb2269aa9c0474b04b143a9d0bc1c2c813fc32577a0137beec5f71665a03b2388cc09b8a41b8f6c9b9dc03510f903e6e5537596b8de7578fc9b63b3bb1c55572c737e7716cf50ad4663b55e5b9ba4067301254cedc0b77cacc90d73e225369709820549b952c3b7302966c5d30a632534c0ceb8968d69e0bcc0c3861cb0304337f1263371ab7abf7bc8d9194e67c1c1ff81e7fb622a0258048e89d5026c60299b8e0e38c91601f48da72e73684ebf4265b73541fd2869d941673bb4e2bb4afe96a4fbe4c6a2cb53bcf30b628c891d7d563cf9072e22430197c5947d81851190129762f5dec5ecf3c23e486417a704ba35a6bd29579cb54ca76390d7f035ac6225a2edb9b1ecc7c3c189c6b38c875d031680c40887595ab83c65cda6df64b76e3958cfec03c86926d744c723221267ae97304b309c1903e6c6294159373e73196295025d5aa4105037f93136b2b797fa19594cd995d3e29852804975124c043c48c2fe369f167a7b66b2b52591101ca06828108d48c0054c6cda3c5ab8b750f1b3b674161230925628b73530f0ba3f82b41b997bba942567afcab8c8889bcd48f66915b186c21910752cc6a2e944ba00c59771aa37e72fb812787886b2802dff40867982527a1836e90485c2772d1a44cc854cefab27db9da9ccee173a4f1c2b1e7b6df2424d25184ad1c9baca2489a628cfa243a9f73a8f885be0a7a5b83c7a5b499c725e79bdf8aa1a883b51efb42164a4e9078284542458881ba712867ca7172aa8b6a5085a967014df8c16efa03290dfb31db664f856504d52845ad4a011503c517f2714fe764bb6c72672bc5b9694fcc29a6aa2432ded26757b6a310b69755e2b348351c435857a86a2d40e9b0c3044cee11662bd30a4736ca99f6b54b544bad3a9bce499370e42953a68225aac71de23dbe5265028c05e89a0c9a7063ac6404dd8b668f62aa0d0881879c6b9bd7c968d498636991d5ab7ab5d9b6d82640c686b6bf00b434b5cad5384451f46615b3b9cd5ba872ec7f500b93ff321290c3a4e7d52e104188b6e24f1e090a479ca8fe36505f121b221925de060f9a5650a8246d513bb6825bc267066303a93b64869552886dfe6b455921489d916ac8d9870512abfc55ab346236bbd98625c79c6b3aab2b125ea1a4abe2ac8745b214238702e4db69fb4c3ac24267ecbaaa8d0a0d98e2b4a89aa24219ce0f04cc7f657bbcfb1a7db707fc129b009c324be18830d87dd50cbde3888f0cf4a7f8e5bdb7aa9fcaf9a717fb99e245bfe7b79aa7ab1a6242051342cc599b0b3bf2480bd1bc1d3b17923bc37f3601bf39483ea36bdd98366bcc5d60252a8eb219ec2acb42d1229ad38203329eeee6c08b448793163ac9ecabef22174c4bac344b631a5aac5d51bda04a1b746ca4c6e32ebdb81f834b349ae8c50f783257005ab4da78f4c574a3b7ce82d11cce69383f831bcaf118cf68a1ba882b92f25afcc728a4aac33f43089d4948c57662a4a52de4001123532e888652c67b316d29b1892222f1d61c83ba486e40cbeaf58d23b20f86d913dca14f54685d9e7ba921f0b5db7c8115606934e49b45760ede306c4a04750d696afb46ba973aa1fbc8a95822c6250b65b90431fca22a24421d5f3161b9ba16ab34a490ba539d367fb6853afae40c30ac026733069e6706263542501c8d6f01b7321b7d8516a0cd39338e060753b47feacb8c1826a8eada2e4bc7ad7e48b6b4f0580217a092f8017fa8655ac07964984b96b74437e68c144510754a5c4803a46a056cf7799340e20b36c0066b5128d7980f7c0c6806225e995bbb6b08a788055a287161b48469b3517d807197196263f802a21715385886c056960981403ebd61c13091b0828b1a19d377241a782c83408e9c38076a71b70262fa92ce1a8247cda79feee8ca5c692ff28085965849f060138ac678e7f20be52bc0ab43b9310a9d118150ef78845941ced1dbaf167818d52831884b3248830bf4da64c5aa010bc38135d77309c33d98c736bc804b95f83dca9b1f74741c8c6587893442b40474dd283663a2c3549c4749044df7897a987b5444a6b314ba7b4dd44783720b6f9112ec82b898664d67614c0714acea620d2143bd9fb71a62ab0395b3573de70fce8271079100f0d63d82297319098ee7172c4dd54ac2698681ab29f8e73c39e1014d936c2fdbbf603728011808800552510a995002052072679e352f756a18a3ea1d642a3d49bac57784ae3ec13e28d98c3cfb59cf44b3f1b3477f4097aba8939478828dd729c810b89149cd1ea063aaa4b94fda368ef7489d140383c7781e385118039f169079929aa7ff2c25ff8a4e7a3aa4f0984cd5ab1dbbb52b09d256dbf37a00f000be329ee0742ff4faa00e91b7f35575e5b6444c7599a0b84627603c7fe15e4a403ada302eb0c1b6c377801e108d15ab30f6a731f5dbca7db22e66c288b2c6ae8a8681e0a738c27a8bf2e18d1c39c404c5b7c42a4cad87a76930259df13463e51c21b18026c11b18382a6216136a609510a37707717dbcd69ad3e5148b35552869858b197cd27cb3669542c2545f05c68e6a226549f37706ec22211b382d5c8d47fb78866222f7d8553fd4514e7b1c3ce180108094651a0391e1829977ce59b41eb42b82a3a9aeb6760cd3a38ed134123b6c15c4678847128558ec82cde831d6d78f1a20a83f301cfb93ca1cb41345f27991384169a6b9838578c0a35636a43319fbcd0a19a3dca76d9e33953dc8719a1254a3c39aadd525a967942b589705934750850c31a3cc63199e1d64c94c088c3c30ce657460c98a33731c8e92982568d32f4ce356e3fb4e4d7b94e206bbad17b9e09413301a4abd0175766116933373a5751f8c41c15df375337839ac85c6269b54adf8b97e46c7266c0e54b20647ac16ad7423c808a4 s[0] = {1, 0, 3328, 0, 3328, 0, 0, 1, 2, 0, 3328, 0, 0, 0, 2, 3327, 3328, 0, 2, 0, 0, 0, 1, 0, 0, 1, 3328, 0, 0, 3328, 1, 0, 2, 0, 0, 2, 1, 1, 1, 1, 2, 3328, 0, 0, 0, 1, 1, 3327, 3327, 0, 0, 0, 3328, 1, 3328, 1, 3328, 0, 3328, 1, 2, 3328, 1, 1, 3328, 3328, 0, 1, 3328, 1, 3328, 3328, 2, 0, 1, 1, 3328, 1, 3328, 0, 0, 0, 1, 3328, 1, 3327, 3327, 3328, 3328, 1, 0, 0, 3328, 0, 3328, 3328, 1, 3328, 3328, 3328, 0, 0, 3328, 0, 0, 3327, 3328, 3328, 3328, 3328, 3328, 0, 3328, 1, 2, 2, 3328, 1, 1, 0, 2, 1, 0, 3328, 3327, 1, 0, 1, 3327, 3327, 0, 1, 0, 3327, 3328, 3328, 0, 0, 0, 3327, 1, 3328, 0, 0, 3328, 0, 0, 0, 0, 1, 0, 0, 0, 3328, 3328, 3328, 0, 2, 1, 0, 3328, 0, 0, 3328, 0, 3328, 1, 0, 0, 0, 0, 0, 0, 3328, 1, 1, 0, 1, 2, 0, 3328, 0, 1, 1, 0, 3328, 0, 0, 0, 2, 1, 0, 1, 0, 0, 0, 1, 3328, 3327, 0, 3328, 3328, 0, 3328, 0, 0, 1, 0, 3328, 1, 3328, 0, 0, 1, 0, 0, 3328, 0, 1, 3327, 0, 3328, 1, 3328, 0, 1, 2, 1, 1, 3328, 3328, 2, 3327, 3327, 0, 1, 1, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 3328, 1, 3327, 1, 1, 3328, 1, 3328} = 010000000d00000d00001000020000000d0000000002f0cf000d00020000000000010000001000000d000000d00100000200000020000110000110000200d000000000100001f0cfff0c00000000001d00001d00000d00001d000200d0011000000dd0001000001d00000dd0020000011000001d00000d000000000100d001f0cfff0cd0001d00000000000d00000dd00100d0000dd0000000000d0000f0cf000dd0000dd0000d00001d00022000001d000100000210000000d0ff1c00001000fffccf00100000f0cf000dd000000000f0cf0100d0000000000d000000000010000000000000d0000dd0002000010000000d000000d00000d00100000000000000000000d0011000001000020000000d000110000000d00000000020000100000100000000000100d0ff0c00000dd00000d0000000010000001d00000d00001000000000000d0001f0cf0000d00100d00010000210000100d0002d00fffccf001000010000011000000000011000000000000000001d00ff1c000100d00100d0 s = 010000000d00000d00001000020000000d0000000002f0cf000d00020000000000010000001000000d000000d00100000200000020000110000110000200d000000000100001f0cfff0c00000000001d00001d00000d00001d000200d0011000000dd0001000001d00000dd0020000011000001d00000d000000000100d001f0cfff0cd0001d00000000000d00000dd00100d0000dd0000000000d0000f0cf000dd0000dd0000d00001d00022000001d000100000210000000d0ff1c00001000fffccf00100000f0cf000dd000000000f0cf0100d0000000000d000000000010000000000000d0000dd0002000010000000d000000d00000d00100000000000000000000d0011000001000020000000d000110000000d00000000020000100000100000000000100d0ff0c00000dd00000d0000000010000001d00000d00001000000000000d0001f0cf0000d00100d00010000210000100d0002d00fffccf001000010000011000000000011000000000000000001d00ff1c000100d00100d00100d000fdcf0100000000d0000dd00000d0010000001d00000d00000d000100000000000000d00000000000d0002d00000000010000001000000dd0000000020000ff1c000000d0011000011000000d0002100000f0cf00000000100000f0cf0000d0002000001000fffccf010000001000000d000000d00000d00000000100d000f0cf002d00001d000100d00110000000d0010000010000020000000dd0001000001d00010000000dd0000000011000000dd0011000010000ff1c000100d00100d00110000100d00100000000d000fdcf0100d0020000000000001000000dd00100d000f0cf001d00012000001000000000001000000dd000f0cf0000d0000dd00000d0011000001d00000dd0001d00ff0cd00010000000d00100000200d0fffccf001d00ff0c0001100000200000000000000000fdcf000d000100000010000000d0000d00000d000110000100d00100d0010000000d000000d0000d000100d000f0cf000d000000d00100000000d0000d0000100000fdcf000dd0001d00012000010000000d00001000002000000d00000000ff1c00001000000dd002f0cf01000001000002f0cf0120000100d001f0cfff1c00001d00001000012000000d0000fdcf000000002d0000fdcf0000d00000d00200d0000d000110000000d00020000000d00210000110000000d00100000000d00100000200d0011000001d00001d000010000100000000000000d00000000000d0000000000dd00000d0001d00000d00010000001d000100000000d0020000000d000100000200000000d00110000100d0ff1c000010000100d00000d0000d000100000100d00100d0010000000000fffccf00200002f0cf0000d0010000000dd0000dd0001000ff0cd0010000011000000000ff1c00000000000000001d00000000011000011000000d00fffccf000d00010000001d00000000001d00ff0c00001000000000000000000dd00000000100d0000000000d00000dd00200d0001d00010000001d000000d00000d00100d000f0cf000d000000d0000d00000d00000000021000000000011000001d00001d00000d0000f0cf0000d000100000000000fdcf000dd0000dd0002d0000f0cf011000ff0cd00000000000d0001000001d0000100001f0cf000d00000dd00000d0011000000d00001d000100d002f0cf0100d001f0cf0000d0000dd00020000100d0000d000010000000d00100d000f0cf001000000dd0010000000000001d00001d00000d00001d000000000020000000d00100000000000000d0000000011000000000000d000100000100d0000d00010000001000000dd00000d0000d00010000001000010000000000000d0000000000fdcf0010000100000100000110000010000000d000f0cf000dd0001d000100d0010000ff0c000200d00000000100d00000000100d0000000000000020000001d000100d0000d00000d00ff1c0000200001000000100000000001000001f0cf001000ff0cd0000d000100d0020000000d00001d00ff0c000100d00100000100000100d000f0cf001d00000d0001f0cf0100000000d0000d00ff0c0000fdcf000dd0000000010000011000 NTT(s[0]) = {642, 1483, 1889, 159, 1951, 248, 1176, 648, 1709, 550, 1795, 1487, 867, 2312, 965, 57, 2651, 2579, 169, 2337, 690, 1901, 3069, 1389, 3004, 1594, 126, 2592, 1646, 2062, 1880, 1699, 3281, 227, 2909, 791, 2541, 2850, 1986, 260, 2996, 1543, 548, 326, 191, 2291, 1933, 1853, 2425, 133, 1090, 199, 2948, 1754, 3210, 1821, 2977, 556, 2500, 2286, 344, 721, 2432, 2435, 1185, 3024, 3168, 2886, 57, 2926, 2182, 1043, 584, 154, 501, 1821, 1764, 1003, 1577, 1679, 2659, 3258, 1442, 2636, 137, 214, 1275, 2918, 604, 510, 2948, 1224, 374, 3170, 1699, 1406, 2450, 2004, 1043, 2677, 558, 1026, 1872, 3317, 147, 819, 299, 2500, 1699, 3321, 873, 1869, 1503, 168, 292, 3224, 2115, 2212, 3252, 2933, 2332, 745, 786, 1200, 1194, 633, 554, 3267, 617, 2372, 2219, 1654, 2260, 1887, 1935, 601, 3104, 1534, 1424, 2545, 986, 2771, 2193, 2365, 2599, 3219, 931, 1534, 1577, 2999, 767, 1445, 2093, 1230, 1468, 2757, 2492, 506, 2729, 2334, 2672, 2992, 647, 979, 1834, 3222, 605, 3238, 3283, 1341, 2122, 1018, 3059, 1679, 2615, 2318, 2959, 2384, 2108, 2234, 507, 2912, 2080, 2582, 941, 3102, 2974, 343, 2879, 840, 689, 2393, 1248, 821, 2383, 2933, 1336, 3077, 1328, 2430, 2230, 3128, 466, 1194, 2611, 662, 2345, 995, 1803, 370, 1299, 2049, 3166, 3125, 2821, 1747, 1168, 984, 2434, 827, 3265, 348, 372, 2268, 2717, 2365, 2879, 819, 3000, 1980, 1271, 1009, 2415, 1461, 1822, 284, 1087, 1789, 2402, 777, 3314, 1240, 1615, 1734, 3042, 3268, 3288, 2651, 1239, 2180, 3038, 579, 384, 1899, 3008, 1790} = 82b25c61f7099f870f988428ad662203f75c638390c593035b3aa1a91092b2d276fddb56bcab637e00a26ee68058376ad13c0e5d7b31ed29b2c24710b47b60246214bf308f8dd77379590842740c84ab6d8adc71a1cb22c4e98e58112d803998a104bd606cb439e0b686384148a209f5d171e4b63e29f66863aacba2c5a489600dfb64b65ce21f848b4c7621c6a3e65792497d1354a72e22405057cf9330332b419ca396cf69d374df850a2481c943488ab45cb71c992e12034baa94272a32cc694294ab6867d4f8758f972520ec5f90159fda33ad91d893273ac9a3e35f2976bbff525a2de84cbc55acbca91fa9ea91700abb87323d2a67c95d62cad3dc534aa83ff3fb6837ea908f0b953ca88bfb01b62068a1ade3c19e7b153f8b34b19295e054334f59b73855c030e597b688c3d2a14a336a2929393e0b27171315805e5cc3053b6d90843d82b933c1cc1574c18d9dda933f3b33b8cb7bf7143f6f595b1ec7113fd46f629930f28c4d4f666ce24bccd8bca5d74488de3b2480b176c0eb6f dkPKE = NTT(s) = 82b25c61f7099f870f988428ad662203f75c638390c593035b3aa1a91092b2d276fddb56bcab637e00a26ee68058376ad13c0e5d7b31ed29b2c24710b47b60246214bf308f8dd77379590842740c84ab6d8adc71a1cb22c4e98e58112d803998a104bd606cb439e0b686384148a209f5d171e4b63e29f66863aacba2c5a489600dfb64b65ce21f848b4c7621c6a3e65792497d1354a72e22405057cf9330332b419ca396cf69d374df850a2481c943488ab45cb71c992e12034baa94272a32cc694294ab6867d4f8758f972520ec5f90159fda33ad91d893273ac9a3e35f2976bbff525a2de84cbc55acbca91fa9ea91700abb87323d2a67c95d62cad3dc534aa83ff3fb6837ea908f0b953ca88bfb01b62068a1ade3c19e7b153f8b34b19295e054334f59b73855c030e597b688c3d2a14a336a2929393e0b27171315805e5cc3053b6d90843d82b933c1cc1574c18d9dda933f3b33b8cb7bf7143f6f595b1ec7113fd46f629930f28c4d4f666ce24bccd8bca5d74488de3b2480b176c0eb6f9dd19434ec33563303fcf7cdbe09c55d4216ad524379e451e74a2121c442c4412de5e137ed18421e07779b598860cc2e4e42c10f58a01617936c4548453183739c5624c68915b79a25a90257b1437a1583a9107d7d0587bee15570f3c008b9140f779cdce06fba05ac57991020162bb2096911594109f9032a09007eea48e1b5b5e11c9643d75284256c5a73b935668abb12aeeab7b040f71e17a74235e166d1942f7caa890869ccb1184cd44a9e82a89f31e83602e21de2b5cacfc254282470e0c66b020a5b058043e9135ab06c4fe1329d7a280ba6dc3de017c1041a26cf3b10d305c73594c469ac11b091bcb20412dfdc3ef0b712aee31fc2a81bfbd9990ca296fe45bcb992ba92d4148591a2f80990f218a2991bb3f3098a36c6568db8a40ab03b9e017305d893b48285a5178ee6b80dd2c5555837c3e976afd36b895c10acb438ca7009ad7723b31b3aa6a680156ec3cfe4e813dbf010e6e5b39a890b76984d20e965c5a39a6cda801ec55c55245abe3b946bda7c8e70c99ac62e2ca2c2ce165722d710a1c443a6467f91c63ed53c3f223580fbd058b6c8b4f134ae3b490ae97466e1983b0e669b22615df1732df9e9a98d4575720571ffa60dc888a65f6644902a9ad89a93c4b22132515d808ca445bab49e3276caa8a48d272b823477a0bc151491c229ab38bd6a4485257374cbcd03d6a6c655b6a1d06751995fa1c394116476f399673b5b40857cb9c68721168a936d89a3008923b81c2d7eb94ba63c3eff45b4ccb48a9d2142e8d5238ce904376bcd1e088b864a6a5acab75b138b9be44b08f00825bc3a804835337cac36bc41ca8bab90384a51341875c7ad27d109afa36e2965cafe1922811762a077af789b8d6c490c0f102b62869ca38a83effb05f14ac82346645de63cb60bba30b665a3f1c9f842952aea89fe630f6404b63164a39692180d806d65da3c1be076ae77b42d665edd2b93c1210427909d294a2fbad460444032a727960210005b7b3ad367cc300738187b3c64bbc00b16257f09182537129b14bf94c482bfdb9b82634821862a7fb0234ae0b5685582de054cb5575e9f8464336609cbd7ad5b486117ac4ea2468be9147e8c96b3a07993d5725f85c31c79405541c2c13b3abdc55b2dfa2ab02842a711a2b877097769c22be065622ab0a92d5108bfa10c644935ee4652efca95fafca3b5cccf0187a45708cf68838ffa79427a0400f8439f15b11e064b2b777c0715aa8a91c96ea7f1a851f47f8f077514a36c901059892273ca8695b3b418c8187558d18f1b9153d6c0b966e08f9a675889aa519224cdc4fc1fee51082ec26cea593124435f4bf95b3d852ad9554953088aae602e0ad3023d17576123929b1150fa496b850ab4e5f372ab7188f3127d2dcb970df56c4f5a2548903bd5ec50fb9196cf2374d7cc728243757743083d4a93c4b6adca54314a3200fe5a303aba4c07d4cf3eb632eca5b353190decd984395192d1f63d3d9291e00aa17e0872df27a405832d0a7b43115b05e6a4cb9293812ab26eb2e148e4b5082ba99039d6847a03be1693afc09a3ab95044107586e0db02720145c84cc800b669c51c8a96e526c4a99970234409414ed623cc e = 0010000000d00000d0000d00000d00000dd0001d00020000000d00010000000000000000000dd0000000000d000000000110000100d00000d000f0cf000d00000000012000ff0c00000dd00000000010000200d00100d0011000000000ff0c000000d001000001100000100002100000f0cf001000000dd0ff0cd000000000fdcf0000d0020000001000010000000d00000d00012000010000010000000000000dd0fffccf010000011000001d000000d0002000001d000110000010000000d0ff0cd0002d00020000002000001000002d00000000000000000d000000000020000010000000000110000000d001f0cf0000d002f0cf000000002000020000ff0c00010000000000001d000000000100d00100d0001000001000020000ff0cd0000000020000000000000dd0012000000d000120000200d00200000200000110000000000000d0002000010000000dd00100d0000000000dd0000000000000001000001d00ff0cd00000d00000000100d0000dd00100d0002000001000000000001000010000001000010000ff0c00000d000010000000000200000100d00000d002f0cf011000020000000000000d00000000010000001000001000000dd0011000ff0cd000000000f0cf0000d0001000000000001000000000002000000d00001000ff0c000120000100000100000000d0010000001d00000000002d00000000000dd0000d00ff1c00000000021000010000000d000000d000000002000000000000000000100001000000f0cf010000000d000110000010000100d0001d00010000000000001d0001100000000000100001000000f0cf000d000000d0010000ff1c00000d00000d00010000002000ff0c0000fdcf001d000000d000100001000000fdcf000000ff0cd0ff1c00011000ff0cd00100000220000100000000d0012000001d00000000010000000000000d00001d00000d000010000000d00220000000d0001d000000d002000000f0cf001d00000000001000010000000dd0010000010000001000020000000000000d00fffccf001d000000d00020000210000100d00200d00010000000d00110000110000110000000d00010000010000000d00010000000d0ff0c00001d00001000000000000000000d00000dd00100d0001d000100d000000000000001200001000000fdcf0000d00020000010000210000010000000000000d00000000010000000d00000000010000020000110000100000000d00000000100d001000001200000fdcf0110000010000110000000000010000010000000d00000000200d00100d00100d00000000000d0002000000d000000000000d00000d0000d00011000000dd0011000001d000000000100000100000100000000000110000200d00010000000000000d00110000000d00200000000d0000dd000fdcf011000020000001d0000000000fdcf000d00010000001d00000000000000000dd0000000020000ff1c00ff1c0001000000f0cf0000000100000100d0ff0c000110000100000210000000d0012000002d000100d0fffccf011000002000000000001000010000010000001d00001d000100000110000100000100000100d0000dd0000dd00000d00010000000000000d00100d000f0cf000d000110000000000000d0001000000000000000002d000000d00010000100d0001d00000d000100d00100d0000d000100000200000200d000fdcf001d00001000000000011000000d000100d0000d00000000ff0c000000d0000000011000000dd0011000000dd00000d0ff0c00000dd00010000100d00100d0001d00000dd0010000000dd0010000001000002d0000000000200001f0cf01f0cf000d0001100000000000f0cf021000001d00010000010000001000010000011000001d00011000002000011000ff0c00ff0c0001f0cf0000d001000000f0cf010000001d00001d000000000100d00000d0000d0000200001100000f0cf000000ff0c000210000200000000d0011000011000ff0c00000dd00020000010000000d0001000000000011000000d00000dd0ff0c00000dd0020000000000010000ff0c00000d000010000120000100d0000000001000002000010000000000010000001d00001d00 NTT(e) = e6a75cbb814998c75da68ba322b1a8d1193c3c393b3494b543d39c7d5c27a4963409eb1fb633ad0da40bec9ca524aa75c913b8bfea226be96e6ea3284b496d63312a37407b9380a6f09115fb64c0cd63ab6d7c4361a959e56307485173e37a7d4180872d1689d7190695997b8e0702ecb82fd1a687e00a5b24679bb85821ac0951cfb4884e093e7985a74adb196d9836ff94156946a0a9851ca0640ee131175383b2b2b1be77286d07080229cacf57680ef5f83ae8a3a080794eaa5ac67d096f9668a3f7fc3c81310aec002b2c626ab1776b2dbc719f30a5b38b0623069cfe682b92627b65884deb34c19e24bb17132786349e093587a6d061c34a457323664fd21c71559cd46c301e9314732120cd7c49fec15ea8a87aa80bb804881d7188aedc4934f32933689a69a6f552047abaae00a4dc0110f0f271b414cb1b253ba50ba0cf200fabd70ed1dc27a946bb07a8549e701445442c7f0248d469b69a87148037182d703f4aa4877970a304822b06929bdef60feb135b4bb19d11b39ff3264e5f3aa9d8126d981b717f9192e733b290ac55c49a6a3dc04df92090b620b6b739a4ab7546e2bc530be8c153fb314a3212d93c0670a0b7626bb9aed721738290a2a849e692940fdc9cb925b56f9868f0777ab0b1c9985b203eb173944ba82b8c02b3d846460abcf724292290be88479a15579a1fe9173c3a1a38f3a8fac49facc9112b203c3287094732195a58254df696557c50d88857f55c1e39a99f63e28659119fe8a521ee26abc43cb1a9abc15d38a6c6240db07a4909d74ffbc730bd2a1dae3a9302c4603b143e7980c4a83155452c3ce0441c81fa21a557bcd1384ab741b6a7c8a0fbc19f1db430382398e5cc79da7301d4a1bb09d4ae48682a74901a906c25c5bb2691670a60744c7e96a799f58e2727aa420b34f5506e57aaa427e3ae36a825278c13ed7056238c298a51bd8a47902969c46136a4bfc1bbc477563c0a45400a1913490e4b05a888bb261ae8072866800a4365836c7f2ea3bf4c31b77bc721aff057ffd986268ac92012888ac5962373c0a5b78336703d27323d42955ee2376cc5252d6c6a5a0ecb93d620aba46ccbbaec284d97af6fd539780532d428bb46336fdfb84207b9b48ee7107c6b1d6c14768b3098209a57a0217e10773776da3d0184931ae42609346a5e754d2f6cb6a6690bd576692ad36906cb00065b12231b6951c07a18ab4f5b91917e6c07ed289ae101ba90a00e15d378f7d846c3d89eb43546b3a15abcdccc638769fcb89ecad34b8015aca1ab6b48a054fb599ea9a278ba0ac68999743f46420292c430f340d36142ec75b42a4c83ea3483bebc76144818bb545bf4e145cba107a456b3d7a8c97b0b693f87857abc6f455477fe4b53e10cbe87e9109d33af85720622e5b83c807391d33fcf77629f941cedfbaeff954b8770a9e0b4a3e6e84052bcb62bbc183eac5cbb994439178ae10525017030a5f53179d1af49849f9c4a29b8341d96489a833c8270691711ea994a25aae5a485bbf053c4d61b5b482a2db5c930e5b1e11a299345174c2b56e90215d7627bb5a1a106433086506f9b063194e86d9e27c1f4dbcd32a6a1cb93b89906c15c619316ba067c4b0c4925978395b90a6639fdc86cd4b86d7a75ce38ea94c25051f0e629360241272123b0512a72d281f3e05c98942c117a407ea81b29270bd7989afcac1827196d35731529558fe44140b06172e8d1b6db77a98c2c74f9d3679d4a56d50307ec0311f6b5b06a09117a02ac9f729a648126eda7398c4c5704db42fb2747a6447d75c49a65542eeaa220a480994d09448ce04b05dbcd0e9407ca90656e9c88c4b057c2bb03f786b318474e09e816e13b1dda3c49316bc977e73de602ca69aa5ef4e662495155f6c719d0295de26906c4a081afc37cea46369bec8a0e2b875190100813878371ae18e959f166841a3709dca1839c13303b078e9173691796ab10c03a6b729b83bc040145b8a84ab4c42713f36493897a877cc37cec10b0a8e124e9994e1c104719685cb1092c3a22976e8b1d0009a7e5a5bb8981755fe8cc671947db326db31899ff1887f710cd842b88a13088092a4def90088da06c742773dd3596021731660820e065724682be61a8cb6ff881ffda58d6f24d5cfa40 t = ed859032bbb74c7412a7271c8ef23a5a08c31551a2a5cb8ada78538ce6c96d11625cb45e87b133163b16a4705aba1514f006afccbccf3c5c05acbc4563771bb8508072745d0ba56f57566181c3073b6c2b0dda50a2a83e74c67bcd48c0820b809d03a6ae4193dbd3bc06d072d2c64fd1e0b408a9c29818cd2df7790f9779536b0a076b4fb57b56f8cbb8ea3290c2f8b381c993d9eb49d8b4873ec660895528ab9ac306a66ae8209e2db9b79cb89220fab9d5cbb290ac690c79199218229aa8276393a73c826459429baed8365b88733871450e9523959c3f28691a3a0622e923259d2c90a61ca1525caf75a3a4292036957a5966d55840927234e1c5445b6685396890e3ccb9869147e63ce0b23defbb1c00f46df3819dd4a5756a355f61c1793b25a9b713c3abd12605198083773cf26909ffc92cd423cd290ba1801c694e7c80d6e2c9c1b943c69a5e7387ade187b21bd2a598c49ec772cde74656f1b43fa21021bcb86db8f91e03522bb4a76823483033f68659b57fa972c42673795b9a5dafa229fd8818f940a1b38a925cf06af712332b789a6f64ce91c7010af8a531101de8541a3ba4b4b893bfe7e791e693a5987a3d2d7224aeb213c5aba14aa0686efbbf31258d37122c304151916a9291181ffe788864f52acf001d788a3d80e4ad14623e9c402090b73fae5cb4225802cc4ab9c323c8cb914231c31c14c12a20ab7b5df5b6815bc04d991a32b6ccd229cf9692bf2e549ceb66512be58afe284b1d4990e46b5bafcca72589024e0b710169445e793cbbda9ca2664882199a54c31484d9364c2545876758999027c8f6423fa1a9ea810731092ca41c2451f29452c24d1d120517e06eaac91a77a47dec3c036ff84bfda92bcb396a36a75007014c0b6882a939b7e2c109c6046c04e9c1e4b1bd83444cf7838ca909946b512cb8d06ed3ab66a62071eb439632cccbced23c06c3456cdabf321328a17263e6aa3fee0028bef312cc99477ac71c53909740502e340b7cc06111eeb90bb08c58bfb97d78acbb10e7240ee5672062783636565c1744217787ffa33287f5075464b97707aec6864b38c918e0ebaf40fc9aac6128db4863a40c80b9d23261344a370c7b2dcb76e38623e5443242bcce9fb872b4c589b886aeb9fc79347cbf216b6ea8d1c7f5c5802fa24d1e68a4dc161699f90681069898e41d34a82cced119189b6547587972c4b17851a292f728f638a90164b97416c5b5b9231f1c675cf12c8ec1ce4866673f61addf98950263680efb56124b5936862f5328a3de923c4b2435b543ceee3b9761b5515aaaaecbdbb9cf8202090c82a2e5301fd0aee4fa4b39b0302d1813ab87cc1ba15595c36ef953401a92b8a88465c29ca4062626bc45b2a762c4ed957e53551827322351701db42c73e340566a476f559ac776283816da810c76af10f41482577544302e80eb6ab2fb720c2a950464c62970a450e65983c336dde77039722c614143a2b72c40256cf2142365ebaf288b0d9d69b56671b45f72c90a26ad50229d8fd6291ae6306d614aba34b65af02fa7cc2f5d7c5c8f4b30dc715f65f82c6320088fe0cfd4f05dc63a22ffeb0f38f68c5e08af5603c605007c9efc1f1574c94d322191f248cf34246d9bb06c650e85a8ce1832860689af7791054bd01b79a11cc41ca05f3a174d9393191bc541678989b0a6fbea82c488aa828b077003a69b335098d00616e28d7853ab98b54c0b99840ff94393532285ccbc003120cd8b77c5c18d0e654750893de5c071a60a152350cc537a34a60c7032c21623c1bd0ce38046b986e786051e9891a7784223b45cc09682dbfacd92776f594377d07290667a81726c7a62ab1e883329b22205b3e72165c846261429dd3cccedd4933bb38f4b9000a066c2464844ab47899269033078c1f2473e564a2c697caeded4cda82b8516c287b23a84ee997fe9206874f73d130a73d5a14e10668365089a9695b7870806fa8431663120eac9b9133937117cb3bcf862e306747139253f181deb0352e6bb6b888561d46b3406fa31ec08520b275bacb6b1fd1bc40076958ed1bf96b70c5f567c9f83a3abdcc85e81aa0f99a50c2aac18a4177aa0bd1d7caaabb11e09a3bc211685396750a4723c8c8334433019c1844c9aa22b6e6995bc703d ek = ed859032bbb74c7412a7271c8ef23a5a08c31551a2a5cb8ada78538ce6c96d11625cb45e87b133163b16a4705aba1514f006afccbccf3c5c05acbc4563771bb8508072745d0ba56f57566181c3073b6c2b0dda50a2a83e74c67bcd48c0820b809d03a6ae4193dbd3bc06d072d2c64fd1e0b408a9c29818cd2df7790f9779536b0a076b4fb57b56f8cbb8ea3290c2f8b381c993d9eb49d8b4873ec660895528ab9ac306a66ae8209e2db9b79cb89220fab9d5cbb290ac690c79199218229aa8276393a73c826459429baed8365b88733871450e9523959c3f28691a3a0622e923259d2c90a61ca1525caf75a3a4292036957a5966d55840927234e1c5445b6685396890e3ccb9869147e63ce0b23defbb1c00f46df3819dd4a5756a355f61c1793b25a9b713c3abd12605198083773cf26909ffc92cd423cd290ba1801c694e7c80d6e2c9c1b943c69a5e7387ade187b21bd2a598c49ec772cde74656f1b43fa21021bcb86db8f91e03522bb4a76823483033f68659b57fa972c42673795b9a5dafa229fd8818f940a1b38a925cf06af712332b789a6f64ce91c7010af8a531101de8541a3ba4b4b893bfe7e791e693a5987a3d2d7224aeb213c5aba14aa0686efbbf31258d37122c304151916a9291181ffe788864f52acf001d788a3d80e4ad14623e9c402090b73fae5cb4225802cc4ab9c323c8cb914231c31c14c12a20ab7b5df5b6815bc04d991a32b6ccd229cf9692bf2e549ceb66512be58afe284b1d4990e46b5bafcca72589024e0b710169445e793cbbda9ca2664882199a54c31484d9364c2545876758999027c8f6423fa1a9ea810731092ca41c2451f29452c24d1d120517e06eaac91a77a47dec3c036ff84bfda92bcb396a36a75007014c0b6882a939b7e2c109c6046c04e9c1e4b1bd83444cf7838ca909946b512cb8d06ed3ab66a62071eb439632cccbced23c06c3456cdabf321328a17263e6aa3fee0028bef312cc99477ac71c53909740502e340b7cc06111eeb90bb08c58bfb97d78acbb10e7240ee5672062783636565c1744217787ffa33287f5075464b97707aec6864b38c918e0ebaf40fc9aac6128db4863a40c80b9d23261344a370c7b2dcb76e38623e5443242bcce9fb872b4c589b886aeb9fc79347cbf216b6ea8d1c7f5c5802fa24d1e68a4dc161699f90681069898e41d34a82cced119189b6547587972c4b17851a292f728f638a90164b97416c5b5b9231f1c675cf12c8ec1ce4866673f61addf98950263680efb56124b5936862f5328a3de923c4b2435b543ceee3b9761b5515aaaaecbdbb9cf8202090c82a2e5301fd0aee4fa4b39b0302d1813ab87cc1ba15595c36ef953401a92b8a88465c29ca4062626bc45b2a762c4ed957e53551827322351701db42c73e340566a476f559ac776283816da810c76af10f41482577544302e80eb6ab2fb720c2a950464c62970a450e65983c336dde77039722c614143a2b72c40256cf2142365ebaf288b0d9d69b56671b45f72c90a26ad50229d8fd6291ae6306d614aba34b65af02fa7cc2f5d7c5c8f4b30dc715f65f82c6320088fe0cfd4f05dc63a22ffeb0f38f68c5e08af5603c605007c9efc1f1574c94d322191f248cf34246d9bb06c650e85a8ce1832860689af7791054bd01b79a11cc41ca05f3a174d9393191bc541678989b0a6fbea82c488aa828b077003a69b335098d00616e28d7853ab98b54c0b99840ff94393532285ccbc003120cd8b77c5c18d0e654750893de5c071a60a152350cc537a34a60c7032c21623c1bd0ce38046b986e786051e9891a7784223b45cc09682dbfacd92776f594377d07290667a81726c7a62ab1e883329b22205b3e72165c846261429dd3cccedd4933bb38f4b9000a066c2464844ab47899269033078c1f2473e564a2c697caeded4cda82b8516c287b23a84ee997fe9206874f73d130a73d5a14e10668365089a9695b7870806fa8431663120eac9b9133937117cb3bcf862e306747139253f181deb0352e6bb6b888561d46b3406fa31ec08520b275bacb6b1fd1bc40076958ed1bf96b70c5f567c9f83a3abdcc85e81aa0f99a50c2aac18a4177aa0bd1d7caaabb11e09a3bc211685396750a4723c8c8334433019c1844c9aa22b6e6995bc703ddb09edbe4f1a61a62a23531cf707976a861efef13e8347210d77f3d080e9ba89 dkPKE = ed859032bbb74c7412a7271c8ef23a5a08c31551a2a5cb8ada78538ce6c96d11625cb45e87b133163b16a4705aba1514f006afccbccf3c5c05acbc4563771bb8508072745d0ba56f57566181c3073b6c2b0dda50a2a83e74c67bcd48c0820b809d03a6ae4193dbd3bc06d072d2c64fd1e0b408a9c29818cd2df7790f9779536b0a076b4fb57b56f8cbb8ea3290c2f8b381c993d9eb49d8b4873ec660895528ab9ac306a66ae8209e2db9b79cb89220fab9d5cbb290ac690c79199218229aa8276393a73c826459429baed8365b88733871450e9523959c3f28691a3a0622e923259d2c90a61ca1525caf75a3a4292036957a5966d55840927234e1c5445b6685396890e3ccb9869147e63ce0b23defbb1c00f46df3819dd4a5756a355f61c1793b25a9b713c3abd12605198083773cf26909ffc92cd423cd290ba1801c694e7c80d6e2c9c1b943c69a5e7387ade187b21bd2a598c49ec772cde74656f1b43fa21021bcb86db8f91e03522bb4a76823483033f68659b57fa972c42673795b9a5dafa229fd8818f940a1b38a925cf06af712332b789a6f64ce91c7010af8a531101de8541a3ba4b4b893bfe7e791e693a5987a3d2d7224aeb213c5aba14aa0686efbbf31258d37122c304151916a9291181ffe788864f52acf001d788a3d80e4ad14623e9c402090b73fae5cb4225802cc4ab9c323c8cb914231c31c14c12a20ab7b5df5b6815bc04d991a32b6ccd229cf9692bf2e549ceb66512be58afe284b1d4990e46b5bafcca72589024e0b710169445e793cbbda9ca2664882199a54c31484d9364c2545876758999027c8f6423fa1a9ea810731092ca41c2451f29452c24d1d120517e06eaac91a77a47dec3c036ff84bfda92bcb396a36a75007014c0b6882a939b7e2c109c6046c04e9c1e4b1bd83444cf7838ca909946b512cb8d06ed3ab66a62071eb439632cccbced23c06c3456cdabf321328a17263e6aa3fee0028bef312cc99477ac71c53909740502e340b7cc06111eeb90bb08c58bfb97d78acbb10e7240ee5672062783636565c1744217787ffa33287f5075464b97707aec6864b38c918e0ebaf40fc9aac6128db4863a40c80b9d23261344a370c7b2dcb76e38623e5443242bcce9fb872b4c589b886aeb9fc79347cbf216b6ea8d1c7f5c5802fa24d1e68a4dc161699f90681069898e41d34a82cced119189b6547587972c4b17851a292f728f638a90164b97416c5b5b9231f1c675cf12c8ec1ce4866673f61addf98950263680efb56124b5936862f5328a3de923c4b2435b543ceee3b9761b5515aaaaecbdbb9cf8202090c82a2e5301fd0aee4fa4b39b0302d1813ab87cc1ba15595c36ef953401a92b8a88465c29ca4062626bc45b2a762c4ed957e53551827322351701db42c73e340566a476f559ac776283816da810c76af10f41482577544302e80eb6ab2fb720c2a950464c62970a450e65983c336dde77039722c614143a2b72c40256cf2142365ebaf288b0d9d69b56671b45f72c90a26ad50229d8fd6291ae6306d614aba34b65af02fa7cc2f5d7c5c8f4b30dc715f65f82c6320088fe0cfd4f05dc63a22ffeb0f38f68c5e08af5603c605007c9efc1f1574c94d322191f248cf34246d9bb06c650e85a8ce1832860689af7791054bd01b79a11cc41ca05f3a174d9393191bc541678989b0a6fbea82c488aa828b077003a69b335098d00616e28d7853ab98b54c0b99840ff94393532285ccbc003120cd8b77c5c18d0e654750893de5c071a60a152350cc537a34a60c7032c21623c1bd0ce38046b986e786051e9891a7784223b45cc09682dbfacd92776f594377d07290667a81726c7a62ab1e883329b22205b3e72165c846261429dd3cccedd4933bb38f4b9000a066c2464844ab47899269033078c1f2473e564a2c697caeded4cda82b8516c287b23a84ee997fe9206874f73d130a73d5a14e10668365089a9695b7870806fa8431663120eac9b9133937117cb3bcf862e306747139253f181deb0352e6bb6b888561d46b3406fa31ec08520b275bacb6b1fd1bc40076958ed1bf96b70c5f567c9f83a3abdcc85e81aa0f99a50c2aac18a4177aa0bd1d7caaabb11e09a3bc211685396750a4723c8c8334433019c1844c9aa22b6e6995bc703ddb09edbe4f1a61a62a23531cf707976a861efef13e8347210d77f3d080e9ba89 z = 5f574ef7f013d4336801fed022178c3ed91d0b6d51325315fc1dcabf4770a2ea H(ek) = fa12bd4f75caa74f23b4af606902f6187dd9be62a43b1b529344f1114e69391d dk = 82b25c61f7099f870f988428ad662203f75c638390c593035b3aa1a91092b2d276fddb56bcab637e00a26ee68058376ad13c0e5d7b31ed29b2c24710b47b60246214bf308f8dd77379590842740c84ab6d8adc71a1cb22c4e98e58112d803998a104bd606cb439e0b686384148a209f5d171e4b63e29f66863aacba2c5a489600dfb64b65ce21f848b4c7621c6a3e65792497d1354a72e22405057cf9330332b419ca396cf69d374df850a2481c943488ab45cb71c992e12034baa94272a32cc694294ab6867d4f8758f972520ec5f90159fda33ad91d893273ac9a3e35f2976bbff525a2de84cbc55acbca91fa9ea91700abb87323d2a67c95d62cad3dc534aa83ff3fb6837ea908f0b953ca88bfb01b62068a1ade3c19e7b153f8b34b19295e054334f59b73855c030e597b688c3d2a14a336a2929393e0b27171315805e5cc3053b6d90843d82b933c1cc1574c18d9dda933f3b33b8cb7bf7143f6f595b1ec7113fd46f629930f28c4d4f666ce24bccd8bca5d74488de3b2480b176c0eb6f9dd19434ec33563303fcf7cdbe09c55d4216ad524379e451e74a2121c442c4412de5e137ed18421e07779b598860cc2e4e42c10f58a01617936c4548453183739c5624c68915b79a25a90257b1437a1583a9107d7d0587bee15570f3c008b9140f779cdce06fba05ac57991020162bb2096911594109f9032a09007eea48e1b5b5e11c9643d75284256c5a73b935668abb12aeeab7b040f71e17a74235e166d1942f7caa890869ccb1184cd44a9e82a89f31e83602e21de2b5cacfc254282470e0c66b020a5b058043e9135ab06c4fe1329d7a280ba6dc3de017c1041a26cf3b10d305c73594c469ac11b091bcb20412dfdc3ef0b712aee31fc2a81bfbd9990ca296fe45bcb992ba92d4148591a2f80990f218a2991bb3f3098a36c6568db8a40ab03b9e017305d893b48285a5178ee6b80dd2c5555837c3e976afd36b895c10acb438ca7009ad7723b31b3aa6a680156ec3cfe4e813dbf010e6e5b39a890b76984d20e965c5a39a6cda801ec55c55245abe3b946bda7c8e70c99ac62e2ca2c2ce165722d710a1c443a6467f91c63ed53c3f223580fbd058b6c8b4f134ae3b490ae97466e1983b0e669b22615df1732df9e9a98d4575720571ffa60dc888a65f6644902a9ad89a93c4b22132515d808ca445bab49e3276caa8a48d272b823477a0bc151491c229ab38bd6a4485257374cbcd03d6a6c655b6a1d06751995fa1c394116476f399673b5b40857cb9c68721168a936d89a3008923b81c2d7eb94ba63c3eff45b4ccb48a9d2142e8d5238ce904376bcd1e088b864a6a5acab75b138b9be44b08f00825bc3a804835337cac36bc41ca8bab90384a51341875c7ad27d109afa36e2965cafe1922811762a077af789b8d6c490c0f102b62869ca38a83effb05f14ac82346645de63cb60bba30b665a3f1c9f842952aea89fe630f6404b63164a39692180d806d65da3c1be076ae77b42d665edd2b93c1210427909d294a2fbad460444032a727960210005b7b3ad367cc300738187b3c64bbc00b16257f09182537129b14bf94c482bfdb9b82634821862a7fb0234ae0b5685582de054cb5575e9f8464336609cbd7ad5b486117ac4ea2468be9147e8c96b3a07993d5725f85c31c79405541c2c13b3abdc55b2dfa2ab02842a711a2b877097769c22be065622ab0a92d5108bfa10c644935ee4652efca95fafca3b5cccf0187a45708cf68838ffa79427a0400f8439f15b11e064b2b777c0715aa8a91c96ea7f1a851f47f8f077514a36c901059892273ca8695b3b418c8187558d18f1b9153d6c0b966e08f9a675889aa519224cdc4fc1fee51082ec26cea593124435f4bf95b3d852ad9554953088aae602e0ad3023d17576123929b1150fa496b850ab4e5f372ab7188f3127d2dcb970df56c4f5a2548903bd5ec50fb9196cf2374d7cc728243757743083d4a93c4b6adca54314a3200fe5a303aba4c07d4cf3eb632eca5b353190decd984395192d1f63d3d9291e00aa17e0872df27a405832d0a7b43115b05e6a4cb9293812ab26eb2e148e4b5082ba99039d6847a03be1693afc09a3ab95044107586e0db02720145c84cc800b669c51c8a96e526c4a99970234409414ed623cced859032bbb74c7412a7271c8ef23a5a08c31551a2a5cb8ada78538ce6c96d11625cb45e87b133163b16a4705aba1514f006afccbccf3c5c05acbc4563771bb8508072745d0ba56f57566181c3073b6c2b0dda50a2a83e74c67bcd48c0820b809d03a6ae4193dbd3bc06d072d2c64fd1e0b408a9c29818cd2df7790f9779536b0a076b4fb57b56f8cbb8ea3290c2f8b381c993d9eb49d8b4873ec660895528ab9ac306a66ae8209e2db9b79cb89220fab9d5cbb290ac690c79199218229aa8276393a73c826459429baed8365b88733871450e9523959c3f28691a3a0622e923259d2c90a61ca1525caf75a3a4292036957a5966d55840927234e1c5445b6685396890e3ccb9869147e63ce0b23defbb1c00f46df3819dd4a5756a355f61c1793b25a9b713c3abd12605198083773cf26909ffc92cd423cd290ba1801c694e7c80d6e2c9c1b943c69a5e7387ade187b21bd2a598c49ec772cde74656f1b43fa21021bcb86db8f91e03522bb4a76823483033f68659b57fa972c42673795b9a5dafa229fd8818f940a1b38a925cf06af712332b789a6f64ce91c7010af8a531101de8541a3ba4b4b893bfe7e791e693a5987a3d2d7224aeb213c5aba14aa0686efbbf31258d37122c304151916a9291181ffe788864f52acf001d788a3d80e4ad14623e9c402090b73fae5cb4225802cc4ab9c323c8cb914231c31c14c12a20ab7b5df5b6815bc04d991a32b6ccd229cf9692bf2e549ceb66512be58afe284b1d4990e46b5bafcca72589024e0b710169445e793cbbda9ca2664882199a54c31484d9364c2545876758999027c8f6423fa1a9ea810731092ca41c2451f29452c24d1d120517e06eaac91a77a47dec3c036ff84bfda92bcb396a36a75007014c0b6882a939b7e2c109c6046c04e9c1e4b1bd83444cf7838ca909946b512cb8d06ed3ab66a62071eb439632cccbced23c06c3456cdabf321328a17263e6aa3fee0028bef312cc99477ac71c53909740502e340b7cc06111eeb90bb08c58bfb97d78acbb10e7240ee5672062783636565c1744217787ffa33287f5075464b97707aec6864b38c918e0ebaf40fc9aac6128db4863a40c80b9d23261344a370c7b2dcb76e38623e5443242bcce9fb872b4c589b886aeb9fc79347cbf216b6ea8d1c7f5c5802fa24d1e68a4dc161699f90681069898e41d34a82cced119189b6547587972c4b17851a292f728f638a90164b97416c5b5b9231f1c675cf12c8ec1ce4866673f61addf98950263680efb56124b5936862f5328a3de923c4b2435b543ceee3b9761b5515aaaaecbdbb9cf8202090c82a2e5301fd0aee4fa4b39b0302d1813ab87cc1ba15595c36ef953401a92b8a88465c29ca4062626bc45b2a762c4ed957e53551827322351701db42c73e340566a476f559ac776283816da810c76af10f41482577544302e80eb6ab2fb720c2a950464c62970a450e65983c336dde77039722c614143a2b72c40256cf2142365ebaf288b0d9d69b56671b45f72c90a26ad50229d8fd6291ae6306d614aba34b65af02fa7cc2f5d7c5c8f4b30dc715f65f82c6320088fe0cfd4f05dc63a22ffeb0f38f68c5e08af5603c605007c9efc1f1574c94d322191f248cf34246d9bb06c650e85a8ce1832860689af7791054bd01b79a11cc41ca05f3a174d9393191bc541678989b0a6fbea82c488aa828b077003a69b335098d00616e28d7853ab98b54c0b99840ff94393532285ccbc003120cd8b77c5c18d0e654750893de5c071a60a152350cc537a34a60c7032c21623c1bd0ce38046b986e786051e9891a7784223b45cc09682dbfacd92776f594377d07290667a81726c7a62ab1e883329b22205b3e72165c846261429dd3cccedd4933bb38f4b9000a066c2464844ab47899269033078c1f2473e564a2c697caeded4cda82b8516c287b23a84ee997fe9206874f73d130a73d5a14e10668365089a9695b7870806fa8431663120eac9b9133937117cb3bcf862e306747139253f181deb0352e6bb6b888561d46b3406fa31ec08520b275bacb6b1fd1bc40076958ed1bf96b70c5f567c9f83a3abdcc85e81aa0f99a50c2aac18a4177aa0bd1d7caaabb11e09a3bc211685396750a4723c8c8334433019c1844c9aa22b6e6995bc703ddb09edbe4f1a61a62a23531cf707976a861efef13e8347210d77f3d080e9ba89fa12bd4f75caa74f23b4af606902f6187dd9be62a43b1b529344f1114e69391d5f574ef7f013d4336801fed022178c3ed91d0b6d51325315fc1dcabf4770a2ea m = e07d685ed308e609c9c7842026e35732f6ffc6e2fee10f0afd348f2b42a8acb4 K = 6c4f4a231255a8cdfb7424c8dabf3a624cefaffd28964efe220ab6178fa6b324 r = c4de052e491a0c543dd18524ba681054c3a0dbbdb6697bd49e7202ac9f091b1b μ = 000000000000001068811668810600811668811668810600000000001068001068810600001068811668810600810600811668000000810600811668000000001068000000000000001068810600001068811668810600001068000000000000810600001068000000811668811668810600000000811668000000810600000000001068000000000000001068000000001068810600001068000000811668000000001068811668811668810600810600810600001068000000811668000000001068810600811668811668811668811668811668811668001068810600000000811668001068000000001068811668001068811668811668811668810600000000001068811668811668811668000000000000001068001068000000000000810600811668811668811668000000810600811668000000811668811668000000001068811668001068001068000000001068000000000000810600000000001068001068001068000000811668001068001068000000810600811668001068 A^T = c56413306889f2b876d8538db048081e25bc72a287de4b34b5cb5c723a97a750030e451e1c672a042289c0e72751b69cf4c0694f644d648c4c30953e973554365b0ad380b8cb400cd6988f66a87e46846482d6272000195f59ad3cc74793e15d66cc2e5b965508b52421c2b336742b1a85b2bffc6fa7d2cb72c9c10cd38bfaa54620d705fea7551238493bf4a396db545ef381552c13deca9a0ac5b0b3984b3e326c35b700d454ab9617210166902c162d29a00d547ab4ea12568cac910ea168bb363fb5d87032e04e15938373962efb6796a690bb2b1a9db4904ae6f415e5f419d04a80f0e7b13764857d7c09dbfab22d4bbb6e614e037a812f671911950a2dc9ce9db4bce2662dc3c064a3002a176a9bedc807a2f47746e299d9947aaf06ca3bf785dd445f704c0ff1f721290071aaa514317ac31bb7af8588a5e1e19e8fcc708742a5e892092114a570c91df2dc066b197c1f65b54c0557b19b71d386792b6998f5f3c5aa2983d8d62664a68351a11eabf4bbfd334724eb71d0b03c0d3228a95683ba10506b565be16143d468560bb908db63ce4683afc7556acfac9b48314e82914f5700776b6b9fc6745364e17d16611f94d76584422fd214c83ae8b481090dcab90d43a9a8555656a071cc15152f53793533cbb094044367f32257ab755d0452b150bf0a72cd8a89a414d7a1d0c281692426b6a0aa2605518ec26567469f54899d251bc3aaf3ccd0ca737db247b299be5fc07340183c3db1c9a83140cada9bb03c7705481788b2c91a37130b6b0cd5d5bb2a0a2fcbc88274426f883975b293178c03805b4920f3f4c4ad741a2d9c2c46914a97a66f9e62a46f58c43889b333392f715b0d81787b915692cc176977a5c04cfacc8070cdbfa20c5c020200b1a3030a55fc057ec39c5fe7d3a80ce640f63ccd00d2918b635dc906725db309dcbc644a1031e93c9438cb0b2a432f63c48b8f4a44d55888c3946f3dc61e6abc42e9ec9eb4c51bce055c437951df347bc216ae0fea2dc9a3334a514b4e4629d951801fc448f2d7ae28fc58667505213a62d154b36486360500493050744950010956bc2bc96a13352171d00a3fe74f1ab3b610a61a7948027988811aca8d299a7bf92c96ee11a201b29a04f1116639719a071bab4caed5a36bb18a155968c924fb64f6439ce993a88fc1a96be3cc2394755d675a8237ad7116460ccbc67508174d5970cc46c33ac4596b16a1bb28bc7fb11cb3a8b9fee6b03190cd5facb08a59b0bad85d320c4be707190d6306004ac9bfd57262d0bf50f7cff77b3a79f53f45dc03bfb7bdd6247d43cc23b8c2b7edd56d89e8568c67cc1d10725a56535e1b56c3215a1c85309bb4247b370c5d0c8f02d11a54f56115636157113b0548c2b224cc29ec408aba84e45ba815007eec1901a65c21927541fd6256d145cf7f0882b37b411d12a19bda49072bcd60f987258622bd3126558972f5332cd201a3d94531b062611df597f27a2c9e403f0ca2ac79bb1c37e013f5db5246766cb8d0a6b4139e2dfcb864db82fa96239c132ef01c0ec2d0ce3474a33c1b67ff1794df653c2cac2333b0257dc15f403b7b137cabc25c110b3999bc9a455e148c0d3946295a354542458881ba712867ca7172aa8b6a5085a967014df8c16efa03290dfb31db664f856504d52845ad4a011503c517f2714fe764bb6c72672bc5b9694fcc29a6aa2432ded26757b6a310b69755e2b348351c435857a86a2d40e9b0c3044cee11662bd30a4736ca99f6b54b544bad3a9bce499370e42953a68225aac71de23dbe5265028c05e89a0c9a7063ac6404dd8b668f62aa0d0881879c6b9bd7c968d498636991d5ab7ab5d9b6d82640c686b6bf00b434b5cad5384451f46615b3b9cd5ba872ec7f500b93ff321290c3a4e7d52e104188b6e24f1e090a479ca8fe36505f121b221925de060f9a5650a8246d513bb6825bc267066303a93b64869552886dfe6b455921489d916ac8d9870512abfc55ab346236bbd98625c79c6b3aab2b125ea1a4abe2ac8745b214238702e4db69fb4c3ac24267ecbaaa8d0a0d98e2b4a89aa24219ce0f04cc7f657bbcfb1a7db707fc129b009c324be18830d87dd50cbde3888f0cf4a7f8e5bdb7aa9fcaf9a717fb99e245bfe7b79aa7ab1a6242051342cc5f14b352eaaf19762abb5c6edcc0a590e148e2359ac606af67632dccd3bcd3462d2532ccba60670ad2485f7a415876344573be94d70e444949d4d3ca760a8e77283626022c4a5579419881224a82bb545cefaa877528cedbe20ac9c9385c2461165c31d4b24b57b2556000205ff4b54f7c5a53d818bdf1cb3eb88120c42c0e3271285592573628e89495750a7e1c371c8cc69490609b864ba66823388e99b7484100fbe28ac5da228bd7c6e482bafac77b902c450720197151678d089bd161ace5c3199234b0a8180ad6445ea1ca1aae932409f66ea1dcbad17a8c4a372ac4eaac9b0858aa2b629147b6c22717a2a3b5f87b7be2dc9bd1a64f0cf2b29e06b0c30b3daaa4cd74d4ce25db265db2a6a6e4c093571b492372130b448e67309a2b7b8e457f6b2099d70956ff378c5f6787bb5b5405b30033a6a519134d64f3cbd0633ba266858cecc7a98570e8c1babd6a478c3528c7c47ec5997c798777165041c5657845b954ab6cce74d9782aa894f56cb430d334c50cb27dd32865a0937d6844eb38219c89921d7b45ce9920a14c957f2b7e79ab7803e70f6b5191c44c642736b8d9408459884dc026cd73b96e43d598d9c1b8d18cac0cecb0b2cc9d94b3413f8269eb5072565ac86bb639f384b8b6b21401c416f0b11cc1e1612220244fd04f93fc44196b8d2aa07c01c1543864c9b40a933881b5e1a3cc566b848c176968b643c4803831016d6b6cb09b428a420c920ff82890151f3d87bada51a97d0875197a29aecc1c58896f46f405b492a91ad29fe77b09006a0bb5f6c101c46fc3036a89349f00b737475a3a25d28158456ee357528c9074126114c60aa7c6871bc174b95b1759d392b40e251b8dd0b042b82f5180460941273053916a2829a9b54ec57c6fb539c8b330b68fc58fda681a32a02e2dc41353b139db7663bc816262a07d95399b2ce53a5d55ae30dc436c789f19561ffaba899699cbcf5abdf9f948c45b7d369844ae7b5d9503579e4a1cd1fa21128b5b1d9906afdcb147552b459aaa1d85a23bdc09bfe4bb5c854406c255860a2ed3e7af4bf229edb7c8fbfa0f4b6054ed08c40b3c9098d9969da9a702a1a34cb03944713ba19ccd98f92b05d8249ea776a9e16753b95b04eb4eda568e8edb91f8a119f040867e5594210c87fa5c204b626a1d4554ffe57adcf9131b0108a41b8411f63198395a11f3367f144df80c99554c32b8da405d1934b4d74b74e53279029b9223ae1cd141ac23aff28067f717a026998393eaa1bf810c996869f4f05a4134b0d129032ccb593fa0cc83556a377971e1ab4159c972a1e697486bc8ba70be6b67600d3110c36108db7cc840221f034952adf0beca487c8962a5a3d20f6c80c4a96125fb922baae578faaa72f3c4aeaf7212b18b5ba4da6504a45ca73266dfdc13e103845b8c39c0d48579e27081bc9bbe5aaeac84a943c656e9c19b050b061531097f80597ca8a73eea54c5acae8f85a34bba4221f4c78b2a9690617d90e3b21e03be91e0921364b459378607fb8e756b13f4b1cfbdc1762907848c847fc4ba72b9d80fa8590a5425742e6b56585277ab3b17c271b4747b85ff41888cca88042300f46555a261c3c7708f2f60a8599b0b3bf2480bd1bc1d3b17923bc37f3601bf39483ea36bdd98366bcc5d60252a8eb219ec2acb42d1229ad38203329eeee6c08b448793163ac9ecabef22174c4bac344b631a5aac5d51bda04a1b746ca4c6e32ebdb81f834b349ae8c50f783257005ab4da78f4c574a3b7ce82d11cce69383f831bcaf118cf68a1ba882b92f25afcc728a4aac33f43089d4948c57662a4a52de4001123532e888652c67b316d29b1892222f1d61c83ba486e40cbeaf58d23b20f86d913dca14f54685d9e7ba921f0b5db7c8115606934e49b45760ede306c4a04750d696afb46ba973aa1fbc8a95822c6250b65b90431fca22a24421d5f3161b9ba16ab34a490ba539d367fb6853afae40c30ac026733069e6706263542501c8d6f01b7321b7d8516a0cd39338e060753b47feacb8c1826a8eada2e4bc7ad7e48b6b4f0580217a092f8017fa8655ac07964984b96b74437e68c144510754a5c4803a46a056cf7799340e20b36c0066b5128d7980f7c0c6806225e995bbb6b08a788055a287161b48469b3517dd770761e784c1cd78fae35a6c3d415bdb2888fdaa5a65a2f17c625c00b8e78771fa0b12fff731999f647f3db547f565431395ff9d69f9d325e45b246eab84ff2fc4b9daa2ff110120a91c579b8024d18573c2a7203e15b05f58bda674f9b378c6c75c1a7903d06b94152b45ac9b04c55bb18c30335f7eb819141110c0720db331d07c69e669b4b6e0b4a09785d404b44dcf02f399124f00132ac939375c9394035951d4c1ed17a06ec546ad3fb0dcf6bb447982cffa55b4b220dc1fc94687b5ee45cb8e57b93c5b506e902a49b7ac6d2521ed9198b2b22ccbaa573b41b86bf758f31c7ce8a3090c7424cab4c1fb305cb758ca95b7984e492b2c20c5ec712563fd23d4162125f1103d3002ee43541965b8cf277bd2176a437b52464b801c2e4c803725834e9a9f7d635bcf06972ca0a828c02ea8957863580e5a93614293233f107b919294c84388e411418b3a5b6ca3f87e89203ac246005554db475d8d12fda4079291a4182d24a02465dc2fa1f65085fdc14ad2c16180d921721890121b83bf449ae93acbd0a3593dfa318d3d840a1b01464f122fa7b46518682528bc381d55643891a970561026a34170b9d17352e2500442707922c81422e0486cb618309db60f9d25659258207ca0d4b6b46a985058fd48caba5650035ce41e2cb20a16e22788f70f7b460d9a05ce81d13b3258406830138b3eb01b2db9a6b9ea2bec2224dca4012b9b858dfd8002d366dbe852b1ea5461a509ee27919cb4574f62707c58160d6c255726b64bf66c4c1a371654556de16872dd66864849d5fe721bd3c04992024a4314961231e7871c53d40343070037529497465c7e9002b06077b15436cebdba1e0db742f2b040438ba0a08c96eabcd8352c04bfc536b80a4d5fc5393d44cac37c3454005b444577f206a253498098c1305c62ab38b3cb9a3c23f5aa769f5cb4a0acaaec745f07432ef90252572c61e10410b63641444073442466616303ef2c563f81c43632983428de9bcb92278066390c1caba63bb1661791341ea66b6add3343f16aef81131f35975e25b50c0e16b2b330962c218b3722201143e9692ce8c8717c6a89ede4777a281bffde0b5d33a2d1fb8cbd32c26600903a2b5a0d621af5adb8fa3f86334e4c5ca1ba2591c024938ac9d083732dc3a1726377cb9b88d5b200f6ba49f2414e754a11c105421919ca42cb59d483bc634993f9522573b9613e37ccde12edd3c885a8cbda8b56aa515c3a5a04cd91b0db2b77e6e43b5223b0391fb1c3b7055d3a58a9c46abae9a893f4368d0c77d8c8c7cf88b47905b9a5b979e10d19a65f01088ea3917238dd89296bab8430a9c5936902ec8c7caab65334b8c0f982108f8814b29b90d772a741dd48772d39eb551803c0cbd723395de3280c12466e58620adcb2269aa9c0474b04b143a9d0bc1c2c813fc32577a0137beec5f71665a03b2388cc09b8a41b8f6c9b9dc03510f903e6e5537596b8de7578fc9b63b3bb1c55572c737e7716cf50ad4663b55e5b9ba4067301254cedc0b77cacc90d73e225369709820549b952c3b7302966c5d30a632534c0ceb8968d69e0bcc0c3861cb0304337f1263371ab7abf7bc8d9194e67c1c1ff81e7fb622807197196263f802a21715385886c056960981403ebd61c13091b0828b1a19d377241a782c83408e9c38076a71b70262fa92ce1a8247cda79feee8ca5c692ff28085965849f060138ac678e7f20be52bc0ab43b9310a9d118150ef78845941ced1dbaf167818d52831884b3248830bf4da64c5aa010bc38135d77309c33d98c736bc804b95f83dca9b1f74741c8c6587893442b40474dd283663a2c3549c4749044df7897a987b5444a6b314ba7b4dd44783720b6f9112ec82b898664d67614c0714acea620d2143bd9fb71a62ab0395b3573de70fce8271079100f0d63d82297319098ee7172c4dd54ac2698681ab29f8e73c39e1014d936c2fdbbf603728011808800552510a995002052072679e352f756a18a3ea1d642a3d49bac57784ae3ec13e28d98c3cfb59cf44b3f1b3477f4097aba8939478828dd729c810b89149cd1ea063aaa4b94fda368ef7489d140383c7781e385118039f169079929aa7ff2c25ff8a4e7a3aa4f0984cd5ab1dbbb52b09d256dbf37a00f000be329ee0742f97478de3e7935eb65f4777764f85b28e69b9cf2b38a1077a4058c84db8a4dcb6a07c29ac74fc7e6fb88b34c2c43dd282ac4b505bdabcf1910e8aa8933689a5e9583b01d151e0b2605c50859339525b630aab2c63ead3bb73a44027a2522bea6852d35ebc12acfd0a53b0026b7e07bb9d2a34a6a846ea60385cb88e85ebaae67cbe5a501b245709cb97398fda5f976232f8f71ee24a59d31c5a35a466e4da3ed1b9c76cf2c263754c8d96b7d8c6749f769fc8488949732016e29479ba2d07607450e4b7e2cb596687a9d01cb3c5130bdb8859c23231d8146163717721033b1e737cbb2070dd28a4573552e917689f4427d733717af46d3281a42899a438116ae08816cd5c2c969498ca9435da385d007c23a9d219e4689c01b647fd7883defa9e356807fd928a4a880d907442aee5cd944cc4c022478ac4a7aee8ac96b4a84a851b67bbb7fc5831c866178d2a0dc33196bd068618c7689ac3351e0242f16574a5472b56591572b432b46506ae99adc5da8b5273606c0a17da59443846cf96a904ee74336a260180e5a5745465f483a6deb88276a183d16bbcec2c19c56771691804aa49250fac93e8227e8f9404ad57940d680666c9a3a2b03918c70ca83c2e14836fe8bc0ebdf1c1edabafecaa5559a22988acc0c914b2cd62bcf3b87e8f407cd4e10ee9a88be5e48068d508d04b8fbdb584fe14c4cfa05709a8298398ba4b527dbce5776c131572cc8c13b882ef2562e711a65fca022703206c5c7c3db114ce29a2b7a98bc81471c27c2581da29f738005df265c632ca2c1b5d96503aa90080c898a560467dde585c778481ef096a804396474a067ef33a37dc2af39c9984dbc8dbb36d027202bb272e539963af74c5e35bc69a727843d546269cadd55c15c1667a4f645523c44c29610bbbec135ada176b257e8a030c57925a0764339c68014acc77c3e0b108fb0034763ca866b3a8e3acb70540420b9ced65c8a9d97614648ce71838cdc08931a91804e97268a5b42675c2f82a2d800998f25a2940fcc02126188559879661b6c3a3329c1b3c86e62e0f9264830b98b4c245c077662cd51fa0258048e89d5026c60299b8e0e38c91601f48da72e73684ebf4265b73541fd2869d941673bb4e2bb4afe96a4fbe4c6a2cb53bcf30b628c891d7d563cf9072e22430197c5947d81851190129762f5dec5ecf3c23e486417a704ba35a6bd29579cb54ca76390d7f035ac6225a2edb9b1ecc7c3c189c6b38c875d031680c40887595ab83c65cda6df64b76e3958cfec03c86926d744c723221267ae97304b309c1903e6c6294159373e73196295025d5aa4105037f93136b2b797fa19594cd995d3e29852804975124c043c48c2fe369f167a7b66b2b52591101ca06828108d48c0054c6cda3c5ab8b750f1b3b674161230925628b73530f0ba3f82b41b997bba942567afcab8c8889bcd48f66915b186c21910752cc6a2e944ba00c59771aa37e72fb812787886b2802dff40867982527a1836e90485c2772d1a44cc854cefab27db9da9ccee173a4f1c2b1e7b6df2424d25184ad1c9baca2489a628cfa243a9f73a8f885be0a7a5b83c7a5b499c725e79bdf8aa1a883b51efb42164a4e907828f4faa00e91b7f35575e5b6444c7599a0b84627603c7fe15e4a403ada302eb0c1b6c377801e108d15ab30f6a731f5dbca7db22e66c288b2c6ae8a8681e0a738c27a8bf2e18d1c39c404c5b7c42a4cad87a76930259df13463e51c21b18026c11b18382a6216136a609510a37707717dbcd69ad3e5148b35552869858b197cd27cb3669542c2545f05c68e6a226549f37706ec22211b382d5c8d47fb78866222f7d8553fd4514e7b1c3ce180108094651a0391e1829977ce59b41eb42b82a3a9aeb6760cd3a38ed134123b6c15c4678847128558ec82cde831d6d78f1a20a83f301cfb93ca1cb41345f27991384169a6b9838578c0a35636a43319fbcd0a19a3dca76d9e33953dc8719a1254a3c39aadd525a967942b589705934750850c31a3cc63199e1d64c94c088c3c30ce657460c98a33731c8e92982568d32f4ce356e3fb4e4d7b94e206bbad17b9e09413301a4abd0175766116933373a5751f8c41c15df375337839ac85c6269b54adf8b97e46c7266c0e54b20647ac16ad7423c808a4 r = 0000d0000000000dd0000d000100000010000110000000d00010000000d0ff1c00011000000dd0021000000000011000010000fffccf0010000000d0011000010000000d00000000010000000000000000000dd0010000010000000dd00000d00110000000d00010000000d00200d0001000000000000000002d0000f0cf0110000000000020000000d0010000000000000d000000000000d002f0cf0100d000000000000000000000f0cfff1c0001000000200001000000100000100000fdcf0110000100d000f0cf000dd001f0cf00f0cf011000001d00000d000100d00110000200d00000d0000000ff0c00000dd0ff1c00002d00001d00001d000100d0000d00001d000000000000000000d0000000002d00020000000dd0010000000000000000001000000000010000010000000dd00000d00010000000000010000100000110000000d0010000000000ff0c000100d0001d00001000000000001000000000000dd00000d0020000000d00001000000d000000d000f0cf0110000000d00100d0ff1c000100000110000010000100d0000d00ff0cd00000d000f0cf001000000dd002f0cf001d00000d00000dd00100d0001000000dd0000dd00010000000d0001d0001000000fdcf000dd0002d00000d000000000000d00100d0000000020000000000000000021000000000ff0c00000d0000100000f0cf021000000000001000000dd0001d000100d00100d0000000000d000010000000000100000010000000d0000000000d000200d0010000010000010000000dd000f0cf000d0001100000f0cf0100000000000000d0011000001d000010000000d00000d00100000010000000d0000000011000010000000dd00000d0000dd00110000100000100000010000000d0002000000d00ff0cd0000d00000d000000d0001000000d000110000100d0001d000000000200000000d0000d00000dd00000d00000d0ff0cd0010000001000001d00ff0c00000d000100d0011000002d00002000011000000000001d000000d00010000000000000d00100000000000100000100d0000dd00200000000000000000000000000000000000100000000000200d0002d000000d0001d000000d0001000000000001d00010000002d00001000000000ff0cd0000dd000f0cf0110000000d0000dd0001000011000001d000110000110000010000000000000d00100d001000001000000000000fdcf010000000dd00000d0000000000d00010000000000ff1c00002000011000010000000dd000000001100000100000f0cf000d000100d000100000fdcf00f0cf0100d00000d00110000000d0000d000110000100d0001d00020000000dd00000d00110000100000010000200d0001d000120000110000110000100000100d0010000002000000d00000000ff2c000110000110000000d00000000000000000d0010000020000010000000d00001000001d00010000010000000d00001d00010000000d00000000001d000120000000d0ff0cd0ff1c00000d00010000000dd00000000100d00100d0000dd0020000001000001000001d000200000100000100d0000d0001f0cf000000001000020000ff0cd0010000011000000dd00000d0000dd0001d000100000100000100000000d0002d00020000000dd00020000100000000d00000000000000010000010000000000100d0000d00001d000000000000d000100000f0cf001d000100d0011000010000021000000d0001f0cf00fdcfff0cd000000001000000000000000000fdcf0000000000d0002d000100d0000dd0ff0cd0001000010000012000001000000d00001d000000d0000dd0000000001000012000000d000010000200d0010000011000000dd0001000000dd000f0cf0100d00000d00000000100000000d0022000001d00001000000dd00000000000d00100d000f0cf0000d0000000000000002000ff0c000010000000d0000d000000d0011000012000001d00020000020000000dd0000000000dd00000000210000110000100d00100000000000100d00010000000000000d00100000100d0010000001000000dd00010000000d001000000fdcf0100d00100000000d00020000000d0000dd0011000011000001000 NTT(r) = c80597253b4fcb1072ee943433999005eaadbef4569377954bd90854e462752276f3b88f0d038da5bb2b136a4617141142c1b8da002fdd0c5d72f1343e25c83f82021a41363372893e1457478a54ff423636c6505e973de9f56da8a967956533c566152b99cc1dc5c4d09a43e476c6a6e58e3482c2a089c80296a209299ea2c47383e8c93f9c07c465b325cc0651b928dba28e6d085a272c31e80417085b1f4694040f1212ea83ab97eac6b7d724cc3b2a22186a92a2c014ac7e9aa34cbc515831d5b9bd77b9836725696c41447b3e69588ee29b06dc74bea1342ce348987f99b8c206b90cb339f86c88d636968d91a7eb29429586331ebb71e3003ac39a34b860cc312c0d16d5b648669315aaa37bb21113305bafd247c4bb3714e109dc1549e597b6fa0319aa6a1a4fd32d88322f2a98cbefa73efb36212bf4b2df5c8e317b0045650d9fd1abeac6ac18648c90eb47da61cee841c312a9822d9b4bce6b453a185a20d139e736545d67305e3a6ee5e94f20f2074d1040d935c17aba766c3a144bc516fd3555078803d2b944ce8365dc161768d80e5a371270e26d9fccca455ccf94d25b345059cbdc4f1eda8728c43a1f58a358d5b156b5c7385a7cfa2699ab946b4ca24c18f41c1ec336d4685fb4f0b058a8a1b74727829722e9aa08274c2c18465581409442099a24b4a80ee92551c8cabc3389e87207acb8c7489912858176a045c009f911b42aa69f156eb873768a16b5dad41248ebc2200425d8a96cd295bc49226ff3e5187b2508cfc38f00b0020334a845ac005ae17413474c8f843fe989c511dc5d967230a151b591332803492692a1c74f794742d3a3491c0d542166c28b7430f96d9a565f1ec717f5b1ac4cf72d9ce59c85851cfcf97beaf4985c203db137ac3e4189f1fac57c207bf3d60660957ddc926c5495712c0576a9741845627925e617fd7610ee520e0ba7428c9943178a00e402b043353ab2d85f9c90103a6152130443ced2b324507cac8b0b0627ad9534465a951a3a45b1c5539f03855fbf07659af65dfac216cd70b84f762a983796ec1cbc7eb261a766624466148e89792d1b4a5d845a22616a235c2037ba870a75c4f2c6733cdc91bce55e3e53a59580be8c4c346caa319807ab327a5d76557ed1a63848435210611ba8dc3d4d9100ebd036137315ec838ea014a71d45cb2d49243122185df0644cf9cce15767ce4c1a2647277fb1b5334acb7df103ddb683af9c0adf785bc527a73e830872eb85f7733a3e566194f9533b5c56e2eb4568379ff4097d9220acc0749d253a34cd0359de4559e453a39ea49371b41886095303a0c5dc186032d3ca9051a6c0f659788572b55c8f59355b2bc182f4c88dbba23166c5aea0e783392b3fda07875c62a9e30ac5c9a9332ac4a6a82628f8c913769652a942466f383037561b3f7a62978322e4ab6a6bfbbeb2800fc58c924feb9c8c51633060404fa22782b08cd740912f1012576109a7c9bfdc7b068bf205e350bf74791bea8ab9b4829bc5d20d17ebab3eb7bea39247c5d2165faa1491b2866290c236301103a8027aa96688a31b755125c0d0bd2a57cbedacbb7a491cfe3a232239bf8f4488c2a64be619a0a9e69b135400328c44c98731cbcc8f42615c423859832707b403593457581b7b75ab6629a2fc2ebe009eb5845f6fb4c3db6b12c2d814dce7c1f0d801d7839cbab404a4933299672082a1c5b55951b224afd7c75a05d7a9de50240934ba86823f4cb36ce1751e06a53a9ef736a00cba1e24bd200ac3a79585f2740a43d3544e6574cde57784b98465b7c35120c336604c114aab833ac9e77941927cc8e6279ccf8a9a3bb01cec8c9701a6ae4d35ca7808742f160ed1eb0a56cb12d7996c9559c7bf2a22599493fdab3df4fa4499db7022e7cdceb7c29c14356088334281a00e8c4e98348d4ec09d5fb89d7c25a4a4392d7c9ac05356043f8686a4f9b022d058acb6712260543d626f9c3b74bfcc680bd542a8c95d4a0376fcc346bb9b02221c0c7da8a43be21b588118fac6a863e8a94e15869373797085a326627c4e186d6896b7c76ba48ee50203362e66812cebaca924b113b288ae861000d4542235292781f50df867a626993598b6922e5a3b9910c6360a184477179b1645c55c62a6d94bc91b8e e1 = 0010000100d0001000000d000100d0000dd0010000000000011000011000000dd0000d00000dd000f0cf000d000220000220000100d0000d00000d000100d00000000110000000d0001d00001d00022000001d00001000000d000100000000d00000000010000000d00110000210000100000100d00000d0001d000000000000000200000000d000000000000000f0cf00000000200001f0cf000d00011000010000000dd0000dd0000dd0000000001d000000000100000100d0000000010000000d00000dd000f0cf010000010000000dd00000d00010000200d0001d0000f0cf00100000f0cf000d00000d00000d00000d00001000000000000000001d0000000000fdcf0000000010000010000000d00000d0001000000000000000000d00001d00011000001000000000000d00000d00001d00010000001d00001000000d00000dd0021000001000000d00000000000000012000001000ff0c00010000ff2c00ff1c00ff1c00002d00000000001000000000000d0000100000f0cf000d00002d00000000001d0000fdcf001000000d00000d000000d0001d00002d00ff0cd00000000000000110000100d00100000000d00000d0ff0c000110000000000100000100d0011000000d000000d00200d0000d00002d00000000012000001000011000ff0c00001000000000ff0cd0001000000d00010000011000001000ff0cd00100d00020000000d00000d00100d000fdcf0000000010000100d00200d0001d00021000020000010000010000000d0001100000100000000000fdcfff0c00000d00ff1c00001000000d00000d00010000001d0001f0cf00fdcf000000000d0000fdcf010000000000021000000dd0001d00001000001000010000000dd0002000000d00001d000200000200000000d0000dd0000d000110000100000000d00000d0001d00000d00010000000dd0fffccf0000000000d0001000000dd00120000100d0001d00000000001000000dd0020000011000ff0c00010000000000001000000d00001d00010000001000ff0c00001d00000000000dd0000d000100d00100000100d0001d00000000000d000200d0fffccf0100d0000d00001000001d00001000000d00000000000000000d000100000000d000000000200000100000fdcf0000d00000000000d000f0cf000dd0000d000000d0ff0cd0000dd0000000000d000000d00110000000000000000000000000000000d00000000000d00000d0000000ff1c000000000000d0ff0c00001000ff1c00001000ff0c000100d00000d0000d0000fdcf010000000d00000000000d00000000000d00000d00fffccf001d00011000000d000100d000f0cf0010000100d0010000000000000dd00000d00000d0011000021000000dd0001d00000d00010000010000ff0c00002000001000010000010000002000000dd0000d00001000000d0000100001000001f0cf0000d0000d00000000000d00ff0c00011000000d000000d001f0cf011000001d00ff0c000000d0000dd00010000200000000d00100d0ff0c00000000000000022000001000000000001d00011000001d00001d00ff2c000000d0000dd00100d00000000200d0000d00000000000dd0001000000d0001f0cf000d000000000100d0000d00000dd00000000000d0011000000000000dd0000dd0010000ff1c00000000000d000110000110000000d00000d00100000120000100d00100d000fdcf000000000000ff0c00000000010000001d00000000000000ff0cd0000000000000001d00010000000d000000d0000d000000000000d00110000100000110000100d0000000012000011000000d00000000000000000d000200000100d00000d001100001000000f0cf000d000200000000d0000d00000000000dd00000d002000001f0cf0010000000d0011000ff0c00000000002000000d000000d0000000000000020000001000010000010000020000000d0001100001f0cf001d0000fdcf0100d00000000000d0ff0cd00000000020000100000000d0000d0000100000000000f0cf002d00000000010000000000002000000000010000000d000110000200000000d00100d0000d00001d00001d00000000001000010000010000ff0c00 e2 = 0000d0000d00002d00002d00ff0cd0000000000000000000001d00000d000000d00010000100000000d00110000120000000d00010000100d00000000200d00000000010000010000200d00100000010000100000000d00020000000d0ff1c000000000000000000d0000d0001000001f0cf0000d0002d00000000001d000200d0000d0000f0cf0020000110000000d0001000ff1c000200d0000000000dd0000000ff0cd001f0cf000dd00100d001100000f0cf012000000000011000001d00000d000100d0001000ff2c00001000001000000dd00110000200d0000d000100d0000d000000d0002000000d00001d000100d0000d00001d000100d0010000002d00001000001000002d00000000001000010000000d00ff0c00001000011000000000000d000100d0010000010000ff0c00011000000000010000000dd00100000000d0001000000d000000d0000d00002000011000000d000000d0ff0cd00200000000d00100000000d0000d000110000100d00000d00000d00100000200d0 u = fc284d386c41241a4d0b939fd853139b315b472cc628053617576deb2b5dccc65f944ca4edf032920ac9350c8f187930532bc6088b20e2b6207836543b39b8e909072da4c73e396452d06cb4710ada9949fc27900d033e5a69916bc4381adb835995b32f73646eeb3b09067a32488db7d6c6c92445f83723288a85827c7b82b777469275eaa828529733d4ea3333a117bf40b11cf45409649e8438aff503661abab8d48106011903aa7a90b2a33e2e2044d2ca190ad16033d83fef88723d4b7d06473984e476f7e952cc01b822d49605f72ee98786c1607e2367554dc638d2e7b776099807224c2331c2b37a1a3f06781e50bb9d42748a44c086b069dce09f3de3ad71845c15970b18709e4be0191368cbf3753e4e1500c2878fdd1a5b6475b5855563568a3767c48bf82650789b1fa8629f329a3b44c81415d8b805a7334820a0e98997cca46580d3b722033bd16ac8aa829f34b84258722cfa1b0e9237a7a19b0dc8eba8a46a4c5340adbd08393c296b690006744a9356120b28332e9df240c1b49856bc8c3000a617ca9b3f450eda9aa84b274c5f6829f7eb2eeab397acd73216b8b7097a8645284ad3520deb072dd0b09e2b398156e647953b11beab92cffba01989a6d3358d93d12e591abf47923cc3874cc6bb1385a90b46837caa46c326764c0cec72a80a578956b640cb23bfdb62e8392d5d9c026f9bb48eec47dfb7863c65caeea746838572304582b78c11c75832fbe891bcac5751e71acc917d77918e8c374c8552c14c9bae6982bad2ab3edcec97f26bbcd0869c0240b2df5677af063f64b168f78a7515d12dee407912cc9a2f58ad65195f1eb5a97f9835e9aa639c071c36c234ea96b1ebc07c4a9b43cc2309d3e72d99f18d50a2696e5c8eb30a59b2fa4c4cc587d8db21096b66bd1b55c7997717298fd5a17160f5ac33524dd0c40a8818bbca080c93eab466557c91bbb7bdf8c7cf1c7a5aa4899533ad0ee752086b67b7b87c95416fbb01b6a2fa67a9fc78345ca31041a3ba2157b7bbaad738a4368c8fa7a02a0b3725c2c9292d7760abb66db569c28051980ef284fcd5b392615ac84b33d4f23b2340a30afaacce322a90d6c6e492aa18e9cd3492ab40ab2fd2798674744afaa043230711c4c01df4f605d51000990411b908470f05b799530a3545ad35582399ba630aeb4e319244deac6dda9647883567903085f33a1877f895a26479e0404ee0912d1ec3972e5b01d2d01960d57e459352dc2410baa818fe9c180b4b8fde8413822a79bf2834eb79052795bb40794ac08b18bda99552e431c6f726e22a88004b7e33c2a385c659c4614d0e094a09205c9aea0ab9d3516f64149369621947a71150470e592fd99b5a6eb54d694669125423cb3c2391d21f32cc864cc31760bc3429962fb7e9cc3d743e25322cf720c67d9c01d1f5c4da1205fb95c74159a0a4b7c2d1160476e2c68a966b04a331eca66cebf51d4b6079b168a98e308844b066bf82ba0a227d543a12f4d76f04da2b6832013a7010215128c06681fa63acc37bcf6a184daee07a81e6cc765a65411600938a3c869505cc491a29da71b5b78ad9b2add3a79f80bb31554a2530953d83fa4c258c09a24aadd1133424e4b56eaa3473581abbe9c12d221b1683c9ee095a86f151aa1c2dc615994df45b87f9b28d5658a0f722665810fbd7a8ad72a39611ca5f36cf69399462964ea242346e6a917beb251691764721c8dc8a4a0b896464c7b6d905241805a789026e1eeb988a8c9ac95b590bb9be88521c5a5b516b963ea68512879a40e0d83b96ab3e86832a88e0518594136aca131351b8c9e085ecb873d88b36103bba25acc4ebe530392b32dd929c7f018b508cb085684bd359008c70774fa63f47b6c5714a04f67711e5f4260b3458a4b7817b4aa0971b463bd238aae647bc2121878908ee73c449f575a2919bb781add91352002323165087e4c7a09508768e335e59a37450778f3418bccdf79bd92333ed7b6ab8b2b7f6eb25cb16a364db7c2e85aeb0a61b6ef924a21120c0252a2002973e5b9e5e193e78281135ab07e3a77632dca168f245f00088dc840ceef86afc287cf4a1c8a51154c7b12dd044b75d0cc945aa7aa7118f9af416ed979ed60544b7e564e979c014f5a2fc60811174657af917 u[0] = {2300, 1234, 3128, 1046, 2596, 1233, 779, 2553, 984, 309, 411, 1459, 3143, 3170, 1320, 864, 1815, 1749, 3051, 1490, 1740, 1532, 3220, 2628, 237, 815, 2706, 3216, 3125, 2288, 2328, 775, 2899, 3170, 2824, 520, 1762, 523, 1656, 1347, 2363, 2947, 2537, 112, 1069, 3194, 2366, 1603, 82, 1741, 436, 167, 2522, 1177, 2044, 2306, 781, 992, 2394, 2326, 1131, 908, 2842, 2109, 1369, 2873, 815, 1607, 2926, 958, 1545, 1952, 2098, 2260, 1719, 3181, 1225, 1106, 2040, 563, 2600, 2136, 3202, 1975, 1922, 1915, 582, 1881, 2282, 650, 1874, 825, 2772, 830, 307, 378, 191, 2836, 1052, 1359, 1033, 2534, 2180, 2803, 1013, 1632, 2586, 2955, 468, 104, 2305, 49, 2730, 2311, 946, 1002, 46, 1090, 2770, 412, 266, 1549, 2099, 1021, 2287, 1832, 2877, 2004, 1798, 916, 1156, 1902, 2551, 1326, 460, 2944, 1058, 2413, 1797, 751, 2025, 2152, 193, 2022, 1827, 1366, 1613, 908, 2002, 2942, 2422, 2432, 519, 1218, 291, 3107, 2739, 423, 1599, 1920, 30, 2997, 669, 1860, 1162, 3076, 134, 1691, 220, 2558, 829, 2782, 1137, 1480, 1813, 185, 24, 2535, 75, 414, 2067, 3254, 1523, 999, 1358, 1, 1986, 2296, 2781, 1457, 1380, 2903, 1413, 1589, 2646, 888, 1127, 2236, 1784, 1282, 2936, 505, 680, 2550, 2610, 953, 2116, 332, 2069, 2957, 1797, 826, 72, 2562, 2537, 2424, 1228, 1626, 896, 2941, 802, 944, 2769, 3206, 682, 2552, 2100, 1067, 600, 711, 3066, 225, 1938, 2675, 2977, 217, 3016, 2702, 2724, 1222, 83, 2772, 2237, 912, 2364, 1714, 105, 96, 2676, 2356, 598, 177, 808, 739, 669, 1039} compress(u[0]) = {1415, 759, 1924, 643, 1597, 759, 479, 1571, 605, 190, 253, 898, 1934, 1950, 812, 532, 1117, 1076, 1877, 917, 1070, 942, 1981, 1617, 146, 501, 1665, 1978, 1922, 1408, 1432, 477, 1783, 1950, 1737, 320, 1084, 322, 1019, 829, 1454, 1813, 1561, 69, 658, 1965, 1456, 986, 50, 1071, 268, 103, 1552, 724, 1257, 1419, 480, 610, 1473, 1431, 696, 559, 1748, 1297, 842, 1767, 501, 989, 1800, 589, 950, 1201, 1291, 1390, 1058, 1957, 754, 680, 1255, 346, 1600, 1314, 1970, 1215, 1182, 1178, 358, 1157, 1404, 400, 1153, 508, 1705, 511, 189, 233, 118, 1745, 647, 836, 636, 1559, 1341, 1724, 623, 1004, 1591, 1818, 288, 64, 1418, 30, 1679, 1422, 582, 616, 28, 671, 1704, 253, 164, 953, 1291, 628, 1407, 1127, 1770, 1233, 1106, 564, 711, 1170, 1569, 816, 283, 1811, 651, 1484, 1106, 462, 1246, 1324, 119, 1244, 1124, 840, 992, 559, 1232, 1810, 1490, 1496, 319, 749, 179, 1911, 1685, 260, 984, 1181, 18, 1844, 412, 1144, 715, 1892, 82, 1040, 135, 1574, 510, 1711, 699, 910, 1115, 114, 15, 1560, 46, 255, 1272, 2002, 937, 615, 835, 1, 1222, 1412, 1711, 896, 849, 1786, 869, 978, 1628, 546, 693, 1376, 1098, 789, 1806, 311, 418, 1569, 1606, 586, 1302, 204, 1273, 1819, 1106, 508, 44, 1576, 1561, 1491, 755, 1000, 551, 1809, 493, 581, 1703, 1972, 420, 1570, 1292, 656, 369, 437, 1886, 138, 1192, 1646, 1831, 133, 1855, 1662, 1676, 752, 51, 1705, 1376, 561, 1454, 1054, 65, 59, 1646, 1449, 368, 109, 497, 455, 412, 639} c1 = 87bd17e107d5e37b7d67c45df2453f04e778cfb38c425da461d52be742d7f53eca92a84fa0752f78c062b63bf7f67cb281c243a1ecaf67aead78868b20a9d6c3567b32782143ce00616aa573b1e01153702f8bab17513ba24a3b777dba87f026d92e960b75ab084b2f2f549d532b4016a9ec7fe9494d9aa5907c854c20f993eafff4221d7688f6a188c6a70bf794d76f62df8d350e122028d6038f76ac91d0c4814fa1ba1fa4c8dd42e9f4d733aa3b9a52a4d1b1241962986d64e28b62ae149de34d96de819b64441af85e044d894b17bb3f69d72cee5e698260af9312a03967f0b82cb24b01828730b17f5ebd2bc76d510e0fc0b00bfe814fe9a7ee4c430b803109fb6ac0454ddf65931e9745542bb02ab1620ebf8968426c6425599419f9dcb814f9c302146778baf342df8922de9e229d9af6a4113143211597da785d11a874f3c90bf1733f331a5e3348355863e45a0f0661076e4e2d5cda109fe370e64fedfaeee5d3ea0131d7b8bf3a6344abf7dcc77699f4325c6f0e9aaa8b4bfae413e22c5ea945b5d59b417c733780d03069f169be61813c15391f2dd1619cd93357ceadf8688e97b37e162a19335e3e17c676e540a0646a50f0c88357dad7e868ac1570e0ec068bce9b87e1de6c3e03098f77ee87854d97e20cf9e1bc15d9ce1833814a9f15667d8f61396bfdaf0132211ba1e639f65a4a7735e6edf3b6355f586e7434a5ffba59f7790c091c806debd0921d64d3360cf8eb42aa6238924865dbe79b50552317752633b44e1f64ebeab992225c395010a91d0966ca3b5356d2023489c38fbab20582a6cf6ba5d946e97a090da7496f8ab2e197f3a2113893980d6c48bcf834536b255ff6520350638e563b049ade5243a6c7210e56d8873f96ad5a2a8d527d4598255b7f5d5d663e8e18917f2ffa7fca37a5e0917c8a2343446b3587345ca13c78c29e813455744b8037a3c6da691087f9cd3b3bb64b948eba4eddf7d0dbcff1d31b2759e0c82d36b56e3ea3c0d21fe7d19855ff5632cdeeea2c78a5bdea96263445c653e4a12447d4c1200240ad537875571d4bf88dcc40b35437942b85aedeb211969551a9ff863704d6d9f097858ff2da1d3525aeb656a908819d0438ebb16eb81b10087f3c0d9c036a59bf3ee15579f85f1ecb16ecbf807167548635401ab6c1ca6c1edb6eed3c1efe0d2eaad683ccbfc89aa7c4dea656983cc0b959445f92c596011667e83528a964ba4a067991e745372bc05792958ed2f776b57ec98f8181e2caf7b542999c04dea5075247e70fa43ceae837fc9b3a9354668309cfbffe0194937c7064e03ad6c756c5b3e4bb0c514018d31b7084db418f105b48ba93b86095591df4157aaa82f9c186e54181e6966751ce26a6f8357b61000944218bc69c309f720a35cff5dfd27bad2197000c3f9ccb97bd00049a4a66bbc18105026430fab2aac0713534473cf1f46cf92d31f3129eeb95772f2c3ad5590210a3fcbd6603cd7420fca5fb5516629edf73d86ef03899f279d3b8f1962a71dc0d3702cb164bacac3414e9f4736992ac8fe2afeffeca9d6dfb0af61901adf9b210afcb2a1e990cd9bbba5b90ed1e230f9e39b1888ccd8fd9e1b5c37bfbf802fd6d90adfa632ec26f90cd0f4d7ab3859ef964d726851c4d2b120d154c86ac60a05918a9b0381f4cdad739261d43ce4e79de1f4fbaf09cbb3dc329303bb03af964fbd45c0b1e801530293e39754ff36c5681395931b0bff4896cb3ece79c531c72597de5451a1c56448cc25d2aacc9f1404b6440f6eb10567b0965d8d18a0368ba4d1723359130fadc83f80848c23274e7cdfcaf97ee63750cb206e25caf8b0b8b2cf066c2ccd61d844873d912109e28ee334f71eeba2d3cdc31d93415e55e82362119f81cef055694d869bff6e0d70e1ed69834b9fd40768611e1d88be19bd77d946f4910c0564b1ce0ccf0e53a45b8f065d8ec2023f226f20928f351971d v = {3140, 2643, 696, 1180, 1041, 1979, 937, 1228, 1509, 1181, 1021, 3121, 2142, 2953, 1964, 1338, 67, 150, 2865, 351, 3012, 955, 2488, 2764, 1458, 1273, 47, 1172, 1202, 127, 2517, 2658, 2137, 1051, 1530, 2547, 3004, 3328, 2149, 1297, 160, 901, 2899, 781, 1405, 898, 2063, 158, 2291, 3174, 1510, 2155, 344, 2369, 910, 75, 652, 1804, 2124, 892, 2489, 2304, 225, 1003, 1147, 159, 1578, 3156, 386, 2410, 2729, 432, 2584, 2906, 2270, 844, 2282, 266, 499, 1754, 192, 2187, 2541, 1633, 3166, 1371, 3207, 381, 44, 488, 1355, 2634, 1769, 1652, 3, 2363, 127, 133, 556, 1377, 3023, 2319, 2024, 310, 1273, 1830, 2213, 2651, 2664, 1193, 2336, 573, 2785, 2742, 5, 763, 3113, 2766, 2014, 2946, 2489, 1601, 2633, 2665, 2244, 2607, 2519, 1479, 3230, 2483, 1867, 3147, 1413, 1201, 3153, 2431, 2154, 3127, 289, 2737, 1800, 80, 2895, 181, 1116, 2034, 2725, 2339, 498, 1938, 1526, 1543, 75, 2311, 2725, 1994, 2413, 1552, 2796, 3162, 759, 1332, 2003, 1512, 2319, 3079, 415, 2480, 1577, 2472, 2477, 10, 942, 278, 460, 654, 3050, 729, 2510, 439, 491, 1648, 1986, 3140, 3115, 1436, 2832, 2642, 2804, 1615, 1638, 2810, 682, 2060, 1911, 473, 2078, 995, 55, 787, 728, 188, 1157, 1722, 2421, 1375, 1534, 2048, 1008, 542, 1997, 2048, 1255, 2396, 1850, 190, 479, 2421, 2660, 1312, 3093, 46, 2830, 2847, 2391, 1432, 593, 2649, 18, 2712, 1482, 957, 1922, 1186, 1411, 276, 773, 1883, 336, 744, 164, 2058, 1259, 658, 2637, 307, 153, 1767, 975, 2870, 2210, 800, 448, 2174, 2212, 1494} = 443ca5b8c24911b47ba9c34ce5d549fd13c35e98b8aca75343600931fb15c4bb3bb8c9acb2954f2f4049b2f407d529a659b841fa359fbc0bd0651851a0503853db307d25380fe809f368c6e6b5865811948eb3048cc2704cc837b90990e1b03e7bf4092a46c582a196a90a1b18aab5dec834eaa810f3a16dc0b088ed19665ebc5587dc172c801e4ba5a4e9466703b0937f50082c1256cffb90e86713f96472a5b8a5689a4a20d923e16aab05b02f29ecacde27b8b91964499aa6c4f8a2d7795c9e3c9b4bb7c485154b51fc976a78c32111ab0807054f5b0b5c247fa53a92f22179f675604b7090a5aa7c6d0961ecaac5f74253d3875e0f79c09f019b29869aada900ae6311cce128ea9b2dce791beb0167c247c42bcc59102ba5f4fa6466a6afaac28077971d1e383e373031d8c20b85a46b75f955fe0580f0e321cd0780e7c4953ae70bdf5197640a5215ec020efbb15789595192a51280a9cad53b82274a83451105b37550812ea4a080eb24294d3a1399706ecf63b3a20832c0e187a4685d compress(v) = {30, 25, 7, 11, 10, 19, 9, 12, 15, 11, 10, 30, 21, 28, 19, 13, 1, 1, 28, 3, 29, 9, 24, 27, 14, 12, 0, 11, 12, 1, 24, 26, 21, 10, 15, 24, 29, 0, 21, 12, 2, 9, 28, 8, 14, 9, 20, 2, 22, 31, 15, 21, 3, 23, 9, 1, 6, 17, 20, 9, 24, 22, 2, 10, 11, 2, 15, 30, 4, 23, 26, 4, 25, 28, 22, 8, 22, 3, 5, 17, 2, 21, 24, 16, 30, 13, 31, 4, 0, 5, 13, 25, 17, 16, 0, 23, 1, 1, 5, 13, 29, 22, 19, 3, 12, 18, 21, 25, 26, 11, 22, 6, 27, 26, 0, 7, 30, 27, 19, 28, 24, 15, 25, 26, 22, 25, 24, 14, 31, 24, 18, 30, 14, 12, 30, 23, 21, 30, 3, 26, 17, 1, 28, 2, 11, 20, 26, 22, 5, 19, 15, 15, 1, 22, 26, 19, 23, 15, 27, 30, 7, 13, 19, 15, 22, 30, 4, 24, 15, 24, 24, 0, 9, 3, 4, 6, 29, 7, 24, 4, 5, 16, 19, 30, 30, 14, 27, 25, 27, 16, 16, 27, 7, 20, 18, 5, 20, 10, 1, 8, 7, 2, 11, 17, 23, 13, 15, 20, 10, 5, 19, 20, 12, 23, 18, 2, 5, 23, 26, 13, 30, 0, 27, 27, 23, 14, 6, 25, 0, 26, 14, 9, 18, 11, 14, 3, 7, 18, 3, 7, 2, 20, 12, 6, 25, 3, 1, 17, 9, 28, 21, 8, 4, 21, 21, 14} c2 = 3e9fa566626f295ff96c21f0d113de8e81c502d6553ddc41652271e41215f6bf3a6e0a26d284ad504b3c4fae26995b644789a262e8db27a0b41c21b82194d6ed1c4cd6ac97355b83e3f7e4f8656d33761f4bef98bfd50f1d03178b6a5be67bc1ea79dff6a7cd673dc10f63900631fd6052e0f4deedbc21dc87ca42554047ac78dba3aa4ccaae14e5eae6c1ded7990cb44b72b971e43882329347888957446a75 c = 87bd17e107d5e37b7d67c45df2453f04e778cfb38c425da461d52be742d7f53eca92a84fa0752f78c062b63bf7f67cb281c243a1ecaf67aead78868b20a9d6c3567b32782143ce00616aa573b1e01153702f8bab17513ba24a3b777dba87f026d92e960b75ab084b2f2f549d532b4016a9ec7fe9494d9aa5907c854c20f993eafff4221d7688f6a188c6a70bf794d76f62df8d350e122028d6038f76ac91d0c4814fa1ba1fa4c8dd42e9f4d733aa3b9a52a4d1b1241962986d64e28b62ae149de34d96de819b64441af85e044d894b17bb3f69d72cee5e698260af9312a03967f0b82cb24b01828730b17f5ebd2bc76d510e0fc0b00bfe814fe9a7ee4c430b803109fb6ac0454ddf65931e9745542bb02ab1620ebf8968426c6425599419f9dcb814f9c302146778baf342df8922de9e229d9af6a4113143211597da785d11a874f3c90bf1733f331a5e3348355863e45a0f0661076e4e2d5cda109fe370e64fedfaeee5d3ea0131d7b8bf3a6344abf7dcc77699f4325c6f0e9aaa8b4bfae413e22c5ea945b5d59b417c733780d03069f169be61813c15391f2dd1619cd93357ceadf8688e97b37e162a19335e3e17c676e540a0646a50f0c88357dad7e868ac1570e0ec068bce9b87e1de6c3e03098f77ee87854d97e20cf9e1bc15d9ce1833814a9f15667d8f61396bfdaf0132211ba1e639f65a4a7735e6edf3b6355f586e7434a5ffba59f7790c091c806debd0921d64d3360cf8eb42aa6238924865dbe79b50552317752633b44e1f64ebeab992225c395010a91d0966ca3b5356d2023489c38fbab20582a6cf6ba5d946e97a090da7496f8ab2e197f3a2113893980d6c48bcf834536b255ff6520350638e563b049ade5243a6c7210e56d8873f96ad5a2a8d527d4598255b7f5d5d663e8e18917f2ffa7fca37a5e0917c8a2343446b3587345ca13c78c29e813455744b8037a3c6da691087f9cd3b3bb64b948eba4eddf7d0dbcff1d31b2759e0c82d36b56e3ea3c0d21fe7d19855ff5632cdeeea2c78a5bdea96263445c653e4a12447d4c1200240ad537875571d4bf88dcc40b35437942b85aedeb211969551a9ff863704d6d9f097858ff2da1d3525aeb656a908819d0438ebb16eb81b10087f3c0d9c036a59bf3ee15579f85f1ecb16ecbf807167548635401ab6c1ca6c1edb6eed3c1efe0d2eaad683ccbfc89aa7c4dea656983cc0b959445f92c596011667e83528a964ba4a067991e745372bc05792958ed2f776b57ec98f8181e2caf7b542999c04dea5075247e70fa43ceae837fc9b3a9354668309cfbffe0194937c7064e03ad6c756c5b3e4bb0c514018d31b7084db418f105b48ba93b86095591df4157aaa82f9c186e54181e6966751ce26a6f8357b61000944218bc69c309f720a35cff5dfd27bad2197000c3f9ccb97bd00049a4a66bbc18105026430fab2aac0713534473cf1f46cf92d31f3129eeb95772f2c3ad5590210a3fcbd6603cd7420fca5fb5516629edf73d86ef03899f279d3b8f1962a71dc0d3702cb164bacac3414e9f4736992ac8fe2afeffeca9d6dfb0af61901adf9b210afcb2a1e990cd9bbba5b90ed1e230f9e39b1888ccd8fd9e1b5c37bfbf802fd6d90adfa632ec26f90cd0f4d7ab3859ef964d726851c4d2b120d154c86ac60a05918a9b0381f4cdad739261d43ce4e79de1f4fbaf09cbb3dc329303bb03af964fbd45c0b1e801530293e39754ff36c5681395931b0bff4896cb3ece79c531c72597de5451a1c56448cc25d2aacc9f1404b6440f6eb10567b0965d8d18a0368ba4d1723359130fadc83f80848c23274e7cdfcaf97ee63750cb206e25caf8b0b8b2cf066c2ccd61d844873d912109e28ee334f71eeba2d3cdc31d93415e55e82362119f81cef055694d869bff6e0d70e1ed69834b9fd40768611e1d88be19bd77d946f4910c0564b1ce0ccf0e53a45b8f065d8ec2023f226f20928f351971d3e9fa566626f295ff96c21f0d113de8e81c502d6553ddc41652271e41215f6bf3a6e0a26d284ad504b3c4fae26995b644789a262e8db27a0b41c21b82194d6ed1c4cd6ac97355b83e3f7e4f8656d33761f4bef98bfd50f1d03178b6a5be67bc1ea79dff6a7cd673dc10f63900631fd6052e0f4deedbc21dc87ca42554047ac78dba3aa4ccaae14e5eae6c1ded7990cb44b72b971e43882329347888957446a75 uᵈ = fc284d375c41242a4d0ba39fd753139b415b482cc628153618576deb3b5dcbb65f944ca4ede03292fac8341c8f187930522bc6078b20e2b6207846543b39b8e909072ea4c73f396451d06cb4710adb9949fb37900c033e5a69916bd43819cb835985b32e83646edb3b08067a33388db8d6c6ca1445f82723298a85827c7b81b777469275eaa82852a733d3fa3333b117c040b11cf4540a649e8428aff503661abab8d48106011903a97a90b2933e2e3044d2ba190bd16033d83fef88723d4b7d06573984e476f6e952cc01b822c49606f72ee98786c1607e2357554cd638d3e7b776099807124c2321c2b37a1a3f06781d50bb9e42748a34c085b069dbf09f3dd3ad70745c14970b18809e4be0191468cbf3853e4d2500c2778fdd0a5b6475b5856563568a3766d48bf9365078ab1fa7629f339a3b44c81415d8b806a7334820a0e98997cb946580d3b721033bd05ac8ab829f34a84258622cfa0b0e9247a7a08b0dc7eba8a46a4c5330adbd08393b196b6a0006743a9356120b28432e9ef240c1b49856bc8c3100a617ca9b3f450eda9aa84c174c5e6829f6db2ee9b397acd73215b8b7087a8644384ad3520deb072dd0b09e2b498156d647953b11beab92cffba01989a6d3358d93d12e5a2abf48923cc2874cc6bb1385990b47737cab46c325664c0cec72a8fa568966b640cb23bfeb62e8392d5d9c02708bb48edc47e0b7863b65caeea746838572304582b68c11c65832fae891bdbc5751f71acc917d77918e8d374c8552c14c9bae6a82bad39b3edcec97f26bbcd0769c0250b2df4677b0063f64a168f79a7514d12ded307912cc9a2f58ad66195f1eb5a97f9835e9ba639b171c36c234ea96b1ecc07c4a9b43cc2309d3f72d9af18d50b2696f5c8eb30a59b1ea4c4cc587d8db21096b66be1b55c7997718298fd6917161f5ac32524dd0c40a8918bbca080c92dab466657c92bbb7bdf8c7cf0c7a59b4899533ad0ee752077b67b8a87c95416fbcf1b5a3fa67a9ec78346ca30f41a3ba3157b7bbaad738a4367c8fa7b02a0b3725c2c9292d7760abc66db569c28051980f0285fbd5b391715ac73b33d3f23b2440a30afaacce322a91d6c6e492aa18d9cd3492ab40ab2fd3798673744afab04323f710c5c01df4e605d5200099f410b908471005b79a630a3535ad36682399ba630bdb4e319244ddac6dda8647883567913085f23a1877f895a36479e0404ee0812d1ec3972e5b01d2d01961d57e45a352db2410b99818fe9c180b4b8fdf8413822a79be2834eb89052695bb40794ac18b18bda99551e431c6f726e22a88ff4a7e32c2a385b659c4714d0ef9490a205c9bea0ab9d3516f74149359621947a71050470e592fd98b5a6eb54d6a4669126423cb2c2391d21f33bc864cc31760cc3429962fb7f9cc3c843e25322cf720c67d8c01d1e5c4da1205fb85c74059a0a3a7c2d2160477f2c68a966b049331eca66ceb051e4b6079b168a98d408844b066be82ba0a327d553a12f5e76f03da2b6842013b7010215128c05681fa63acc27bcf6a284daed07a81f6cc775a65412600929a3c869505cc391a29da71b5b78ad8c2add3a79f80bb31555a2530953d84ea4c269c09a33aadd1033424e4b56faa3474581abad9c12e221b1673c9ee095a860152a92c2dc625994cf45b86e9b28e5658a0f722676810fbe7a8ac72a39611ca5e26cf69499462964ea342346f6a917beb251691764721c8dc7a4a0b896464c7b6d9f5231805a789026e1eeb988a8c9ac95b590bb9be89621c5a4b516b963ea7851287aa40e0d83b979b3e86732a89e05185a4136aba131351b8cae085ecb873d87b36104bba269cc4ebe530381b32dd929c80018b507cb085684bd359008c807750a63f48b6c5704a04f68711e5f4260b3458a3c7817c3aa0972b463bd238abd647bc2121869908ee83c448f575a2919bb781add91352ff2223175087e4c7a096f8758e335e59a37451778f3418bccef79bd92333ed8b6ab8b2b7f6eb25cb16a364eb7c2e95aeb0a61b6e0925a22120c1352a21f2963f5b9e5e193e78381135ab07e3b77633dca168e245f11088db840ced086bfc287cf5a1c8a50154c7b12dd044b75dfcc844aa7aa7118f9af416ed979ed6f543b7e564e979c014f5a2fc5081106465790918 NTT(uᵈ) = 6b4b7aae51674c9570508b5d9de2a77dcb8f9d882e5e911620f70887cb4601689009b2bf5ae6a4412b8d4e41542fccbacac12670e385787a7f682375e48b82c29cc9cff90ced28883f5825f8b389a06ab98ef2c535c78a86a737d9c08078951793da6e77950181f754bd4252815cca8fcb109a3bcd22a593d13c96076c50ea37cda2117c5e7531f4608c79707632f5b2e853563fa7bcc9e380ecb86f41736f15fb0958fa824e08234a78ad5e9248f3043db4585bbe7ca2de9754adb56f9c08b16355ae7c8007cdf42090959f0090a1c8922cf3912024d3677378c573325ca0a00b3608376bd30e8729142e581408012add36c5957cc8561b7339754064f571e371653e348560a0ae3dd65f4f653f9e24a914034608a948689422b2a294d7724ab711a5e82201ef655bb95507fc3c0e9fdbbb3f2c1aa8350c1ed923f85684434a5db2d48c4a8a630c755c93640a06f00816150745139af34c1df9735bcf2b089f17b10e81ceda41cc1936423978ac4ea232c9073751ec7bd2b5959328b64beca1c9631c1c799f9f824bb7631e9693b1a1c1500095a58a163916107d566b5d158c6eee4b99e03cc24f4b88fab6106059bf21ea8d9d03ba3da2a69c3843f9d737cb796b723665a657420a85a39b25561de23e1fb13e11d78a80275d67f381b6da9bcfab67eacb1d5de471986c109f7b8838f997a006ab66e6c4cc6986bd5426aba533ccb43ab5cc1e21517509f728c1b8b6adf0af04129b16593e7e3817bf7608878736bb8638a31569c97439b9611490293db4393aac78bf65427bb22b636dda15d1e9553d0755b0531e772b82be083dc551bdf5589787f6bedfb8a90f79b438a570879635a2caa1e0a843a2c9c166b15406f14b030c309b638e00445b72db5fe488bbfc53be5549cf4ffb2032a3c0811a9d83bc06e04627e09056555b91ffa8a0bb892abbc96f3c0b45bb348eacfa7a7d52708c14999f4246f038b3d1a73c3342b2f5545ed43a3897da0919db5a5582220a38623d0588c77275f882b9e66768b4b156d7a8adf9b27ac508bdfbca1f24429d8b962b9b5199cdf76a9c96c1e15a36c92b738369151da751179215d8512a772a8315a498a5707d9a5414ebdabedf339fce840294987862c300aed5a1e724b1ce2b66691b07ca655e28c674a2b06cf2ca7fccc133b2f67401d0be602a2be57884291050af558bba2503f0f1affb91c43aa950708c2cda404ff8e12a93883ee8e038adf1af8ccc655c713415da54cc56bf78a047ff300209ab05cd61c4e5e75608d65d51448fe1aa3693d05acbc58e0deb98f2a295e4d17ef502a55b716341676173666cca6703cd69ac6f0cc94dc1a44c4b25d8a82537ea12f2555c7840b2d38873f9982e93b379a662c8588919935447bbf39e5cc97d339b6a5db58399b920a62a8054fb9f9568c16fe1b69db64064a0581ee98605d06f038b1d803757f567155ef75ee2ba370b569b79179adfa629dd2963343aac6ce52865cb8c5518328670c4fa8a365b633167c393c6491fb86b24fc0a016c47051f250b894b54ce262a285326c4e58abab01956c6055f31cd1654803e3c0a41c1773ab72ae67824d5dac7955490be354c59c78a96f433cce7a5cbe783e17c3f3cf5667923c1e6b72b0ebc5ed2120c5c25cd1223249f148e5520b83d3277658a4d23e888da2197ca786c39c13c7c098abe440d2a13c5f266844fc29ee5a8ccf6da28ce06a6094566678438bf7a4aa1102b0ce2bfda6cb9b11965d3b1a6291566079468d0a4483e74b907501b1b797ba24aa1506486e4e8517d196332e1193b4aceb0da89de134936b47c9af698053235a615a1550c7f910401ba7086fdc60aa4526889b12772d807eb36a0d8953608e9568725667211637de88da351bf68799778c4706707cdb17593d0c3348ab65a70d798fe4214abf128f826b19c84b8e0c173b6b7bedd6176a3eaa6ba1a5999333d6f3896ca453e5e27c906c149ed30cdc6d3228f5312465b16a46943914b6ac7563173f7959537bc89806e6a522502cb18f2a2bffa8a686a3168c3a2b440183dc5a54709ecc4c34810f4503a30130a47264a58423887a16d5c81097188070db7bec88a2bf131c28a67cd0af67c2003bcd1378118f51839301489052b64c159d10a528a178ca1548a8b92a1 vᵈ = 319ca2d8824710947ba8034e1886471014c38918b6b98754688006618b13c98b3ac199afb0054e008047e08406c119a989084118169cc90b0089084ed0803a610b34b0853a21080df198c9189688389195a8830670926e21883ac1198fd0004178040d1816c3a09195910a1a291ab6f10834f1881308926ed09088c11968318c54990c1a0080204895a2e91668009095688006088254c91b8fb98713e014758998a2918a47f10827f91aa900802d319cafb917b6c18961291aa9f198a2c1095b991c9c5117c3b0054e319c958918c33811a9e98606610b0d781482911a8f08927b18866168108f919a7b598961f91ac3d88254b98761f118c3a0119c18169cc10900a88313a00127c98b2dc1091a081268b917c3310c5bf99aa2f91a688196afd81282518720210841680034d8020d78946e598954181682108420b91782e0949551070d089295918a54310c00f99aaf59095b7092a20010a9b0853a518747b08513d8127538812dd01082e00427298a1368906ea813b6890834a0918889085b w = b6dcce5510020b80663ea66bfb06ce619668ec566ab3a601fe7ccd3250630c006af36602d65c68bc9662e196ca718600b2e6670240007036ce6c266341b000f40c701ae0041a80cfe77c69afd6c9c01c6cdde66e5ac6cdfc8c6f0f90cc119008a7b6010160670a90cf90f668ae1667bee6cdf0fc0281366331f0ce857604b88ccff87c6ec96c001dd0cde1ac62d7cc02ff4c624896cb1f106bb69ccf75966e849ccb05806a35c6685bb666a1a60091b605aa060288c0630b80038d166acf3ccbe18c675006d0c0766dbce66078d6697d066487d6698e566c0ed0695246cf6390026a466641d0620820cf9d4c65ba1661a80c673dc671a8b66964c66dc3d6cca02ccc1d106f68666c97966a5ad66b271006ebacce33f06a0da0637940cf4bc0029956ce61d669cf166ddb166ecdeccff1b50594c669f7fc017b7664ef656824e0cd26906fb3a666391069183062df8ccbdccc66286000c9fccd3a96cfdcaccc8ea066e76c660550654ac006773666cacc66b6cc69f3bc015c56cf7cd671effc63 KBar = 99356ff2266850bebb1b9eb49e7e2dae813f376c39a1747b9665fd49759ab5f1 fips203-0.2.1/tests/cctv_vectors/ML-KEM/intermediate/ML-KEM-512.txt000064400000000000000000001366561046102023000222650ustar 00000000000000d = e1e3206875e67d7e81353774fe9025035b9b41a4a9f6ec00b91c600442fd717d ρ = b1720e4ed5ac0add457f573a041465bcbd7ca4e1d7d53eaadeda511962a36eb0 σ = 176c5e5bdef7f0b03349110742125810116450aa6ed6a02a87a8c04cb508d6fa A[0, 0] = {2322, 479, 3, 783, 2874, 1746, 2961, 2018, 1000, 667, 1686, 115, 1257, 268, 1040, 2914, 1051, 1438, 1500, 1887, 2121, 3171, 454, 2842, 2683, 1412, 2461, 1063, 1892, 2180, 3248, 309, 1300, 776, 3273, 2631, 445, 2127, 16, 1737, 413, 1477, 834, 1429, 1741, 147, 1742, 1378, 1295, 2642, 2169, 379, 676, 2115, 1815, 2490, 1119, 204, 1412, 172, 381, 2697, 1565, 29, 2338, 2357, 3221, 1595, 1597, 2667, 144, 850, 1017, 986, 2430, 200, 802, 142, 596, 1755, 1439, 3007, 828, 454, 440, 1161, 1463, 746, 797, 2419, 3124, 992, 2372, 1092, 889, 2094, 2488, 1185, 630, 1399, 2478, 2984, 482, 2890, 471, 1276, 1713, 2058, 1890, 1567, 2203, 1421, 2351, 2554, 1681, 1725, 2133, 1981, 167, 1588, 531, 2889, 90, 2503, 3001, 135, 1878, 1550, 3185, 1483, 1006, 3242, 2771, 2745, 212, 3307, 1178, 9, 2523, 373, 2435, 168, 1264, 688, 1091, 1278, 2638, 1319, 380, 2722, 643, 2199, 653, 1549, 1400, 695, 3187, 1756, 1214, 1235, 2941, 2467, 1026, 2740, 1758, 511, 2380, 3261, 1177, 2729, 569, 76, 284, 1958, 1375, 2648, 246, 2220, 2132, 2115, 2202, 908, 2697, 1437, 647, 1006, 443, 1826, 121, 2597, 835, 432, 213, 1740, 1488, 899, 3279, 158, 998, 2213, 2724, 2194, 276, 593, 254, 1065, 2437, 26, 2632, 64, 2763, 1179, 827, 2678, 2272, 575, 2761, 1224, 114, 2154, 2896, 1511, 2591, 1538, 1452, 3097, 3082, 1448, 1411, 587, 2265, 3223, 3046, 2500, 2157, 97, 658, 859, 16, 2552, 1376, 2131, 795, 2368, 2151, 1782, 2712, 1663, 3168, 1803, 1552, 3098, 2249, 1110, 1645, 1015} = 12f91d03f0303a2b6d912b7ee8b329963607e9c4101024b61be459dcf5754938c6c6a1b17b4a589d7942644788b05c13148530c97ca4bdf18410906c9d515c425359cd3609ce26560f25a579b817a4328417a79b5fc40c84c50a7d91a81dd60122599395bc633db6a6902035f9a33d7e890c22e30854b26d9ff5bb3c631cb89148b7a52e1d3397340c3e44494479e382b8194a767257ae89bae2a1b4d7c14fb1a68062f7619bd8582fa99f91d66b55d87ba740631392b45a709cb97b0856e76071bc5ceea3cad39aabd4b0ce9a9400db591783890af0042b43e44f4e7a527c21aa8372898dd26078752b73cc6dbe344d7d3b9a0244abdef61f4cd9cb9994aa39c2041c617a5f85a5f6c08a5438849ac83889da5987e23ebb21727950a243031bd5c06cd03538cfec09e6538aa42a89141125fe904285a901480a04cbba493b63a7e0f823c98a4c72a086507b5e1f2a60ac95c10a8c5a83b524d978c9e64b9c6d180692b23510809f6035851b039467686f98fa6760bc7010a6c1c968456d763f A = 12f91d03f0303a2b6d912b7ee8b329963607e9c4101024b61be459dcf5754938c6c6a1b17b4a589d7942644788b05c13148530c97ca4bdf18410906c9d515c425359cd3609ce26560f25a579b817a4328417a79b5fc40c84c50a7d91a81dd60122599395bc633db6a6902035f9a33d7e890c22e30854b26d9ff5bb3c631cb89148b7a52e1d3397340c3e44494479e382b8194a767257ae89bae2a1b4d7c14fb1a68062f7619bd8582fa99f91d66b55d87ba740631392b45a709cb97b0856e76071bc5ceea3cad39aabd4b0ce9a9400db591783890af0042b43e44f4e7a527c21aa8372898dd26078752b73cc6dbe344d7d3b9a0244abdef61f4cd9cb9994aa39c2041c617a5f85a5f6c08a5438849ac83889da5987e23ebb21727950a243031bd5c06cd03538cfec09e6538aa42a89141125fe904285a901480a04cbba493b63a7e0f823c98a4c72a086507b5e1f2a60ac95c10a8c5a83b524d978c9e64b9c6d180692b23510809f6035851b039467686f98fa6760bc7010a6c1c968456d763fef59a6173936fe4814603bab0589b771d17c12778bcccc4309f67ddeb95b4b873c81f72a0783a8ee123ff5b6235a56b486c768bd8113a4f09d19c9af80fb98ef8b6c697b42e7bc009807762de9365391547cf822c07b869f49104ffab3098746da759ae3378961385521da9470a42c78073bee570feb4a9b14ecbe666a136462aaa0dc2ce173b61c625563fb50b5c9c2f208ba42e656d221431fab0a2868b154366db5e5b19a4822b0385936e4be96b2ad83013a904970efec5329f0a563f6406a57b82df2965b9ba492b29c678262e6829a11011478460d8da1a75d14972996bb8e0762237bbb8c9b044d0337cff8312ae18094082f7d6ca361d69bf0d004dffbc9d55b905f8359f421b4748328a9e722cacca07ffc210e7c35cd461abc069fe4d7980a570e83b01103b878491c200f70aa8bc71a296bb711acc2452c98f88810e75869ee4997bcc17a09712338f83d66b96161e908a4c4279a615ecbe2682349a21e55af66127ad08114b06709c724653d59561aa249c1c050b08c1397421102097622d5b54febc61881472d7c5eec9834c1d304b8c94d89a04b5bb672302464a8bb43ac854e8f6cc0546a1d2016b8ad221bb2939e613ac5ae7b7ec9576d50265dd02ca683b69a6620cb87c08d6aab49a56c09219863134947f17c96f50cb2f01493d9d431672a68893b0f2594c204eaac6871242bd00365fc019ff1530ac10c7d1051489cbb2efb499b888497a61615f25144db1943c03c99eca96009a749c44a7709cdaef18047282ac9615b04b42318a2ac01d834c447a9ebfc758b469e7fe43355903a9cfc9bf830a085538631c6553432cddcc78900f35d3db7418a03951a0577235b9f6036b23b3269c64bceebba4bbd3c1592b541c0857c93d14eb1a5231e74532273b1bc666e2484b42e4b5e0fa32b2337362f60c73e5a80d6ab7ae78a7cdbca4a8be5ae94c063489a2469f2b09c8ba6f2e92459768c30daa218c387107ba32d6a072dc63bd9a38ececb571988c727ab0fc332835aca1925f4c1f2210b006d96cd2a7e1c4caead7ccd55b05931b3b94f9c02fa2651b750b79f227e843ba4e1571bb9c8a547e2a3fcd25e3866653728bd57a8c9c480404295819e559ae6727d81d61b785b7817dc3b67560db36c2b0509976ff39435869e49044987fc4d92b9bfd07a37fa08193057aecf585734280d0201a0ea237da26b5741f528dfea6a58d291a5d5543be52d31b5468b82143e754d0714747981aea189025a8931eba7a0ef2561bb0860b8c2442285b4ed22b40c882f19350789642bdd6797e8d98566eb411221a425f34c73aacf92e0a5d8b35272302b815041833b29b1a409d1087b6ef00197893f3b2a93ff61646d77c0c5089f93ec7261347a871c9e7559c11677a84cdab7598c3bd2709e9df33186954682b7ae1f888043a738cd906cab0a06ecb74badd6b303eaaa5ed261e51009c867b8548a84b4ca62845b9f7b9aae1f4107caf9cd2b43469185616ab96b2c09438f06ad95b5605c646b67a8b88b5587fcb0235656ae23d0530fe996bfb691429716e46a2bcd299573c80d7c37ba4fe14e38d556c3281a1b416b2996cb9aacb059345aa6ec078714c52fd3b01d176f s[0] = {1, 0, 3328, 1, 3328, 0, 0, 2, 0, 3328, 1, 0, 2, 2, 0, 3328, 3328, 2, 1, 3328, 3328, 1, 3328, 1, 0, 0, 1, 3328, 3328, 1, 3327, 0, 3328, 0, 1, 1, 0, 1, 0, 0, 3328, 3327, 1, 0, 3328, 0, 1, 1, 3328, 0, 3328, 2, 1, 0, 0, 2, 1, 2, 1, 3328, 0, 1, 3326, 3327, 1, 0, 0, 2, 3326, 3328, 0, 3328, 3328, 3327, 1, 3328, 3328, 3327, 0, 0, 1, 2, 3, 2, 1, 3327, 3328, 0, 3, 1, 0, 0, 2, 1, 0, 0, 3328, 3327, 0, 0, 1, 1, 0, 1, 1, 3328, 3327, 1, 1, 3328, 0, 0, 0, 3327, 3328, 2, 1, 0, 3328, 1, 3327, 1, 0, 0, 3327, 3328, 2, 0, 0, 0, 1, 0, 1, 3328, 0, 1, 0, 3328, 3328, 1, 1, 1, 3328, 2, 1, 1, 1, 3328, 3328, 3328, 3328, 3328, 2, 1, 1, 3328, 1, 0, 0, 1, 3328, 1, 3328, 1, 1, 2, 3, 0, 0, 0, 3328, 0, 0, 1, 2, 3328, 3327, 3327, 1, 1, 3328, 3328, 3328, 1, 1, 2, 0, 3328, 1, 3328, 3328, 3327, 0, 0, 0, 3328, 3328, 1, 0, 1, 3326, 3327, 3328, 3327, 1, 2, 3326, 3328, 1, 0, 0, 0, 1, 0, 0, 3, 3, 3327, 1, 3328, 3328, 0, 0, 2, 1, 3328, 0, 0, 0, 0, 0, 0, 3328, 0, 0, 1, 0, 0, 0, 3328, 3328, 3328, 0, 3327, 0, 1, 3328, 3328, 0, 3328, 0, 2, 0, 0, 1, 3328} = 010000001d00000d000020000000d00100000220000000d0002d000100d0001d00001d000000000100d0001d00ff0c00000d0001100000100000000000fdcf010000000d00011000000d00002d000100000020000120000100d0001000fefccf010000002000fe0cd00000d000fdcf0100d000fdcf00000001200003200001f0cf000d0003100000000002100000000000fdcf0000000110000010000100d0ff1c000100d000000000f0cf002d00010000001d00ff1c00000000ff0cd00200000000000100000100d00010000000d0001d00011000002d000110000100d0000dd0000dd00210000100d0010000001000001d00001d00012000030000000000000d000010000200d0fffccf011000000dd0001d000120000000d00100d000fdcf0000000000d0001d00001000fefccf00fdcf012000fe0cd001000000000001000000300003f0cf0100d0000d000020000100d0000000000000000000000d000010000000000000d0000dd000f0cf001000000dd00000d00020000000000100d0 s = 010000001d00000d000020000000d00100000220000000d0002d000100d0001d00001d000000000100d0001d00ff0c00000d0001100000100000000000fdcf010000000d00011000000d00002d000100000020000120000100d0001000fefccf010000002000fe0cd00000d000fdcf0100d000fdcf00000001200003200001f0cf000d0003100000000002100000000000fdcf0000000110000010000100d0ff1c000100d000000000f0cf002d00010000001d00ff1c00000000ff0cd00200000000000100000100d00010000000d0001d00011000002d000110000100d0000dd0000dd00210000100d0010000001000001d00001d00012000030000000000000d000010000200d0fffccf011000000dd0001d000120000000d00100d000fdcf0000000000d0001d00001000fefccf00fdcf012000fe0cd001000000000001000000300003f0cf0100d0000d000020000100d0000000000000000000000d000010000000000000d0000dd000f0cf001000000dd00000d00020000000000100d0000dd0000d00000d00000d000000d0000dd000f0cf000dd0000000ff0c00002d000100d0010000001d000010000100d00100d00130000300000010000000d0000000001d00020000000000ff0c0000f0cf000dd00000000100d0000d00001d00000d000100d0010000000d00000dd0000dd00000000100000200d00000d00100d0000000000000ff0c000000d0000dd000000000fdcf00f0cf000d0001f0cfff1c000100d0011000ff2c000200d0001d00000d0001000000100001e0cf000d00000d00000000001d00021000002000001000020000ff0cd0000dd00000d0000dd0001000010000ff0c00012000012000000dd002f0cf001000000000000d00000dd0012000000d000010000210000100d0020000001000000000ff1c000100d0011000011000001000000d00000000000dd00110000110000200000100d0000dd0000000000d0001200001000002f0cf001000000d0001100001f0cf000d0001200001100001f0cf000000000000001d00000dd0000d000210000000d0ff1c00 NTT(s[0]) = {1837, 3137, 1722, 738, 222, 252, 512, 591, 630, 2953, 635, 1388, 3151, 1951, 272, 319, 3323, 2008, 3211, 913, 3201, 2394, 2264, 1162, 391, 3048, 474, 2331, 486, 1801, 3093, 705, 745, 404, 1554, 1687, 2846, 926, 604, 2476, 1789, 158, 277, 3273, 1007, 2208, 1001, 1442, 1312, 257, 238, 335, 1621, 612, 3073, 2384, 1908, 3278, 1786, 1397, 2512, 2377, 1605, 1030, 2885, 527, 2722, 1458, 2097, 614, 651, 2737, 2555, 825, 2274, 1764, 2117, 1211, 2445, 1843, 3192, 2277, 2325, 344, 2555, 2372, 147, 414, 1884, 79, 3139, 3147, 2897, 1991, 963, 2818, 2821, 2609, 1050, 1214, 475, 1508, 1635, 1788, 416, 1087, 1844, 1519, 1079, 278, 3001, 2929, 2601, 390, 1011, 2914, 2031, 3043, 2277, 2956, 2894, 2924, 3167, 9, 189, 1205, 2609, 2470, 3178, 1543, 657, 2301, 3302, 837, 1334, 3227, 2240, 2479, 71, 1137, 1895, 2831, 2807, 2297, 194, 473, 841, 366, 529, 2843, 652, 2901, 3088, 90, 590, 1577, 1321, 815, 2258, 1889, 1111, 1154, 1334, 1218, 25, 323, 2045, 1646, 744, 2317, 56, 2622, 1928, 1223, 949, 853, 1859, 809, 955, 560, 921, 572, 1281, 672, 1423, 1505, 2362, 2612, 1081, 1409, 2327, 2834, 31, 1550, 2603, 3163, 2379, 1476, 1562, 2905, 1791, 337, 1322, 2406, 1815, 2940, 669, 1112, 1223, 2749, 2982, 1493, 3164, 2380, 1054, 3074, 2717, 622, 304, 2765, 2266, 278, 2994, 1921, 2476, 2920, 2146, 453, 1722, 1412, 1890, 3189, 52, 552, 2403, 1154, 3275, 3201, 3233, 2242, 615, 369, 366, 1350, 725, 3307, 1950, 2849, 1806, 1805, 1532, 2553, 1027, 2607, 482, 2117} = 2d17c4ba262edec00f00f2247692b87bc2564ffc7910f113fb8c7d8b1c3981ac95d8a8488781bedab191e69170151c2ce942191276691eeb395cc29afde6091591ccef038ae9235a201510eef014554626010c9574e7ccfa5657d0999445664045fb20a22a5b3168268b12abfb9933e2486e45b84b8d3973785c8e158915fb499493e0195cf70443bcc4517b7cc323b0051ba31ae44bdb415e63c66fa0f14334f75e376411b91bb7296a18f323b6ef37bee5c8b84ecbb65f9c00bd504b316a9a6a7c6091d28fe65c3436b5c9c0f89a47104767f7b0f79a8fc2901d49e31611b2b18c52b510ac054e926229f532d2187657244836254c193014fde766e8d29038e0a388774cb55335439732bb032399c32301052a8f155e3a49a33914581729b11fe0602bbac54b495c1a96b5ff16152a659617c7b79d8245c7d4aba65b5d5ccc941e24c09dea2630d1acda6811b21b78ac89b662581cba46586257c7348022632948cb1cc8a12c8c6712176e6154d5b2ce9e17b20ed770fc959f03f4a2e25184 dkPKE = NTT(s) = 2d17c4ba262edec00f00f2247692b87bc2564ffc7910f113fb8c7d8b1c3981ac95d8a8488781bedab191e69170151c2ce942191276691eeb395cc29afde6091591ccef038ae9235a201510eef014554626010c9574e7ccfa5657d0999445664045fb20a22a5b3168268b12abfb9933e2486e45b84b8d3973785c8e158915fb499493e0195cf70443bcc4517b7cc323b0051ba31ae44bdb415e63c66fa0f14334f75e376411b91bb7296a18f323b6ef37bee5c8b84ecbb65f9c00bd504b316a9a6a7c6091d28fe65c3436b5c9c0f89a47104767f7b0f79a8fc2901d49e31611b2b18c52b510ac054e926229f532d2187657244836254c193014fde766e8d29038e0a388774cb55335439732bb032399c32301052a8f155e3a49a33914581729b11fe0602bbac54b495c1a96b5ff16152a659617c7b79d8245c7d4aba65b5d5ccc941e24c09dea2630d1acda6811b21b78ac89b662581cba46586257c7348022632948cb1cc8a12c8c6712176e6154d5b2ce9e17b20ed770fc959f03f4a2e251845ca128031c5f37631f6e6241fce131164092ba676483c7050890279672a9f8a2329b752eb9b09eb7e4747e13587ec54b99582e2d905ed2b55ef7aa52a185caacf037d4946a95c94f0b80423fd4884a8370af576f0e4b1b6c851583312500b4420676a288019bfd8c2c24116eec8c5dd5822da84c446e09c47887b9c912b8c1786f9ad83e1d36961750175398606b42b2c3a095d104bc0aac455a72554aa9ac1d9ac5a801ab8c6723d53a259ba20c094bbe3094534c88817703a114f94b2070c4901a4bb7d02858b31dbc614aa7c3a10344956b940eb619adafd9c29397bd63c0600d910e97a0554515163221194dc2bcecb5786f081f79478af2f2559056b66453789ce53877db743a3c8378d20f92b3c42f46a712aa92eb765de933bd0a53a531f552218c5da3b57775881bbd8240eabc1881ec3519ca80243a8fc4ccaa7108099a959726b72aee522780649c91f4a82aab2045834b2f64039e542c37b7b81f602be2f0688cb5250f295591c999390499822140ff4325011860fa753b81e85b e = 010000003d0000f0cf000dd0ff0cd001100001f0cf00f0cfff1c0000f0cf0100d00100000000000000d00120000100d0010000002000ff0c0001f0cf010000000000001d0000f0cfff2c00012000ff0cd001100002000000fdcf002d000100d0fefccf000dd0002d0002f0cf001d0001100000000001f0cf000d00002000ff0cd0ff0c00fe1c0000f0cf011000001d00003d0001f0cf001000ff1c000100000110000200000100d003000000000000f0cf00100000f0cf00fdcf001d0000100000fdcfff1c000000000100000100000000d0013000ff0c000210000300000000d0000d00000000021000000000ff0c00000d0000f0cf01000000f0cf00fdcf000000ff0c00020000ff0cd0000dd0000d00010000000d00ff0cd0ff0cd000000001300001000001000000f0cf0000000100d0000dd0000d00011000000dd00000d00100d0000dd00100d0000dd00000d0030000020000000dd0001000000000ff0c00000dd0002000000000000000000000010000ff0cd0000000000dd00000d0000000fe0c00001000000000000000ff0cd00200d0000d00ff0c00001d00000d00011000ff1c0000f0cf0100d00100d00000d000fdcf01f0cf0000d00010000100d001200000100000000000fdcf000000000d00010000000000ff0c0000e0cf001000000dd0000d00010000000d000200d0001d000020000020000000d000f0cf030000ff2c00ff0cd0020000000d00ff2c00002000001d0002100002f0cf000dd0011000000d00ff0c000200000000d0011000ff1c000000d0011000001000000000000000001000010000001000010000002d000030000000d0011000000d00001d000100d00110000000d00100d0001000000d00000dd00100d0ff2c000110000000d00100d0ff0c000000d0021000000000000dd0010000fffccfff0c000000d0012000ff0c0000200001100001000000000000000001e0cf0010000200d0fe0c000010000000d000fdcf00e0cfff1c00000d000100d0010000001d00000000010000ff1c00011000001000022000000dd0002d00000dd0000dd0001000 NTT(e) = 48da710c5755845012fa6625ec2c1b94927987b8872f159642936295570672d66f9bc8828e74c464ea9b521669e95324b3750c32887c4018a846a0c377d960b41893662809b9acc2a96143b904b704c78b11f1c1ab3067cf9c92be99976f5b4af107a7c5a8485f66b8e3642e3d935db64a398783059341c421438d1d21c4c0a7a486e41889c9174edb92e2f811e9601cb96977337b1045d06f5259215fbb978963a9294068be9191a9c475701752f3694d3d55478b1c73ddb065d1537c56db7716d0bb53aa563a14b8fa37646437501253ab64da5f68e27c5b915f1e4b227f2c6057133ac6b2326dd6a411406a0deb325ab7b7b60284eb9206f3a82f255470f82a699d30bd5da5b2ea684996e67506f2809f451055564289435f4f45becd6053ca540eaa7c134dcc5856a56eb3c89dd6fb0335ca3740d55085acbe655b696f7a2875675b4c007efdd2ae2f6a5966e8838aab4463fbb1d5d651a7a5288bd59b7aa19cce68c4f87c4f8032a98ab918511c5a6e3c8b3f53a48c462b2540802f4a92993510b2b47ff7a16cd38007e64404cc5c6537519c5cecb5dc5aac38246a6f0833d4b07cd4e6cd70c96e0ca53601d9b71ff47ce5d15168d94302721d795246e2fa532a5c2571179982a323bfe595d1886d683c9daf8883b360564048888e9ac78c574b8ecb523ca10df2076f65b5a54f56b1f42023faf726349879ca6626c5cc812768b2d8eb5dd506c83bfa383792484b06a7eb9197824a1f6cb79598f9a0b0d594887c3c6528456d024f9cb447997a5794151a125bae9b7b44082270db878dc939ce22e79065d60ac7b95b5f73c55fb5741a71c5195143f83a220588214d4c4e245a41d0986cdcb8ba7c3530d86c2dcec51579261f2eec1f1b8c3d06e73c0f67bed418ccd34108313038b116628df1bb42c84e36930aae39ca450c6c7689628d9456ef6241bbb29b686b20490b0c99b19804fb312b912f48b60c054596ff29b2d5a62663875dc1a340118c5d21a05fcf204daea91b47689d005db2ebc829dd7199d456a13ee84508561cedda0357d76bdb047621f4c85c2152129c5f95d576 t = f29c866c361d910341f296c64b46c2a2e30b1535a5c0602593415d156b43036b21b14ba3a0c72e848c5ee03466cab97721d83defdab1f6708971d3c4581441ce397fe7bbc7a08acfdcc417c5f56dfdd4423e306f1f69a86e5b5ba3e031bf92a16702861a51a2feb974f4844812b8302dc83026ea566a1c110cd2c4af48bedd742f1c02cd3fca0dfb8331f414b115849bcb05a2df615b49a90ec0a433e8787e185142aa406003d35409ec842af304459b40fffa0d84340156b5767ee0ca6e2850ec8ccaed317ecf711e27d59b3c985555e44c935988092981da95b42573b9bc38122ed44a800510756429f1b0640685b048597842cbb93dc6b2f9144dcf41a624eb90202a30381410f4cbaaccf61e485524ee593ad7d5974f774ae59ba20c7c6eb0009b39962dc0f828e8538ef583b4dc40c09555a3968ab257d407cc4ab801c7521bf7564b163fab927b4703225b1b497a096b4eb984dfd3512ecb2eaea46fb53c3b3840af3c4aaf78b1461e0564290c0a8f93a1e1b1c50cdb5fd56970046103600a1cc109b58cc32e52c7a168e17107a9c77cc448b01a5a7dc90603d708c6d717c3165e772c74763821f35934a613b0297246370020eb113645d75593c5130072acc0483118067bfb8093b518066318c3f936bd29e8acba8318c68a3c47a1be713c5b5a3c3df82514a5db7f70150b44b3927aa5c7b5507f8e693eed04369340141b1c75069b5f3abb016833b936a1adf7ccbedfe775f0494acb6404307a787e19b2fcba2aa8b3cf94ea6aa4303cfe4821fc9a62ee5acbcaa42556d046e4ab2e65e57e4dcc874276c89f980ac1a52fde549064b7abeab30e81d540af393a51bb917d87098ae238946033f3bb31d82b418ea863b9fc2008613e4751aed8c9aaa41840579116b571ad6df0cfc1185b17612008900d104a83b67a36acd8c783c5b1c21026f03b4ab57b23bd160a103920729b13334395a500a2a5a126bd66c75c5c2a046a97ebb8565cbb65fc6a3e1c11a990e20a9c88c96aa3924961159ef22082e45c86a9bb80d7b8936cc9eec593e5e4523ddc5438c819551328557982cf6784 ek = f29c866c361d910341f296c64b46c2a2e30b1535a5c0602593415d156b43036b21b14ba3a0c72e848c5ee03466cab97721d83defdab1f6708971d3c4581441ce397fe7bbc7a08acfdcc417c5f56dfdd4423e306f1f69a86e5b5ba3e031bf92a16702861a51a2feb974f4844812b8302dc83026ea566a1c110cd2c4af48bedd742f1c02cd3fca0dfb8331f414b115849bcb05a2df615b49a90ec0a433e8787e185142aa406003d35409ec842af304459b40fffa0d84340156b5767ee0ca6e2850ec8ccaed317ecf711e27d59b3c985555e44c935988092981da95b42573b9bc38122ed44a800510756429f1b0640685b048597842cbb93dc6b2f9144dcf41a624eb90202a30381410f4cbaaccf61e485524ee593ad7d5974f774ae59ba20c7c6eb0009b39962dc0f828e8538ef583b4dc40c09555a3968ab257d407cc4ab801c7521bf7564b163fab927b4703225b1b497a096b4eb984dfd3512ecb2eaea46fb53c3b3840af3c4aaf78b1461e0564290c0a8f93a1e1b1c50cdb5fd56970046103600a1cc109b58cc32e52c7a168e17107a9c77cc448b01a5a7dc90603d708c6d717c3165e772c74763821f35934a613b0297246370020eb113645d75593c5130072acc0483118067bfb8093b518066318c3f936bd29e8acba8318c68a3c47a1be713c5b5a3c3df82514a5db7f70150b44b3927aa5c7b5507f8e693eed04369340141b1c75069b5f3abb016833b936a1adf7ccbedfe775f0494acb6404307a787e19b2fcba2aa8b3cf94ea6aa4303cfe4821fc9a62ee5acbcaa42556d046e4ab2e65e57e4dcc874276c89f980ac1a52fde549064b7abeab30e81d540af393a51bb917d87098ae238946033f3bb31d82b418ea863b9fc2008613e4751aed8c9aaa41840579116b571ad6df0cfc1185b17612008900d104a83b67a36acd8c783c5b1c21026f03b4ab57b23bd160a103920729b13334395a500a2a5a126bd66c75c5c2a046a97ebb8565cbb65fc6a3e1c11a990e20a9c88c96aa3924961159ef22082e45c86a9bb80d7b8936cc9eec593e5e4523ddc5438c819551328557982cf6784b1720e4ed5ac0add457f573a041465bcbd7ca4e1d7d53eaadeda511962a36eb0 dkPKE = f29c866c361d910341f296c64b46c2a2e30b1535a5c0602593415d156b43036b21b14ba3a0c72e848c5ee03466cab97721d83defdab1f6708971d3c4581441ce397fe7bbc7a08acfdcc417c5f56dfdd4423e306f1f69a86e5b5ba3e031bf92a16702861a51a2feb974f4844812b8302dc83026ea566a1c110cd2c4af48bedd742f1c02cd3fca0dfb8331f414b115849bcb05a2df615b49a90ec0a433e8787e185142aa406003d35409ec842af304459b40fffa0d84340156b5767ee0ca6e2850ec8ccaed317ecf711e27d59b3c985555e44c935988092981da95b42573b9bc38122ed44a800510756429f1b0640685b048597842cbb93dc6b2f9144dcf41a624eb90202a30381410f4cbaaccf61e485524ee593ad7d5974f774ae59ba20c7c6eb0009b39962dc0f828e8538ef583b4dc40c09555a3968ab257d407cc4ab801c7521bf7564b163fab927b4703225b1b497a096b4eb984dfd3512ecb2eaea46fb53c3b3840af3c4aaf78b1461e0564290c0a8f93a1e1b1c50cdb5fd56970046103600a1cc109b58cc32e52c7a168e17107a9c77cc448b01a5a7dc90603d708c6d717c3165e772c74763821f35934a613b0297246370020eb113645d75593c5130072acc0483118067bfb8093b518066318c3f936bd29e8acba8318c68a3c47a1be713c5b5a3c3df82514a5db7f70150b44b3927aa5c7b5507f8e693eed04369340141b1c75069b5f3abb016833b936a1adf7ccbedfe775f0494acb6404307a787e19b2fcba2aa8b3cf94ea6aa4303cfe4821fc9a62ee5acbcaa42556d046e4ab2e65e57e4dcc874276c89f980ac1a52fde549064b7abeab30e81d540af393a51bb917d87098ae238946033f3bb31d82b418ea863b9fc2008613e4751aed8c9aaa41840579116b571ad6df0cfc1185b17612008900d104a83b67a36acd8c783c5b1c21026f03b4ab57b23bd160a103920729b13334395a500a2a5a126bd66c75c5c2a046a97ebb8565cbb65fc6a3e1c11a990e20a9c88c96aa3924961159ef22082e45c86a9bb80d7b8936cc9eec593e5e4523ddc5438c819551328557982cf6784b1720e4ed5ac0add457f573a041465bcbd7ca4e1d7d53eaadeda511962a36eb0 z = c6f5785a6f2b42e843228be53eb768d64c6f9d4355ae95f083e51ed57c437310 H(ek) = a9ce0ecbcfbbbd9a2636e23a0c1c22683943639cd44af051ff235b8dfbb73a4d dk = 2d17c4ba262edec00f00f2247692b87bc2564ffc7910f113fb8c7d8b1c3981ac95d8a8488781bedab191e69170151c2ce942191276691eeb395cc29afde6091591ccef038ae9235a201510eef014554626010c9574e7ccfa5657d0999445664045fb20a22a5b3168268b12abfb9933e2486e45b84b8d3973785c8e158915fb499493e0195cf70443bcc4517b7cc323b0051ba31ae44bdb415e63c66fa0f14334f75e376411b91bb7296a18f323b6ef37bee5c8b84ecbb65f9c00bd504b316a9a6a7c6091d28fe65c3436b5c9c0f89a47104767f7b0f79a8fc2901d49e31611b2b18c52b510ac054e926229f532d2187657244836254c193014fde766e8d29038e0a388774cb55335439732bb032399c32301052a8f155e3a49a33914581729b11fe0602bbac54b495c1a96b5ff16152a659617c7b79d8245c7d4aba65b5d5ccc941e24c09dea2630d1acda6811b21b78ac89b662581cba46586257c7348022632948cb1cc8a12c8c6712176e6154d5b2ce9e17b20ed770fc959f03f4a2e251845ca128031c5f37631f6e6241fce131164092ba676483c7050890279672a9f8a2329b752eb9b09eb7e4747e13587ec54b99582e2d905ed2b55ef7aa52a185caacf037d4946a95c94f0b80423fd4884a8370af576f0e4b1b6c851583312500b4420676a288019bfd8c2c24116eec8c5dd5822da84c446e09c47887b9c912b8c1786f9ad83e1d36961750175398606b42b2c3a095d104bc0aac455a72554aa9ac1d9ac5a801ab8c6723d53a259ba20c094bbe3094534c88817703a114f94b2070c4901a4bb7d02858b31dbc614aa7c3a10344956b940eb619adafd9c29397bd63c0600d910e97a0554515163221194dc2bcecb5786f081f79478af2f2559056b66453789ce53877db743a3c8378d20f92b3c42f46a712aa92eb765de933bd0a53a531f552218c5da3b57775881bbd8240eabc1881ec3519ca80243a8fc4ccaa7108099a959726b72aee522780649c91f4a82aab2045834b2f64039e542c37b7b81f602be2f0688cb5250f295591c999390499822140ff4325011860fa753b81e85bf29c866c361d910341f296c64b46c2a2e30b1535a5c0602593415d156b43036b21b14ba3a0c72e848c5ee03466cab97721d83defdab1f6708971d3c4581441ce397fe7bbc7a08acfdcc417c5f56dfdd4423e306f1f69a86e5b5ba3e031bf92a16702861a51a2feb974f4844812b8302dc83026ea566a1c110cd2c4af48bedd742f1c02cd3fca0dfb8331f414b115849bcb05a2df615b49a90ec0a433e8787e185142aa406003d35409ec842af304459b40fffa0d84340156b5767ee0ca6e2850ec8ccaed317ecf711e27d59b3c985555e44c935988092981da95b42573b9bc38122ed44a800510756429f1b0640685b048597842cbb93dc6b2f9144dcf41a624eb90202a30381410f4cbaaccf61e485524ee593ad7d5974f774ae59ba20c7c6eb0009b39962dc0f828e8538ef583b4dc40c09555a3968ab257d407cc4ab801c7521bf7564b163fab927b4703225b1b497a096b4eb984dfd3512ecb2eaea46fb53c3b3840af3c4aaf78b1461e0564290c0a8f93a1e1b1c50cdb5fd56970046103600a1cc109b58cc32e52c7a168e17107a9c77cc448b01a5a7dc90603d708c6d717c3165e772c74763821f35934a613b0297246370020eb113645d75593c5130072acc0483118067bfb8093b518066318c3f936bd29e8acba8318c68a3c47a1be713c5b5a3c3df82514a5db7f70150b44b3927aa5c7b5507f8e693eed04369340141b1c75069b5f3abb016833b936a1adf7ccbedfe775f0494acb6404307a787e19b2fcba2aa8b3cf94ea6aa4303cfe4821fc9a62ee5acbcaa42556d046e4ab2e65e57e4dcc874276c89f980ac1a52fde549064b7abeab30e81d540af393a51bb917d87098ae238946033f3bb31d82b418ea863b9fc2008613e4751aed8c9aaa41840579116b571ad6df0cfc1185b17612008900d104a83b67a36acd8c783c5b1c21026f03b4ab57b23bd160a103920729b13334395a500a2a5a126bd66c75c5c2a046a97ebb8565cbb65fc6a3e1c11a990e20a9c88c96aa3924961159ef22082e45c86a9bb80d7b8936cc9eec593e5e4523ddc5438c819551328557982cf6784b1720e4ed5ac0add457f573a041465bcbd7ca4e1d7d53eaadeda511962a36eb0a9ce0ecbcfbbbd9a2636e23a0c1c22683943639cd44af051ff235b8dfbb73a4dc6f5785a6f2b42e843228be53eb768d64c6f9d4355ae95f083e51ed57c437310 m = a741ec2002be6f4fa76037b7f0644f833fa823e630401a39d3240c6e82a430bb K = 62a8c220b01793ecd183dea9762c5602211e0aab001cbc892d0a95693ab17cc1 r = 16ce593e016201dee38926330bb78b1f0cab703862c66dc1f5fdf80f2da01ca7 μ = 811668810600001068001068810600000000000000810600000000811668001068811668000000000000001068000000001068000000000000000000001068811668811668001068811668811668001068810600811668811668000000810600811668810600001068001068000000000000001068810600811668810600811668000000811668810600811668001068000000000000811668811668000000810600001068810600811668811668000000810600811668000000000000001068811668811668811668000000000000001068001068001068811668000000001068000000001068810600001068811668000000000000811668000000000000000000000000810600001068001068810600000000810600001068811668000000811668000000810600811668000000810600001068000000000000811668000000000000001068811668001068810600001068000000000000001068000000810600001068001068000000000000811668000000811668001068811668001068 A^T = 12f91d03f0303a2b6d912b7ee8b329963607e9c4101024b61be459dcf5754938c6c6a1b17b4a589d7942644788b05c13148530c97ca4bdf18410906c9d515c425359cd3609ce26560f25a579b817a4328417a79b5fc40c84c50a7d91a81dd60122599395bc633db6a6902035f9a33d7e890c22e30854b26d9ff5bb3c631cb89148b7a52e1d3397340c3e44494479e382b8194a767257ae89bae2a1b4d7c14fb1a68062f7619bd8582fa99f91d66b55d87ba740631392b45a709cb97b0856e76071bc5ceea3cad39aabd4b0ce9a9400db591783890af0042b43e44f4e7a527c21aa8372898dd26078752b73cc6dbe344d7d3b9a0244abdef61f4cd9cb9994aa39c2041c617a5f85a5f6c08a5438849ac83889da5987e23ebb21727950a243031bd5c06cd03538cfec09e6538aa42a89141125fe904285a901480a04cbba493b63a7e0f823c98a4c72a086507b5e1f2a60ac95c10a8c5a83b524d978c9e64b9c6d180692b23510809f6035851b039467686f98fa6760bc7010a6c1c968456d763f02097622d5b54febc61881472d7c5eec9834c1d304b8c94d89a04b5bb672302464a8bb43ac854e8f6cc0546a1d2016b8ad221bb2939e613ac5ae7b7ec9576d50265dd02ca683b69a6620cb87c08d6aab49a56c09219863134947f17c96f50cb2f01493d9d431672a68893b0f2594c204eaac6871242bd00365fc019ff1530ac10c7d1051489cbb2efb499b888497a61615f25144db1943c03c99eca96009a749c44a7709cdaef18047282ac9615b04b42318a2ac01d834c447a9ebfc758b469e7fe43355903a9cfc9bf830a085538631c6553432cddcc78900f35d3db7418a03951a0577235b9f6036b23b3269c64bceebba4bbd3c1592b541c0857c93d14eb1a5231e74532273b1bc666e2484b42e4b5e0fa32b2337362f60c73e5a80d6ab7ae78a7cdbca4a8be5ae94c063489a2469f2b09c8ba6f2e92459768c30daa218c387107ba32d6a072dc63bd9a38ececb571988c727ab0fc332835aca1925f4c1f2210b006d96cd2a7e1c4caead7ccd55b05931b3b94f9c02fa2651b750b79f227eef59a6173936fe4814603bab0589b771d17c12778bcccc4309f67ddeb95b4b873c81f72a0783a8ee123ff5b6235a56b486c768bd8113a4f09d19c9af80fb98ef8b6c697b42e7bc009807762de9365391547cf822c07b869f49104ffab3098746da759ae3378961385521da9470a42c78073bee570feb4a9b14ecbe666a136462aaa0dc2ce173b61c625563fb50b5c9c2f208ba42e656d221431fab0a2868b154366db5e5b19a4822b0385936e4be96b2ad83013a904970efec5329f0a563f6406a57b82df2965b9ba492b29c678262e6829a11011478460d8da1a75d14972996bb8e0762237bbb8c9b044d0337cff8312ae18094082f7d6ca361d69bf0d004dffbc9d55b905f8359f421b4748328a9e722cacca07ffc210e7c35cd461abc069fe4d7980a570e83b01103b878491c200f70aa8bc71a296bb711acc2452c98f88810e75869ee4997bcc17a09712338f83d66b96161e908a4c4279a615ecbe2682349a21e55af66127ad08114b06709c724653d59561aa249c1c050b08c13974211843ba4e1571bb9c8a547e2a3fcd25e3866653728bd57a8c9c480404295819e559ae6727d81d61b785b7817dc3b67560db36c2b0509976ff39435869e49044987fc4d92b9bfd07a37fa08193057aecf585734280d0201a0ea237da26b5741f528dfea6a58d291a5d5543be52d31b5468b82143e754d0714747981aea189025a8931eba7a0ef2561bb0860b8c2442285b4ed22b40c882f19350789642bdd6797e8d98566eb411221a425f34c73aacf92e0a5d8b35272302b815041833b29b1a409d1087b6ef00197893f3b2a93ff61646d77c0c5089f93ec7261347a871c9e7559c11677a84cdab7598c3bd2709e9df33186954682b7ae1f888043a738cd906cab0a06ecb74badd6b303eaaa5ed261e51009c867b8548a84b4ca62845b9f7b9aae1f4107caf9cd2b43469185616ab96b2c09438f06ad95b5605c646b67a8b88b5587fcb0235656ae23d0530fe996bfb691429716e46a2bcd299573c80d7c37ba4fe14e38d556c3281a1b416b2996cb9aacb059345aa6ec078714c52fd3b01d176f r = 0120000200d0001000fe0cd0002d00000d00002000000d00000d0003f0cf000000000d000100d0020000002d000100d002f0cfff0c000100d0000dd00000d00100d0000000002000001d0001200001200003f0cf00e0cf00f0cf000dd0ff0c00021000001d0001000001f0cf0100d0ff0cd00100d0000d0001000001100001f0cf0100d00000d0000000ff0c000100d001100003f0cf0000d000000001000001f0cf002d000200000220000020000210000000000200d000000002100000f0cf031000010000002000000d000000d0000dd00200d0000d00ff0cd0000d00020000ff0c00010000000000000d000200d0021000000000ff0c00000000000000001000000d00021000020000032000fe1c000100d00000d0000000011000000d0000fdcf00fdcf0200d001f0cf00fdcf0100d0010000002d00000000000000010000010000020000ff0c000100d0021000001000011000ff0c000000000100d00200000100d0000d000000000100d0001000ff0c0000100002f0cf0000d0011000000000010000001d00ff0cd0000d000000d001000002000000f0cf000dd0001000000dd0ff0c00ff2c000000d000000000200001300000100000fdcf00f0cf0000d0003d000000d00110000300d0001d0001100002e0cfff0c00001d000000d0000dd0010000000d000100d0fefccf000dd0000d00020000001d000100d000f0cfff0cd0ff0cd0000000000dd0022000000000000d00020000ff0cd0ff2c00000dd002f0cf02f0cf00f0cf002000000dd0001000000dd00100d0002d00ff2c0001f0cf00f0cf000d000100000100000210000100d001000001100002f0cf00f0cf001000000dd00000d0ff0c00000000010000002000ff1c000000d0021000010000ff2c0000f0cf000000001d00000dd00230000100d001f0cf011000011000032000000dd001100000000000fdcf001d000000d0000dd0000000000dd0030000ff1c00ff0c00ff2c0000e0cf01f0cf0100d000f0cf01f0cf00f0cf010000000000002d00000dd00000d00210000000d0010000001000011000001d00002000 NTT(r) = 8ed81b00a3474f536d9254be888958edc6ce34a4864e37a69439bf5f98982e3433a187aaa98503ab0c7bbb2a8e47a41c24988eaff40802c9ad4a81ae6189cdb851cf7c350b447b05f1e0ac2044a459e3aed2441fc587739b11c88d61538c573b6bb33f8b3320d54c7241043a1c1a26e771441893657b1a3d4dab4f5f754335062fb014a66efbb13b4872a0761b6497cae58c5434f7c75d2a43e1c22b25885ce6281783891aec5c2aef2aa869dc28bfea0c71db10b3158603a68017465e8e8b7c82e53fda6622a8412903d34013f3960f0324c9f3218056ae7acaaf1d7968384c0cdd185ebeba5e6a38323e8c614d27ab7c494d2d584147e75ccee78596815f55bb4a8ae8b1ba7979fa031d5a7b2e72e42c9340cda6d926cf765506709e0a8298a3d6c92ab78fe6e35f58b4486ed1770b016e08c5219133799112518478b0cae45c8c91c5435acc38a115bb8128d6441f18867303f32f03ea45a83217747c72b80127cdfa4af9b95b4330a13ee6b33284940417a5b5692c4760b88c6a9cda3130cac056087c22b623bf270a116825a7baacc63e2997c26b820df40fac57203ea13652db3f4ec0957d90b5fd487fd4392d220c450988c84220ac3e54b4fd9186736bc7b3264fc8a4ce74d0b305376c6ff1088028660e030307802de0b7340fe3bbbac337608747911514e33545add502e8bac64142121cf5a6eca9253822b6abab8d914ba3a6f952f9c756cddacfeba2b499d42de47030c4fc8ac6bac603cbb3e64c11b6a3a494c5523b75af587928730a26bcf89bb8fc6dad8b769c322d54e597bc97685cf7a7cf6c8e08604e8a795bc2b53a58d4493b2c74cb792c1b61c319b976fe1ab5fd690ca49a97722a54a008064eaac08f4a102f6c7b136430439cb6f6885687aa89fde44568eb33fa446c6102154d12465b063cd9e3c489896912144638111f6b50435937b6762a173503b180839839f1a2c29769494cca2d4482dfc480057672c138a3f20535f9db9e5703250785750841cbb70b74830c8c0ec2b9ef27beca7c93eb079c16bb7e5b3600a1573da415628536c29cbb80b2d0c1c9ec39 e1 = 0000d0ff1c00000d000000d000f0cf002000001000002d000100d00110000000d0000dd00000000100d0001000000d00020000012000010000000d000100000000d0000d000000d0000000010000001d00000dd00000000110000100000010000000d0000000ff0c000000000000d0ff0c0001000000f0cf0000d00000d0000dd001f0cf0010000100d000f0cf0010000110000100d001f0cf001000010000000000000000000d00fffccf01f0cf0010000100d000000000100001f0cf000000001000000000000000ff0cd0001000000dd0000000010000010000000dd0000000000000000d00000d00010000000dd00100d0010000021000000000000000ff1c0002000000fdcf0100d0000d0000fdcf011000022000000d00011000021000ff1c00000d00001000011000001d00001d00ff0c000100d0000000ff0c000200d0001d000000d00000000000d00100d0020000001d00000dd0010000010000000dd00000000120000000d0010000000d00011000ff1c00001d00ff0c00000000fffccf021000000000002d000000d0001000000dd0010000000000001d00000d000120000120000000d00000d00000d000f0cf0100d00000d000f0cf000d000100d0020000000d00011000000000000d00000d000000d0000d0001000001f0cf001d00000dd0020000000000000000011000000dd00100000000d00200000000d0020000000d00000d000100d0020000010000000d00ff1c00010000002d00000000001d00ff0c00000d00ff0cd00000d0ff1c00001000ff0c00ff2c00021000012000010000001d000000000100d0000dd00000000000000100000200000010000000d00000d0010000000d00010000000d00000dd0021000000000010000000d000000000110000100d00010000000d0ff2c000100d00000d0011000000dd0ff0cd0000000001000010000022000002d00000dd00100000000d0ff0cd00100d00000d0000d00000dd00000d00100d0001d00ff0c0000f0cf001000ff1c000010000100d00210000200d00000d0000d000010000100d0000d00000000000d00 e2 = 001000ff1c00000000002d00000dd0000dd001f0cf000d000100000000d00000d001000000f0cf000000ff0cd0001000001d00ff1c00001d00000000000d00000d00011000002d00000000010000000d000200d000000000f0cf010000000dd0000000000d00001d0001f0cf000000011000000000000d00000dd0011000010000010000ff0c0002100001f0cf010000ff1c000110000000d00010000200d00120000000d00000d00000d0ff0cd0000000000d00000d000000d00000d0fffccf0000d00000d00110000200d0002d00ff0cd0000d00010000ff2c00001000001000001d00ff0cd0010000ff1c00001000000000011000001d000100000010000000d0000d0001f0cf000d00000d00001d00000d000110000100d0002000ff0c000010000100d00200d0001d00001d00ff1c00ff2c00000dd00100d00000000010000010000000d0021000ff1c000000d000f0cf000000001d00000d00001d00011000001d00010000001d00020000000dd00110000000d0001d00001d0000fdcf u = aaeb4a983538688494a536642866396702a08d24533651bee94c3948411323dc3b11f1b3458662e243371b223eb9395ebad549129a8b9462b3fba20bd2b8a77b112e8848122a12ac080363f0069fcdc041aebba5936b4392e1a1e33c449946c08404b402a63a09413474e7240bd1896872c33433552ea17887b3c48ef5ab69a146aa01b3d504b40a737a3c231edc169947d0bb6a84b087102daf51a448c0a6174b6e37a159bd598142089481502d1d3b2c2036c9397b90bb216a917ca6d4b2bccbf1829f976230636c2c4521e705b2eb1cb495e5446db9b4727bb7031672291802b90a1b2ea64b336c55a39cc9873c5450dc17938321c62c7453bb4eb16c745397a38a3967f6357a29564aa2870763a869383184b4551137c88a4cd31cbe503bd2c99cf8e58e96db502cea04914c4ae320805f570d77c08d0d9131e4a207d974071624214c253e1c4805c7d93f4cb210f92932dd361a6dac8a38c9001324890a089846cb1ee8dc66c04b6f4a46713db587c128998609bfd7c9112cda16fb11187369cabb98c7d8f2026ff17e174ba9fda1b7fa550183d49bcbb3b0ea39486fd8164bc1682f9a874d02c4f258752fb0b4d908393a5a2ea4b40362da57d2b00f9656613aec474e3030ac933240a98db32c3e45619b240762390599980a9565e0038b1abbe8c736a0d74c95e915ed8b18849c2c07342af6cb4298969e87a44c4ca02efe822cc18cb05aeacd9e210d28421f038b2decb27659595d1ca083536150af68ab92366eb26098e4f0ba6367c2e768bdf4fa8894b19b2da06ae91a03afa36e38f293199b1eac3b5d4ea1062b16799b9612580c13040921e16453bf64321311669e79668d852649b6630cc67dd2090ce9171fad0c60cf000566f86d520baf4a1b2fa572074d66840b269bb297a3475b602d72a11e6a807659a2c41497e7b8b140681c16213c3e5042681cb780d812a1d95b379279ded29fb53b7b65362cf0629ee00641df7a846bc7b05ab248282910d26233101c20b42885ffd50726b540b1405293a309427bb861dc60ad25c048244fd4888873101b70a41fc4594c5f59cc u[0] = {2986, 1198, 1432, 899, 1128, 2376, 1701, 1603, 1576, 918, 615, 2560, 1165, 1330, 310, 3045, 3305, 916, 328, 308, 3107, 957, 273, 2879, 1605, 1576, 994, 884, 539, 994, 2489, 1507, 1466, 1181, 2578, 2233, 660, 2870, 763, 186, 2258, 2683, 379, 737, 2184, 292, 554, 2753, 776, 1584, 1776, 2544, 205, 1052, 2990, 2651, 2963, 1078, 402, 2590, 3299, 1091, 1689, 3076, 1156, 2880, 1538, 938, 265, 836, 1908, 590, 267, 2205, 616, 3127, 820, 1363, 302, 1930, 903, 3147, 1422, 2751, 361, 1130, 426, 2864, 1237, 2880, 778, 1959, 828, 482, 1756, 2449, 71, 3005, 1130, 2824, 135, 721, 431, 2629, 72, 2668, 2839, 1764, 311, 1434, 2493, 2069, 2114, 2368, 129, 725, 2845, 707, 1568, 3219, 2873, 2311, 443, 1698, 3217, 2663, 724, 3019, 459, 2095, 1951, 1577, 816, 1734, 1324, 532, 1511, 2848, 3307, 2881, 1429, 1102, 2413, 2891, 2930, 2935, 1539, 1825, 2089, 33, 2745, 432, 1582, 1210, 3123, 1366, 3235, 3225, 3207, 1347, 3152, 381, 915, 536, 3270, 1858, 2899, 1259, 3249, 1862, 1875, 2617, 2442, 1651, 1526, 1955, 1577, 1189, 1954, 120, 2147, 1690, 312, 2115, 1460, 277, 2103, 2220, 844, 461, 190, 949, 2514, 2508, 1528, 2286, 2966, 1293, 2604, 78, 3217, 1188, 227, 2050, 1887, 213, 119, 2268, 269, 793, 740, 122, 1241, 119, 1046, 530, 1356, 994, 2076, 84, 2503, 1021, 588, 267, 2553, 802, 1757, 419, 3181, 2218, 2360, 12, 1043, 2194, 2058, 2432, 2886, 492, 3304, 1645, 3008, 1780, 1610, 1812, 1341, 2171, 2241, 2450, 2438, 3056, 2519, 284, 2604, 365, 507, 385} compress(u[0]) = {918, 369, 440, 277, 347, 731, 523, 493, 485, 282, 189, 787, 358, 409, 95, 937, 1017, 282, 101, 95, 956, 294, 84, 886, 494, 485, 306, 272, 166, 306, 766, 464, 451, 363, 793, 687, 203, 883, 235, 57, 695, 825, 117, 227, 672, 90, 170, 847, 239, 487, 546, 783, 63, 324, 920, 815, 911, 332, 124, 797, 1015, 336, 520, 946, 356, 886, 473, 289, 82, 257, 587, 181, 82, 678, 189, 962, 252, 419, 93, 594, 278, 968, 437, 846, 111, 348, 131, 881, 381, 886, 239, 603, 255, 148, 540, 753, 22, 924, 348, 869, 42, 222, 133, 809, 22, 821, 873, 543, 96, 441, 767, 636, 650, 728, 40, 223, 875, 217, 482, 990, 884, 711, 136, 522, 990, 819, 223, 929, 141, 644, 600, 485, 251, 533, 407, 164, 465, 876, 1017, 886, 440, 339, 742, 889, 901, 903, 473, 561, 643, 10, 844, 133, 487, 372, 961, 420, 995, 992, 986, 414, 970, 117, 281, 165, 1006, 572, 892, 387, 999, 573, 577, 805, 751, 508, 469, 601, 485, 366, 601, 37, 660, 520, 96, 651, 449, 85, 647, 683, 260, 142, 58, 292, 773, 771, 470, 703, 912, 398, 801, 24, 990, 365, 70, 631, 580, 66, 37, 698, 83, 244, 228, 38, 382, 37, 322, 163, 417, 306, 639, 26, 770, 314, 181, 82, 785, 247, 540, 129, 978, 682, 726, 4, 321, 675, 633, 748, 888, 151, 1016, 506, 925, 548, 495, 557, 412, 668, 689, 754, 750, 940, 775, 87, 801, 112, 156, 118} c1 = 96c7855b455b6dbb607be569d4cbc46665f645eaf96b54c617bc9b4485ddee95271344a6c8e42f74c3ad95f1abcbccbd4e0eb7e65cc738a06aa1cad3ef9c27e2c33f1085f9cb8f33c547c7f74385a0ec64d99d5d485204b4642d5298da8bf0fc8cd6859416215f9bd36f703548dc7dd9fdce96ff50c261bc1670ce55d92a785348ca16d49cf68760e4f62f9f8a628bc2376b67239ef7741f8b8882decffc4de88d108a6579fb54781929d1b19dbfddb84d656ede851f9e5d8c832ac07421e7d1153c69e383afbd67cad7915129eef3c8f760e7f71864c9eff2575d96e5b9956509942208c6a2c15571e8aa0439a20349050f6cddaf903b163206deb765c49d440a5182ae53d0438e097e9520d428a1c9f4a70602eb548b1411dfc36120d2ab6a2d01418d9a27bb785f82bf7e9d93f85e8b9c711aabbceeb27ef01521c3c1891de892ffaaf5e03810479c6907dd09e2d71930d6bf2b99ddf05898c2610681226f5a4bf1c006e940deb9665432396d4920336c413471e077c38b85413b21e5836daee8cb4446bf328ab759bc4277fbc1043e67fe664358ea352f1babe7a1fd363d41e37a5207325c565e1794c3ce36ec97fd72fd7f04a18a266383630e92e02e9700a26830c6ead2057a7883bb46606e64efbd92feb5a87cf8eb40835b3f201288af60abb625972f774608e65189e016cc7b61ac28806966173e55d8572f7eb5f5f2de7adcad59f00e6f66623e7640645069877b779d373ad09400dfa2dcedeb65c9786bb7cac61de399eec7779ddbebda8a3262054a1318157de19d76612f71ae5829cec49a7b895f36e72cdc215058338aa4d9b99815ed13def463bb27ad3e8a9d0995f964436519bd7037e3cf73f79bec5115762ba82314d2152701e325aefb v = {600, 669, 1463, 1988, 2661, 2401, 1809, 2360, 352, 1372, 2581, 247, 2484, 1425, 232, 1772, 2463, 2480, 911, 1705, 581, 1200, 2947, 693, 1883, 1279, 2146, 2354, 1078, 2587, 100, 2836, 3060, 2332, 1478, 2153, 2875, 2252, 1746, 463, 2473, 2354, 1959, 763, 1157, 1161, 1868, 1020, 1223, 2808, 3001, 862, 1884, 2868, 2488, 2666, 2277, 2659, 2631, 3192, 1715, 594, 2859, 874, 923, 2079, 2903, 1768, 167, 2181, 1141, 464, 2333, 2141, 1791, 1739, 687, 2152, 1230, 2282, 269, 2901, 4, 2676, 1858, 1266, 2267, 515, 414, 1528, 2223, 1743, 1478, 188, 219, 292, 267, 278, 134, 280, 2698, 1010, 2367, 461, 2587, 3083, 1015, 3302, 2049, 1128, 526, 1395, 2672, 2354, 628, 2537, 1983, 1533, 3301, 1503, 479, 3135, 857, 235, 2570, 1048, 2798, 1473, 993, 130, 1171, 2058, 2316, 1958, 3001, 233, 2048, 2224, 1450, 2712, 304, 1611, 3148, 2690, 571, 2102, 2611, 2430, 1063, 2245, 241, 844, 2360, 1595, 2625, 470, 1939, 461, 1937, 1842, 672, 551, 1624, 1023, 1475, 955, 1345, 512, 1735, 3192, 729, 1619, 391, 2047, 2317, 3266, 3153, 1233, 131, 1249, 497, 1253, 2006, 928, 430, 965, 2438, 3228, 2880, 1269, 1902, 3007, 2647, 207, 1924, 2340, 2735, 743, 729, 3147, 3103, 437, 3095, 2247, 2736, 3230, 3199, 91, 3030, 1211, 2374, 524, 3187, 2252, 1222, 152, 3223, 2390, 3151, 2208, 2861, 873, 3229, 3201, 784, 110, 1227, 2389, 807, 895, 2484, 2395, 2063, 846, 3280, 1325, 203, 1742, 2342, 1601, 277, 584, 2911, 2163, 1208, 3155, 2506, 755, 2306, 2319, 3264, 1283, 2109, 2649, 3046, 523} = 58d229b7457c651a9611879360c155157a0fb41959e8c06e9f099b8f936a45024b835b2b5bf74f62289336b4a16440b1f4cb91c695863bcb8cd2f61ca92993a7b72f8594484cc73fc784afb9eb355c47b3b8a9a6e538a6478ac7b326252bab369bf381578b6ea7508875041d1dd985ffb66caf8286cea48e0d51b50440a742274fdb38209e815faff86cc6c50bdb40120b61118680118a2a3f3fd91c1bbac0f763ce0188460e3257702a9374929ebfd75fe5fc5ddff1c359b30e0a8a41ee1a5ce1230893a4800c697ab99b0e00088baa85a930b1644c2ca83b628333ea9727548cf1c03438b963416a1d93d71c912773a0722258f63fc3b53b410520c786c7d9326587f17f0d29cc511c4d83104ef1514ed6073aae513c86c9c9405b4f6ef7bb57fa0c844792af7a2ed9b2c41f5c1b177c8cb0eac97fbc05d6bb4b46c92073cc8cc68409976c954f0c8a2d9b369d1cc810e306cb549527f337b4b9950fe834d0dc52cbe06c2619641581245f3b87b834c5ca392f02f990c03c503d98a5e6bb20 compress(v) = {3, 3, 7, 10, 13, 12, 9, 11, 2, 7, 12, 1, 12, 7, 1, 9, 12, 12, 4, 8, 3, 6, 14, 3, 9, 6, 10, 11, 5, 12, 0, 14, 15, 11, 7, 10, 14, 11, 8, 2, 12, 11, 9, 4, 6, 6, 9, 5, 6, 13, 14, 4, 9, 14, 12, 13, 11, 13, 13, 15, 8, 3, 14, 4, 4, 10, 14, 8, 1, 10, 5, 2, 11, 10, 9, 8, 3, 10, 6, 11, 1, 14, 0, 13, 9, 6, 11, 2, 2, 7, 11, 8, 7, 1, 1, 1, 1, 1, 1, 1, 13, 5, 11, 2, 12, 15, 5, 0, 10, 5, 3, 7, 13, 11, 3, 12, 10, 7, 0, 7, 2, 15, 4, 1, 12, 5, 13, 7, 5, 1, 6, 10, 11, 9, 14, 1, 10, 11, 7, 13, 1, 8, 15, 13, 3, 10, 13, 12, 5, 11, 1, 4, 11, 8, 13, 2, 9, 2, 9, 9, 3, 3, 8, 5, 7, 5, 6, 2, 8, 15, 4, 8, 2, 10, 11, 0, 15, 6, 1, 6, 2, 6, 10, 4, 2, 5, 12, 0, 14, 6, 9, 14, 13, 1, 9, 11, 13, 4, 4, 15, 15, 2, 15, 11, 13, 0, 15, 0, 15, 6, 11, 3, 15, 11, 6, 1, 15, 11, 15, 11, 14, 4, 0, 15, 4, 1, 6, 11, 4, 4, 12, 12, 10, 4, 0, 6, 1, 8, 11, 8, 1, 3, 14, 10, 6, 15, 12, 4, 11, 11, 0, 6, 10, 13, 15, 3} c2 = 33a7cdb9721c7c91cc84633e69bac5e0bfa7be28bc496659d64ee9dcdbfd384ea48ea125ab89a3b6e1d0692b728b171111115d2bfc055a73bdc37a70f2145c7d15a69b1ebad781dfa3cdb5418b2d299933585726f884a20b6f61624a520c6ee91db94df42fbf0d0f6f3bbf16bfbf4ef014b644cc4a60818b31aef64cbb60da3f c = 96c7855b455b6dbb607be569d4cbc46665f645eaf96b54c617bc9b4485ddee95271344a6c8e42f74c3ad95f1abcbccbd4e0eb7e65cc738a06aa1cad3ef9c27e2c33f1085f9cb8f33c547c7f74385a0ec64d99d5d485204b4642d5298da8bf0fc8cd6859416215f9bd36f703548dc7dd9fdce96ff50c261bc1670ce55d92a785348ca16d49cf68760e4f62f9f8a628bc2376b67239ef7741f8b8882decffc4de88d108a6579fb54781929d1b19dbfddb84d656ede851f9e5d8c832ac07421e7d1153c69e383afbd67cad7915129eef3c8f760e7f71864c9eff2575d96e5b9956509942208c6a2c15571e8aa0439a20349050f6cddaf903b163206deb765c49d440a5182ae53d0438e097e9520d428a1c9f4a70602eb548b1411dfc36120d2ab6a2d01418d9a27bb785f82bf7e9d93f85e8b9c711aabbceeb27ef01521c3c1891de892ffaaf5e03810479c6907dd09e2d71930d6bf2b99ddf05898c2610681226f5a4bf1c006e940deb9665432396d4920336c413471e077c38b85413b21e5836daee8cb4446bf328ab759bc4277fbc1043e67fe664358ea352f1babe7a1fd363d41e37a5207325c565e1794c3ce36ec97fd72fd7f04a18a266383630e92e02e9700a26830c6ead2057a7883bb46606e64efbd92feb5a87cf8eb40835b3f201288af60abb625972f774608e65189e016cc7b61ac28806966173e55d8572f7eb5f5f2de7adcad59f00e6f66623e7640645069877b779d373ad09400dfa2dcedeb65c9786bb7cac61de399eec7779ddbebda8a3262054a1318157de19d76612f71ae5829cec49a7b895f36e72cdc215058338aa4d9b99815ed13def463bb27ad3e8a9d0995f964436519bd7037e3cf73f79bec5115762ba82314d2152701e325aefb33a7cdb9721c7c91cc84633e69bac5e0bfa7be28bc496659d64ee9dcdbfd384ea48ea125ab89a3b6e1d0692b728b171111115d2bfc055a73bdc37a70f2145c7d15a69b1ebad781dfa3cdb5418b2d299933585726f884a20b6f61624a520c6ee91db94df42fbf0d0f6f3bbf16bfbf4ef014b644cc4a60818b31aef64cbb60da3f uᵈ = a80b4b965538688494a4366429563966f29f8c24533561beea5c3948511324cc3b1101b4469662e343371c323eba495ebac549129a8b9472b3fc920bd3a8a77c212e8958122922ac09f362ef269fcdd041afaba5927b4393f1a1e44c449b36c08504b402c63a0b413474c7240bc1896672c33323552eb17888b3c48de5ab69b146aa01b3d704b409837a3d131edc069948c0bb6b94b089202db061a448d0a6165b6e38a159bd498141f89382502d1d1b2c1f26c93a7b90ba116a927ca6d5c2bccae1829f976230536c2b5521e805b2ea0cb496e5446ca9b4718bb70206722a1802b80a1b2f964b345c55a39cc9852c5451cc17928321c64c7454ab4eb07c745497a3893967f5257a29664aa2870762b869384184b4451137c88a4de31cbd503bd1b99cf8d58e95eb502cea04923c4ae430805e770d78d08d0e9131e5c207da84071724214c353e1d5805c7d93f4cb210f83932dc361a6b9c8a38d9001424890a089847bb1ee7dc66bf6b6f4936713bc587c038998609bfd8b9112cca16fb01187369cab988c7d8e2026f017f164ba9feb1b7fb450182d49bccc3b0eb29486fc8164ce1682f8a874c12c4f148752ea0b4da2839395a2ea3b40363ca57d3a00f9756613bfc474e2030ac93323fa98db33c3e45719b23f76138059997fa9465e0038a2abbe9b7369fd74c96f915ed9b18858c2c07442af6eb4297869e89a44c4b802eff822cc09cb05adacd9d310d29521f038b2decb27659495d1db083527150b058ab91266eb36098e4f0ba6477c2e768bdf6fa8893a19b2eb06ae91a03af936e39f293198b1eac4b5d4fb1062c26799b8612582c1304f920e05453c064321401669d69668d652649c6630bc67dd1090ce9171facec5fd0100565f86d51fbae4a2b2fa482074c46840b069bb297a3475b602c92a11f7a807669a2c3f496e7d8b141781c18213c3e4042681cb77fe812a0d95b368279dff29fb52b7b66162cef529edf0641df8a846bc7b059c248281910d26233102c20b31885fec50725a540b05052929309448bb862bc60ad35c048144fd3988872001b6fb41fc4694c5f69cc NTT(uᵈ) = 2c622f3ec163ec18ac66a8938f2a40fd982a453c50bc7c627ad03b775cbc47549a7ba6a543e40a5336a56c0185c2b65e8c19b562b1b836d3a61a865b92640a95fc3f55e90f5cd350151a18a0fa0f180c4c91215a8d4612b62c36be089174c45a3ac1957e8525d562484aaa85697a5975521939052104cab9fbc39d61694378fb58338b435c14536016842974bb3580b659e847a7a3b327a58ab232888549927c0a3e3892af0007cdb03a0bfe8bae8eb09f14454a2241a4e1f29793774b3b578d65d43c064a8bbfb3a82019b4e5072565b37cba2740afe6911dd3425648ba98067edb29cec703c0a1e9796d750de4f34eeb9500a642170fa118a0fb7ab298ab352a19e2ebab17626616e96f094422d18968864b7458018120227c0082408f086cddc2038016977dd6c3f52c4f662b6aaa6ac32e71254d51c9f26111beec9c037517ef0782c8946c613a86bf1b166eab1e5e325731b62c1f9a25acaa136a7899cf3529b954239ad54274b2c1b0b312bc166b0164956e244177f2c13ab48a6d8132b2ea6e36d54578b3ccae73c102a1746f510c8fb604ef23989bb0ad912ab467d13892a8469d7120b0e716dbf7bef19ab2c0966da8118fcde2a9514128e54c9ac4413b2235ade5a8194d3b3ebd6757e3f9cb00900a80e15c2bf3441bd11e2e233687b935c5347984b5b303ac103c03bdff8814251240c0fc7d2f58b6e7829153584aea5573e8aa2939192e9bf164ebd79f532640de2a3305a51ddf579edf9731e0626a4d3c2e60e7531d8b412db7b3a51705c8366b46b5aa3d356b490040cb0887fee83ee5a09739c17c7f3c63f917553eb0795888ccac2230d0eb923c75772dda23f93bc9670c8f5b9545d63c4f366578e97570225a00596527c5b6182db72b5ee12edf0543b2a61b8bcaae21f8522c7159800214224c9b57d7caea882c2f7345a2633df0725e2a93832e7a2a873b122d8abed6317c0a118085c57f5876b8be7c6feae8762b336de8a2c59e321c892c0bf55b186df34557f94161eb47226379b552478fb0600bba44badaa71c4ca529047337b8c511e5bfe5d35b86707ad5ca8f vᵈ = 700227b01582911a9c51178fa0015bc1090dc1095bd01075c1199c40136870024e610b2751074e21188f10149c0010b6311c8fb01582611b8f81061ac1198f510734e0044e510741e014a9610b345117b6c119a9f118a9911ac3810627610b34401382611b68d0108210041af11882511768701282e0148fd010b60010a951074ef1081aa0015bf11868b0050dd0000dd0000dd0000d910a41f1081ac119c310040021084170025b911a8f70129c21085b00005ba011c340030dc10941910a5b10040de01482f11875610b0d21188fb015a9d01068311ca9701282911a9c10148fd00034f11868910a1a51071a511775700227810641b00541e0041a8116c3401368a01182f10800310c4ed0004ea0014e210834a00141c10900610b4e5117b6910a0d51178f910a344013c3310c1a311c8f910a00310c00310c4ef10827311c8fe0040d311c8f311c8f610b340010c340030de0148f400334c1199c21083400004ed01068f11868d00027611b82e014c3c10934f1188f00004e2118a9310c27 w = 71d6634f0609da2c6af2dc68e916ce94dc0124a00460760250800216666be5ec6655f6601680ced2ec03cf3c618a4c0980405fafaccd0da00173dcc909606256666c01177032c06cc806621d2664f22c668816029ab671e75667e3ccced836cf5e26672746cd2dd05d4fcc63b2dccf866002b46c5fee16020ad668cc560086d6664220c97cf660db0601b5e66b2c3064b94c0071f0cad5966b8cc662955c05c2e6cf36f068c296cac4b66120a6637d60c646c60074966af13c01bf3c00a38c68b7d66bdc766454665d985cceb7f005ee4c6c5ecc69cefc6aa6966489000223106bb8dccc7d8c69d7b6ccb10c680c366dba5c04ac7c00b4a673b2ccc9bfbcc79e3000ecfc0582a602ac3c6936c0687276c7dcecc82dd6045a107193f662b0dccbcf5664c54ccf2a66021b8766892c005e26cf14306b939ccc812008f4356f4dec047c10cd04d0614f566d4a7066ffd6c2383071f40cce2b10cca63c6d06f0cdc0b6cc0fe068198068f2ac02d6ccc89b5665b7dc0c6b166844c06705d66b3a906c KBar = d08b06e61415a845c0fe5447ba9b22072130d897fd7117457a9060121955a1e5 fips203-0.2.1/tests/cctv_vectors/ML-KEM/intermediate/ML-KEM-768.txt000064400000000000000000002065631046102023000222750ustar 00000000000000d = f688563f7c66a5da2d8bdb5a5f3e07bd8dce6f7efcec7f41298d79863459f7cd ρ = 26ffff11b531b1800f4e1fa75c4d008c4f9a112932c669d543551204405da8b4 σ = 6de0c01beda8a2ba3f697c1bb8d5a46dc2ac63880c4f9b57db9f10534cef9a42 A[0, 0] = {1413, 10, 604, 2877, 3203, 1546, 1604, 1174, 616, 1275, 2938, 394, 1529, 420, 397, 2532, 619, 1129, 2868, 294, 2356, 2288, 1330, 2649, 2530, 1123, 2119, 3163, 1542, 2725, 1282, 2023, 3308, 1299, 1987, 2334, 726, 3141, 3114, 1371, 667, 1415, 99, 2891, 2749, 1816, 584, 2813, 1463, 459, 1848, 185, 1602, 2052, 3209, 3220, 495, 851, 905, 3314, 2542, 658, 1122, 1500, 663, 1044, 493, 1593, 1541, 3202, 836, 2236, 281, 829, 2078, 517, 168, 2997, 845, 383, 432, 2232, 3267, 324, 1024, 1450, 2805, 1484, 1362, 39, 956, 974, 2289, 1780, 3227, 2180, 619, 1941, 3313, 267, 2992, 1172, 3292, 2044, 1272, 821, 2785, 697, 2584, 2497, 1377, 3075, 3040, 1149, 2763, 1577, 142, 1624, 1186, 2703, 166, 1986, 2618, 3051, 1146, 402, 2003, 1391, 585, 1617, 646, 2176, 3262, 1603, 1543, 2426, 2188, 1624, 1727, 2735, 335, 2465, 1106, 803, 2364, 500, 31, 219, 1922, 126, 917, 1821, 3033, 699, 1866, 2205, 1098, 3229, 2689, 1060, 3256, 1558, 1545, 3206, 678, 672, 1430, 1052, 2905, 3299, 612, 1960, 2661, 2527, 2546, 2593, 3153, 3168, 922, 2152, 528, 3076, 746, 3246, 1601, 779, 2135, 2877, 1892, 946, 2771, 354, 3081, 2793, 3314, 1840, 822, 3124, 2778, 2066, 3188, 2553, 125, 413, 2694, 2297, 456, 1415, 40, 1073, 51, 476, 1759, 752, 1244, 3141, 1886, 1189, 1274, 2352, 514, 1853, 2527, 3161, 1094, 3105, 1794, 1454, 1970, 2704, 2253, 983, 68, 669, 766, 2535, 259, 348, 2019, 3290, 3261, 1379, 3102, 1277, 401, 110, 2539, 1702, 588, 2866, 1895, 1203, 1371, 239, 2622, 2237} = 85a5005cd2b383ac6044664968b24f7aab18f9451a8d419e6b9246346b1234098f3295a5e2394647b8c50656aa02757eec3c51c3e791d652c42abc559b725863b0b4bd8a7148d2afb7b51c38970b424680894cc9ef31358923cfee292962c45d974241ed91630526c844c38b19d1331e5820a850bb4df317b0818bc34c1400a45af5ca5c527502bce33cf1486f9b4c886b5279f1bc10b04b49dccc7ff85433e19a2b181a9c6135c0e0db47cb9a628e8065a2f4a8a6207c3ababe7a2419d3f756491265860288be3c6407a6978c8865bff6aa4f119a5234323c491f1fb00d82e70795d371d9bb2b4ad7894ad4c9814a42b86c610966c8a6022a96c541593bce64827a65fa9df219a2510cc69a83861042c0eae2ca41b63057d8b364273bd32a16099caef20c733643c3da2a81749c9f7dd019869a8fc8715828104333c01ddf062fdc54c45e574afa049302d273df99c54614c202e75ab207a9cd783d44d029fe729e03c115e3a7cdbd3c561edc4f91e106eb696a4c22b367374b5bf50e3eda8b A = 85a5005cd2b383ac6044664968b24f7aab18f9451a8d419e6b9246346b1234098f3295a5e2394647b8c50656aa02757eec3c51c3e791d652c42abc559b725863b0b4bd8a7148d2afb7b51c38970b424680894cc9ef31358923cfee292962c45d974241ed91630526c844c38b19d1331e5820a850bb4df317b0818bc34c1400a45af5ca5c527502bce33cf1486f9b4c886b5279f1bc10b04b49dccc7ff85433e19a2b181a9c6135c0e0db47cb9a628e8065a2f4a8a6207c3ababe7a2419d3f756491265860288be3c6407a6978c8865bff6aa4f119a5234323c491f1fb00d82e70795d371d9bb2b4ad7894ad4c9814a42b86c610966c8a6022a96c541593bce64827a65fa9df219a2510cc69a83861042c0eae2ca41b63057d8b364273bd32a16099caef20c733643c3da2a81749c9f7dd019869a8fc8715828104333c01ddf062fdc54c45e574afa049302d273df99c54614c202e75ab207a9cd783d44d029fe729e03c115e3a7cdbd3c561edc4f91e106eb696a4c22b367374b5bf50e3eda8be51127e38293dcd01397e236eadb3775c0114d2165f7d32d5043a283c58afbd358b335bb02a3abef72cf0e201e1c7cae95f7071a85b94b0b243f469d8b392318e85f018a96f75429657944b5c08b316153bacbcf52892a24e06ae01818d2c658d16b923f8a73831017b5d0ca6c91904e8b918cdb54957c2924fc9b3876cda87c3e0823290733717b8a98a9d9a85807a96a7a177e8c621f134b8440613ea936479b2a761ca47f522965fc136752447b06877007587b24a33c16af24a011e4b76a2112707399340a07c2f6b34f2a813929fcc06d75cf180a39c4898bf1b586f006986b8583e1790aeb0786d62381635c1e84d033b7b9aef43a4ff16a45bdb78073e832060a4720fa35048027fed98f1ba597a4d033d706312f92c7552a218b5a0af67847f3a83b9e1325ba522a57843686ac1e24849c41737d368bb9cd3622ec27a7e1432f81b37d44601e84f8b0736a4b22c243d5d3a78bb243445711076023c2b607932197b230892e900ced651f1b85b8bc836c14ea3b88a1c5154a8875b9037bd902438666c28c3717cbc9001d2b0a8263eac97db0858ecabc8a6732ae64378178a8baa954a9a1daca6ff930f51701aec28b8a9a502b3c68a0a52f30024ffbe929698a86e6758dd646afd98156825a793607b2ebdc29aef8290fa89503971556d63a665c7a3ea50af10791a2032d45eba531b2b41f675ab5a7c012610f3e94cf25d20a5f9950ae088b79192583e6bea1f073c2c7ca3b0aa5c7d8a8a7c905fc913129578a55e0217a6233e414c441d460a834bc5f85437f4b73d983927693665796090231813eb26365eb9237dcac2909a3d92c4888976eb8e684cb807d15e13f0a20c3d48c042544b06ee522d9c02baa6a295cf061c5e4819ae98ea999719d54844618921db3c9d69760401154818112e909a503c17f548323bd14bad132b60e02ad286113c9c3a75fe6b8eeba67092546752b99df66150685a7d6a24f9deb1c87a355c5860d86b6900e7b56e4db9bdbbc56655332b8a8b6eb789314117dcf91acb434720c14a5bf1c856e8a9ef70a095167b5d442479a8c7ee94278bc914763b3040db68ae9da02201733fcf6a724fc9ba037404b2b9888a865fa81757412b79f14473c106dc9909d2083c79b50c48dc3c8b0e331ddd7996e447e93c96aa175b74c484ac3b3cbd3301823c890f78727540830eff042f17534153a0e7ec6569ea9065c2b89934ac0d5402eb3baa0c667351b8058dca7625511c4753c0a30f33d79643b13663661a2588ac16652924835cac6ece1bbfa111895010959333bd9cc8b44b6cba956c2b980918f5906d2137dd0b04a5f770226c5a37eb9b004eb03a18b1f6556732dd300e0b20612c3b9e29a62b6b2bfcd153e3b928bd158396768a998671e7b2715498b8c538946fcfb84500b57c69ca2ea76afb0652cb4d9082a288984ac7e5493ac9e78c289d78816d3c882ab679cec9ad37cb42d24b182668d355b39ea428f81bc2ecee397d6f04ff74b89e2e4360c420d8868685122178f420d11400f1b0163f286a4605c0d3499b8e21909eff8ba6cf6c4e3780353d2252b8b2d40b1b26b2c7cb1e33e94db35a8db85773916b4459428d6bfa3707c2e079aae30012553ab5f10cbce648ae2966a4b125a5cdbacba165021a235b7ba8d655325adb92182b80df1b7259d821e9bd53f33baa30796b91b929401f1125044bf28b0ce510801b8b8a0f1a983e037cd8c712b4c971a6d05161d8b03cb362fc7640bdd14aa13dc218eb97db5f0cf3d56b99192c9ffacc5e271a8e7950202e7886d0a9e1c0c7aabfc2c0342a1d712b78f624e487a5173329a48298ce6292f0216bdf3317d2e2aca6fc6c8cda658fe67605ae36adf1a8c65da46e10c4b8f518cd08c9be4b269fd8c973f54bc3af1517c787dda30960e399d14fa247b6acaba19b609936c947b9278b7575c115ee7f91de7b30f18b94f3893b1cbf69c320b2f5f777438718738eb71b123a747500fe2483ee2517b7bc54184d6cbf286b30ff2865416542366ceb165891b7c21dcc102a487530440a2449b11d6817250020a658a717a69a388229984b65927c7caaba3b9f59917df489d95652e55a0c7f96a8c576acf1b8acb29d51969924bf1a4052efcba804b833a898e280868094c1b43b661b75924b512352471b350d67ee11cc9ae03419f477e090632ae50b7285b331f820816c01c0ba06249fb894f421909c12cf9555c96860471e32ed5b9306c99a5d1043dc83b730a58878e31146806a2ebb7cf666a519a3140af80107659a71b6108a1231e38e667dddb281b399dc3db72ebc3aa99073c778188b8f6243c5186ed7ca98f56b6730b63ba90a660e22ba9a7399d940b956a3955b456a84b3d269260c7702c12d1cfb008ba3250a06e04599da007a4d862da67251158b8a11484159b0b08138635e7691ab97d14e124af645a8a020c19a916fa4b3f5ec9ca4dc15772158ccbe416b3a1a5346b22c42c2901781f6cb9536241590c21b82ce31406257c4a7cab9fa988a3fc8fce8553a3889782c817a7125ab069c77ba586034ccf3bf702ba0103d7da1558b1b812f34aa9c88f12c63c81c72f45567a8279c74078a5337b67226586d79c5de2252690841e6d24c7cb86c20e5945f2550cae40a2ef112f0ed47b09f9cf5c139fb8ca9c41e54e0240cd6285c2e6826857aa523ba7cfd5304556b936bfa5a6fbf251df37cc8ef0b8ce04913739a3f681341809a0aee971b90201d0d9cb387011aaeb4960826964e2bc3562ad894c597caa5d26a6a804059fb7c9824d4b0f5c91181309797dd65c9ceb3845a98eb5ba224be121d2e0b12a86a83880355de16f9d585c0d655d899a8f3261afa2c478ff62749707829c9849f0f38cc40629efe7570ad1566b8a0d4e062e727c4398b241e638ba04d05384aba8a290b2a1115c9c5205e0d78b9bc38f72f11b06871a7e79746752998990aa59639992dcc07064134551584a823d7cab532578ca6b0aa167441dcb5653dd495d6d9b9587a64560f2c2bcb40427c10199c0043d734e4e7a837cf504d58793053b4290647502120ad74215a295946b7acce421be4d451fa8ca1d2ab2a3bd1542493686ced9c6a5e577d23b8d39c4bf40f27020c06158ebc01eb9934740c5956a1343f440b03ba287395964b674cd707af0085019c8c1c7843f630ab0d2b067c4548a6103946a55c1f80473f932a5f0dca3d9cb80bca99d51361fb6b38a1ea0abbed2864472622390ba1c10292dc4800e236cbc5ba64baa24d46cc7acf61bb5bc054f845d84921546b02c12e0c7a355cad8c74bfaca69a83caf69a4a8fc6b12d9ccc9cde8c11a7a73ae0a3b4540a1573723b3576b2728c5a1b3a26ab4b7dc20a3c6895fdbb97172441f3ea67313d759c1aa3a16a445babc116833197a7002e8f68c8d38b955690d4d87242e45a4b5a30970c5aa14a6cf8eb997d41c4513a472e42a27d52652d0d26c43c85fd35a80ed7a51e8c1b5a7d9a781f4079628aa39bacbe9885168c20b262a77379a66f3d96a5fd902c8ac84b211bd3c226a5197330ea0a55b9c7123f63fcd7516d3b559eaeab3e3ba54219bcdd205c051118bf3180049639b8b062bfa6345a51ccef4f8547b40cfe10375e69392ddf5bfaa59277bd25a75fb3750a42ec47a5f62168c78f2996fa9407f578674bb95b88504eb401541ac5fd3c424313b99d38b113664b9caa67abc06329a6c6a8a89ba04ccc347344983ec9f98d5a930a96ec0d15008810afdf576e068096634b025d46cb478b75c00058370a70eb4687051a225884a6dda99e995b9e987167706aaee9896ca0612d89243ad208c91a237ff9414b6803a7a3b08d70717974c3262e45a4f3a501d442571e095db9ab536382d212520abc7110501560592b4e6480730d0027dc1143aa3c517710b301b871fd3ba9f159eae036d95b62895d9774c9176844399da0a870b0b5c476c9921816d7573bf75a632f6f82aed27657ae18126ca646fa2a112602ea0e34bdb6092adea950ae3b610977639896e264396d87813af70a045b46040c3294d93415ab576d1316bfa6c2fe125ca886cb6177c9244823053b25bc13ac567b409c4273b96a9c375231f301486d70509a9d60e31982c052b34a9f3c381c0c615717f1460bbfc96856b60c143cc63e0c9c892e3c511ea09faa770fc028199c5528bc0761a3a34b1f82a9744a8f907652ce628683441ab5cb6c31947f2fc7378504ab630a4c85907c0030e33152bdb15c05944a99b170ae1f3615611c3793568340a740f537604bcae3a01cd3218674bd8a62dbcc35e6137ed4850d6355667c47a3bc255fef61a s[0] = {3328, 0, 0, 3328, 3328, 3328, 1, 0, 0, 0, 1, 2, 1, 1, 0, 3328, 0, 3328, 0, 2, 0, 0, 1, 0, 2, 0, 0, 1, 1, 0, 3328, 0, 1, 0, 1, 0, 3328, 1, 1, 0, 0, 3328, 3328, 0, 3328, 3328, 1, 3327, 1, 0, 3328, 0, 3328, 1, 3328, 1, 2, 2, 0, 3328, 2, 0, 0, 0, 3328, 3328, 0, 0, 0, 0, 1, 1, 3327, 1, 1, 0, 3328, 1, 0, 1, 3328, 3328, 0, 1, 3328, 1, 3328, 1, 0, 0, 1, 3328, 1, 0, 0, 0, 0, 3328, 3328, 1, 0, 0, 2, 0, 0, 1, 0, 3328, 3328, 0, 3328, 1, 1, 3328, 3328, 3327, 3328, 0, 3327, 0, 0, 0, 1, 0, 3328, 2, 1, 3328, 0, 3328, 1, 0, 1, 0, 3328, 3328, 1, 1, 3328, 1, 1, 1, 0, 0, 0, 0, 3328, 3328, 0, 3328, 3328, 1, 0, 0, 0, 0, 0, 0, 3327, 1, 3328, 0, 1, 1, 0, 3328, 3328, 1, 3328, 3328, 1, 0, 1, 2, 3328, 0, 1, 3328, 3328, 0, 1, 0, 3328, 0, 0, 1, 1, 0, 0, 1, 1, 0, 3328, 0, 1, 0, 1, 1, 3328, 0, 1, 0, 1, 0, 0, 1, 1, 1, 0, 1, 3327, 3327, 1, 0, 1, 0, 0, 3328, 3328, 3328, 3327, 1, 3328, 0, 0, 0, 2, 1, 2, 0, 0, 3328, 1, 1, 0, 0, 3328, 3328, 0, 1, 1, 3328, 3328, 0, 3328, 0, 1, 1, 0, 0, 2, 1, 3328, 0, 0, 1} = 000d000000d0000dd00100000000000120000110000000d00000d0002000000000010000020000001000010000000d00010000010000001d000100000000d0000d00000dd001f0cf010000000d00001d00001d000220000000d0020000000000000dd0000000000000011000ff1c00010000001d00001000000dd0001000001d00001d000000000100d00100000000000000d0001d000000000200000010000000d0000d00001d000100d000fdcf000d00ff0c00000000010000002d000100d00000d0010000010000000dd0011000001d00011000000000000000000dd00000d0001d00000000000000000000ff1c00000d000110000000d0001d00000dd0010000012000000d000100d0000d00010000000d00001000010000001000010000000d00010000011000000d00010000010000001000011000001000fffccf0100000100000000d0000dd0ff1c00000d000000000210000200000000d0011000000000000dd00010000100d0000d00000d00011000000000021000000d00001000 s = 000d000000d0000dd00100000000000120000110000000d00000d0002000000000010000020000001000010000000d00010000010000001d000100000000d0000d00000dd001f0cf010000000d00001d00001d000220000000d0020000000000000dd0000000000000011000ff1c00010000001d00001000000dd0001000001d00001d000000000100d00100000000000000d0001d000000000200000010000000d0000d00001d000100d000fdcf000d00ff0c00000000010000002d000100d00000d0010000010000000dd0011000001d00011000000000000000000dd00000d0001d00000000000000000000ff1c00000d000110000000d0001d00000dd0010000012000000d000100d0000d00010000000d00001000010000001000010000000d00010000011000000d00010000010000001000011000001000fffccf0100000100000000d0000dd0ff1c00000d000000000210000200000000d0011000000000000dd00010000100d0000d00000d00011000000000021000000d000010000020000100000000000200000100d001f0cf010000ff0c0001f0cfff1c0000f0cf0100d0000d000100000100d0ff0c00000d00000dd00000d00000d00000d0001d000000d0000dd00200d0001d000000000000d0000dd00120000000d000000001f0cf010000000dd0000d00000000000dd00100d00110000000d0001d00000d000010000010000120000100d00000000000000100000100d0000d00000dd0000d0000f0cf0200d00100000100d0020000001d000010000100d0000d00001000010000022000000d00011000ff2c00002d00000dd001000001000000f0cf0200d0002d00010000000d00000000000dd0ff0c000000000000d00010000010000110000000000100d0001000000000002d00000dd00100d0020000010000002000001000000d00000d00010000000000011000000000001000000d000210000100d0001000000dd00100000110000110000000d0001000000d00000dd000f0cf000dd0001d00000000011000011000000dd0001d00010000000d00001000000d000000000000d00210000000d00000d0000d00000000000d000000d00020000000d0000d000000000010000000d0000dd00100d0010000000000021000010000011000000d0000fdcf0100d000100000000001f0cf000dd0001d000200000010000100d0000d00ff1c000200000010000100d0000dd0000000010000001d000010000100d00000d001000002f0cf0100000220000000d00020000200000000d00000000100d0000d00000000021000000000000dd0001d00000000010000001000010000000dd0000dd00020000010000000d000fdcf0100d0000000000d00001000001000000000001d000210000000000000d0001000010000ff2c00000000000dd0000d000000000100000110000100d00100d00100000000d0000dd00200000010000000d000f0cf0110000000d000fdcfff0c000200000200d0001d000010000100d0001000010000021000000d000110000000d0010000010000001000000000001d000000000010000100000000d000fdcf001000000d00001000000000 NTT(s[0]) = {306, 1942, 1038, 2121, 1478, 852, 1794, 2263, 2789, 3279, 1516, 1756, 2964, 3007, 2621, 54, 925, 3296, 2999, 592, 2639, 514, 282, 2345, 2485, 649, 2949, 1742, 1183, 2964, 187, 3159, 3204, 1164, 2193, 743, 2631, 2636, 3090, 2740, 1645, 1787, 3182, 2826, 3226, 1758, 1388, 815, 590, 717, 2812, 962, 1699, 2774, 61, 2826, 185, 2731, 1818, 3086, 1916, 1897, 711, 1855, 2124, 2626, 1445, 1911, 2615, 2600, 2743, 1183, 2532, 2696, 759, 3210, 1549, 227, 2658, 930, 2113, 241, 1713, 2017, 854, 1013, 1011, 2574, 1283, 150, 1035, 1368, 2071, 2400, 3220, 2038, 3049, 261, 268, 1901, 3263, 1091, 3117, 2406, 1256, 2973, 2454, 2058, 470, 2599, 3136, 342, 1704, 3234, 2226, 856, 2716, 703, 1370, 2051, 3061, 1371, 1668, 3211, 3292, 1291, 1828, 332, 3231, 1419, 2063, 464, 2978, 1854, 3226, 1377, 2314, 2835, 209, 699, 1813, 783, 510, 799, 2389, 1112, 348, 1002, 2356, 1312, 1642, 1029, 755, 1033, 2192, 1733, 2045, 1731, 1825, 1459, 887, 182, 2686, 2736, 3292, 2072, 1566, 1221, 1393, 341, 394, 1228, 2559, 2280, 486, 2802, 1420, 3312, 3277, 3138, 795, 1054, 2081, 389, 1510, 2622, 1660, 1953, 2872, 2577, 1732, 1402, 1572, 1247, 2729, 3076, 878, 213, 550, 656, 3259, 1554, 417, 1901, 2608, 954, 2623, 2628, 2977, 2045, 2932, 2800, 2749, 2985, 2369, 244, 1561, 299, 2941, 1631, 28, 802, 305, 567, 2150, 770, 2758, 2974, 3053, 1140, 3075, 775, 1189, 77, 1678, 2522, 1761, 2359, 2083, 1402, 1574, 1575, 2167, 602, 84, 204, 1523, 11, 2550, 2986, 2823, 1760, 286, 240, 2022, 1062} = 3261790e9484c6453502778de5faccecc56d94fbbb3d6a039d03ceb70b254f2a201a9192b5992885eb6c9f44b9bb70c584cc4891782e47caa4124cab6db66f6eacb09aec6d6cf5324ed22cfc2a3ca366ad3da0b0b9b0aa1ae7c07c9776c7f2734c28a4a57577378aa2b7fa49e489a8f7a2c80d360e622a3a41180fb1167e56533ff3e3a00365090b8455170896946c7fe95b100cd176bf3c442d6c96e8d4b996a980d671a2406c15a826cab288359cfa2b5a3580f5bb5584b6c8dcbc5024c7149fbc580f081da2eb739a1c560a39b1d1b02b15f730fef1315589455ca13e3409526a5640f3924090586cfd376c21375b77630b7e0aabdc8c811e564c7155158ac14cff898ee621af8c05cfcd2cc41be341215818e6e5a37c167a381ba1c4a65724f64da94ac06e530d260229bb2c61a1d17630aa3b3f4aa4a1db7f740bafbd9aba41490f19b6127dfb651c2032317123662830c6eab9ed4b47037c30a5d4048ea69de1769323a85726766277a82554c00cf3b500f6a9ba070b6e1e010fe66742 dkPKE = NTT(s) = 3261790e9484c6453502778de5faccecc56d94fbbb3d6a039d03ceb70b254f2a201a9192b5992885eb6c9f44b9bb70c584cc4891782e47caa4124cab6db66f6eacb09aec6d6cf5324ed22cfc2a3ca366ad3da0b0b9b0aa1ae7c07c9776c7f2734c28a4a57577378aa2b7fa49e489a8f7a2c80d360e622a3a41180fb1167e56533ff3e3a00365090b8455170896946c7fe95b100cd176bf3c442d6c96e8d4b996a980d671a2406c15a826cab288359cfa2b5a3580f5bb5584b6c8dcbc5024c7149fbc580f081da2eb739a1c560a39b1d1b02b15f730fef1315589455ca13e3409526a5640f3924090586cfd376c21375b77630b7e0aabdc8c811e564c7155158ac14cff898ee621af8c05cfcd2cc41be341215818e6e5a37c167a381ba1c4a65724f64da94ac06e530d260229bb2c61a1d17630aa3b3f4aa4a1db7f740bafbd9aba41490f19b6127dfb651c2032317123662830c6eab9ed4b47037c30a5d4048ea69de1769323a85726766277a82554c00cf3b500f6a9ba070b6e1e010fe667429d5259d027ccaaec559c760ae99b62c014cf76b08c89a72d3e233af5251976e288da3a8fa2820e6ca8ca953ab8f504060fd2c0104558af67c34691c1c4c2878d5904c94390b1639548e206659804a3759a6a7930921a3fc2853d8e90cd94b523fe1a30704030f04b9d4fc919fd22c27966aa53180916009e3f831a47b53f5951087d110c010cb81a415d88c3cb19031e3f30a21496903f59ce75742227b22ca7687ad3b05c0aca42e3747bc5fb1683b796a10bac6a158a745836478829707b70aca820d3a9b6adda8091bc0c44c9bca1f57bae60165940ac87815c1e36a783a88b2b68655d22ccebd1490d4440a00775dd1a68f0d3125c7cb48d8a91db2993542c5541137e817206705bb23a261eb3740d952b1af92181f8a629e156b7a6d703d9225706a5bee26845bd80552df9a620f16b4c1444ed2514ec8c2aed453bedb9805174ada9610c91aca500ccb221c109a56377bfc043fc0410340c0d4a509be7d1252d65af888905ad42bfd9cc0e84b63d82032de9cb1cc1264fb6b65c2304818c566fdb36c47e43b3e43b405f7b8944340f78830901507d145b1818c86d9b003d03e5a33310ca66c44d63b2bdb427cc0dd68fd32176292359ce639c9177454e6a36d7cb808e13a9d309310b455202ec6bcf2891d2590755b92e4f0354e766b049d77b4b5cbd8b332a6d1261cc58a384ebb842d92273202eb7b45570cc42fb039c18b4a1308062d6710601c209f5b425d3a6b8735911fdb6bb26a556595c5e69d66a5fc346552526d8a8a292b3cda869b28fab0b2cb6162e583e8c9c558c4c8c457cb83e67c2f03960011091fdf5a35b88712d3aa5e0d0961242653850acca27be2a8523b0557dc38a3fd90acddb190c813c3e86d50e2dac874f2316c607a3582aacef1c14dee409551a9e02f60e9737c9940799b39932cd645341444414c77f4fa9046ee4020fb68d607b46759615803572502a296c291965b2c92320c663d504e06a0bce3286a854c74a6256e168c0b750805359986493a25f75b5f8923bbbd4b2a30b6e9092ce0a5035939c47e900c4235a447796a426713e1bd269a13493 e = 000d00011000000dd0000dd00000000110000110000100d0011000010000000d000100d0001d00ff0c00ff0c00002000000000020000012000000000000000000d00011000000000000000000dd000100000000001f0cf000dd0002d0001f0cf0000d0000d00010000ff0cd0001d00010000000dd00200d00100d00020000100d0010000011000000000000000000d00000000000d000000000000d0000dd0001000002000001d000000d00100d0000d00010000002d00000dd0000d00000d00010000000d00ff2c00000d00010000ff0c000100d00000d00000d0000000000dd0001d000200000000d0000dd00000d00000d0010000ff2c000000d000000000f0cf0000000000d00100d000f0cf0000d0001000000000001d000000000100d0000d00ff0cd00000d000f0cf0100000100d0001d000010000010000100d0021000021000010000000000000d000010000110000000d00200d0ff0cd0ff0c00000d0000000000100000100000fdcf0010000110000100000000d0021000020000010000000dd0000dd00000d0000dd0011000000000000000010000002d000000d00100000010000000d00200000000000000d00000d000fdcf0200000000d00000d0000000002000ff0cd0001000002000001d000000000000d0001000000d00000000010000002000001d0000200000100001000000f0cf000dd001100002f0cf01f0cf001000000000002d00000000021000011000000dd000000000000001f0cf0000d0010000001d000010000200d0010000000dd0020000011000011000000d00000d000100000100d00200000000d0000d0000fdcf002d00000dd00000d00200000000d0011000001d00001000ff0c00000000ff1c00ff0c00000000002d00000dd0000d00001d00021000001d000000d0000d000100d0000d000200d0000dd0002d00000d00010000000d00010000000d0000000000000000100000f0cf0100d0000000ff1c00000000001000000d000100000000d00100d0ff1c000100000000d0000d0000f0cf0100d0020000000d000000000010000100d000100001f0cf0000d0000dd00100000100d0ff1c00000d000000000000d0000dd00100000100d0000d00000d0001000000100000f0cf0000000110000000d0002d00001000000d000000000000000000d0002d000000d0000d000100000100000000000000000000d00000d0001d00001000000000001000002d00001d00ff0c00010000001000011000ff0c00002d000000000000000110000100000100d0001000000000011000001000000d00000dd0000dd0001d000000d00100d0001000000d0000000001f0cf001d000000000000000000d00100d00100d0000000020000000000000000001d000010000010000000d0001d00001000011000001000000dd001f0cf0100000000d00110000110000120000000d0001d000000000200d0000000000d0000000000fdcf0100000000000120000110000000d00000d00110000110000000000020000000d0001000002d00020000010000010000011000010000012000ff1c00000dd0000d000100000100d0001d00000000000d00011000010000 NTT(e) = c64791062736bb66327cb057d81a1f1c839cff7699d58a5d9b90858bb01228065ae232c4f2f0a46bb50d77dac7ab6402da4c1c9166acf79b61eb816a497a1b6a70992b8aa07a63477bab90a0319ea7fc5a77b7b800c4785b3522ede5835eb360fdf7cfebfc2e0c1c0cca60c72e9749cb8cbaee86a4ad5509d29178bf68cb65e59760a3a543460784346ee64aceb32c348613874ae99256163fc208be9417a8dbe389de1388e7ba4c945a8bcedbb97804a8bc9863f613cd39d6cf5dc280bb410e393b9da6ba30e065c17d979a4e563d8eb12c7f668c39aa448af32a87266927694a1f70b28e1a7b88568001bc85dd5c4777b48bc1b1655377a6aed743317527ef273ee7352b8e7b58ca237ca3f9aa1c538a986658ffda8493b1993d201ba1c68a3e856c8ed93f0407c116992aa07b86e89b7b829638e3f86853c1cac3ba25021856be63613aba612ec523b3315c74633c58d7483461cea937bed9da919b728debd144288461b795af50128dfacc5e0e6c4f8430bcbe26c3e4dcb3201a4b000a4c47496fac612ff0219b28b24978175d7c092dd752789ed20feed1cd29e41ba1e99a601ace5f9054c8933ed3c94960906adec66645842bad0b01a7618ae3b48d51d36e4eda101020a635c13ebc4825fe55000a5a6a52c026ab5b7138b6ab00c19d6738b2b8023007e91feb813d38515dfda85a8624858a3529b9bc46d80b3d591b8b0cd31b5bf63ca29b89a180594f8c8227da4844e07d82c20011b718ffb156b5a4bf9971c627032cf7d2a860950f8a1074886762174c6197b7c7876c90d7123d153470177b96f70430c567b3d818337d6a863dc5af805a7921793d28848bf1e5789cf76bbc286a1c2679aa8bb810b90d588487a7372819c11c1c73888f0829cff1bcf2129cff9ba55b4aa5a7ac5e29797c3b3c1a2c73bef50540ec4b8e835c33bedc57665a124435a03ac36ec7711c7648bde7c75cd0f6b8a5eb645d646a0d868ce9f8048e138d30238b71d05e2fb7898632b9d48842882192589272f2176c6f46557baa676d8aa4be981e8d843c751334a38c56023a3fc406c013a08efb719c8a2ab0279abad6154989067c57b5941b11af97b436fe901b1f416c24cc1395f13ea7a02981e091e103234dbc81ec044d526711d94012b23a22f3e90f7e098bf2f4277e306429eab80edc7fe7d10229807d2e05a4c19c51bfe392bb76898f68c3ff629b913639c37253450c8b02ebbd19f0592d101947040e3bd2354a1b0f6d27b4bd099f383b3ea7a554347a1bd082a9dbda9ef5acc3b40a380e769d9f2814cfc74ee9747a0186a6bdc57435d168f3ba0f3b05aa78158719e42be3c581fac8936d3810fe235e63810b0609b85b7590e4d3708b86c2720ab83cc8b811e4383872a9695b5f578a36ad211c46cc1852912a16937f14d54450f322d3425b0ed8a566825bea635bd17bbe72221fa39a292897b99af5126cf5bd8077bb2703b2c7e120077a6b25683223b90727b808da2048732c5f94a4a536a518b7d374a893916b1058bd141162695d38d69ead38a490d48324b406699b8ca263beffa201f48a071bc91613238094c06d99c18c45d77b94b9b343ebc2de50c3039c1aa9534588e083 t = d0f1a25721155a28143a355f99c582c2d258a270b9f78941af004116e94f2f9825af17c50b600705ea1a9c2440df6803518a5ba558acb5b732d06a3c80e555fa374d80d82f08c5b47ca12cbe6520340538c2100b5e094392acacafe1ce4ad74fa451c4379219140103e9c3ba7ba683cddca0d3b02d57104c292b2e25bc791d8b11d5079477d7b0f930176fb0a5cda99afbfb6fca86226cb8152b250a536ca60b6ccf93880007068b41bbc5c6e9b8bd92af8a717e37c69ac7db7e76a2c36eb028c1e098915274b4d59def6c42d3c25bb35310846809c96bc43b639e52a3730654cc8db548faf21e446ca874a3caba777bac25b56902481c79a744d70d12130ad6bc8136349e3234c556267e97b0a8ccf772528299fa26111172c223f2484102917bdb6de7770682698763e5b2038779f812363a727f40949b76b6913c8910d6f51dd48983ba149c070590582662fbc9053b667e1eea1ca7173e421576f2d8ad7bf415899484bd1530b4fc855354952cf28d0f1216dfba00ec100bdd76c4f4b405c913baa78958ae31c578463877138cf89255a3935cfbd1b77dbb5f66b87543131da4aabb6781427f417e841141dcb47fcd82a92aeb3c50030d71eb7f3b17b0207a6cdf654d563a420bb742ac30c0e01235910886ff045652d5035b7ab98a1b6abac88ea5996b965c2d3f3305e075bbca267e8547c6c7769fb9f91e20849b524b7822965fe036a515c60e24636a3665b23b878c5b7658f7c49f2059255c89536426510875cbdca111bdc29183459340c125df30c05a7698490193d88c52410a14a7f12a118495413487b434568d105f2d7b9c0fc32e80a13e142528ca1825e0830cd41071aac7124042145be35e30d541c2ba31a82a5f479b3bad881164aa347386c9bfa505c9968fdea866120c8b4e809bdb1482d790a03fcb1ca88c15aae8047e1678ba66833ca430d592638bf3be19592027b3ccb044a9a4d01f3804c2fe0ca60cc7c017dc14dff60562f20d912650fc24449a78998d2b0ce4d9b131955affe7b5c12278cb5b23847c8090fc0578f71760918e9ee8274673845ca29f8d338fa89637265c518f902a9ba8ad9615764ce9835b322e0b5bb1fe928888318988e435cc3c3a918ccc773371a9687884f0822558ae634a54d7c74556528f2d7cb212f1901a82ae68905330b4550518b7b44c117f335f9c818635a2a29e59b39784b021d88354d707cfe0b3599b54fa4a1218261dc72a00cf2ccef8c6c2fe131899f9a239f545c4605296d7b39beb0832732eb608464df29d193b2f2c3b7c69cbbc2082cda14863071235a75544320c1c7930262f82ac7ba788c6c09586c2420d7385a0a6c50d050910e2956844b558fa78b6cb2969e866a0bcc1b7b980a02669c226b6c9267f6e66995d6b37eedc8e34f516ef48a69a3461f3742cc6268b26a8c158e4bf34c072d4e37a4e273ee3464aea81b57c52ab4d5a1e94a668c9a14612196f6a792646581a8ff545179323aaa8369c21181c1329464099cdf940fa56ce1f204ad4b048d5e783e1948b3493b273b2a33d8c0183e386786c7e7e421b1536610cecb16b7a98641b95693879a7d8bc444931cedaa6c45303aac0a48ac290410855 ek = d0f1a25721155a28143a355f99c582c2d258a270b9f78941af004116e94f2f9825af17c50b600705ea1a9c2440df6803518a5ba558acb5b732d06a3c80e555fa374d80d82f08c5b47ca12cbe6520340538c2100b5e094392acacafe1ce4ad74fa451c4379219140103e9c3ba7ba683cddca0d3b02d57104c292b2e25bc791d8b11d5079477d7b0f930176fb0a5cda99afbfb6fca86226cb8152b250a536ca60b6ccf93880007068b41bbc5c6e9b8bd92af8a717e37c69ac7db7e76a2c36eb028c1e098915274b4d59def6c42d3c25bb35310846809c96bc43b639e52a3730654cc8db548faf21e446ca874a3caba777bac25b56902481c79a744d70d12130ad6bc8136349e3234c556267e97b0a8ccf772528299fa26111172c223f2484102917bdb6de7770682698763e5b2038779f812363a727f40949b76b6913c8910d6f51dd48983ba149c070590582662fbc9053b667e1eea1ca7173e421576f2d8ad7bf415899484bd1530b4fc855354952cf28d0f1216dfba00ec100bdd76c4f4b405c913baa78958ae31c578463877138cf89255a3935cfbd1b77dbb5f66b87543131da4aabb6781427f417e841141dcb47fcd82a92aeb3c50030d71eb7f3b17b0207a6cdf654d563a420bb742ac30c0e01235910886ff045652d5035b7ab98a1b6abac88ea5996b965c2d3f3305e075bbca267e8547c6c7769fb9f91e20849b524b7822965fe036a515c60e24636a3665b23b878c5b7658f7c49f2059255c89536426510875cbdca111bdc29183459340c125df30c05a7698490193d88c52410a14a7f12a118495413487b434568d105f2d7b9c0fc32e80a13e142528ca1825e0830cd41071aac7124042145be35e30d541c2ba31a82a5f479b3bad881164aa347386c9bfa505c9968fdea866120c8b4e809bdb1482d790a03fcb1ca88c15aae8047e1678ba66833ca430d592638bf3be19592027b3ccb044a9a4d01f3804c2fe0ca60cc7c017dc14dff60562f20d912650fc24449a78998d2b0ce4d9b131955affe7b5c12278cb5b23847c8090fc0578f71760918e9ee8274673845ca29f8d338fa89637265c518f902a9ba8ad9615764ce9835b322e0b5bb1fe928888318988e435cc3c3a918ccc773371a9687884f0822558ae634a54d7c74556528f2d7cb212f1901a82ae68905330b4550518b7b44c117f335f9c818635a2a29e59b39784b021d88354d707cfe0b3599b54fa4a1218261dc72a00cf2ccef8c6c2fe131899f9a239f545c4605296d7b39beb0832732eb608464df29d193b2f2c3b7c69cbbc2082cda14863071235a75544320c1c7930262f82ac7ba788c6c09586c2420d7385a0a6c50d050910e2956844b558fa78b6cb2969e866a0bcc1b7b980a02669c226b6c9267f6e66995d6b37eedc8e34f516ef48a69a3461f3742cc6268b26a8c158e4bf34c072d4e37a4e273ee3464aea81b57c52ab4d5a1e94a668c9a14612196f6a792646581a8ff545179323aaa8369c21181c1329464099cdf940fa56ce1f204ad4b048d5e783e1948b3493b273b2a33d8c0183e386786c7e7e421b1536610cecb16b7a98641b95693879a7d8bc444931cedaa6c45303aac0a48ac29041085526ffff11b531b1800f4e1fa75c4d008c4f9a112932c669d543551204405da8b4 dkPKE = d0f1a25721155a28143a355f99c582c2d258a270b9f78941af004116e94f2f9825af17c50b600705ea1a9c2440df6803518a5ba558acb5b732d06a3c80e555fa374d80d82f08c5b47ca12cbe6520340538c2100b5e094392acacafe1ce4ad74fa451c4379219140103e9c3ba7ba683cddca0d3b02d57104c292b2e25bc791d8b11d5079477d7b0f930176fb0a5cda99afbfb6fca86226cb8152b250a536ca60b6ccf93880007068b41bbc5c6e9b8bd92af8a717e37c69ac7db7e76a2c36eb028c1e098915274b4d59def6c42d3c25bb35310846809c96bc43b639e52a3730654cc8db548faf21e446ca874a3caba777bac25b56902481c79a744d70d12130ad6bc8136349e3234c556267e97b0a8ccf772528299fa26111172c223f2484102917bdb6de7770682698763e5b2038779f812363a727f40949b76b6913c8910d6f51dd48983ba149c070590582662fbc9053b667e1eea1ca7173e421576f2d8ad7bf415899484bd1530b4fc855354952cf28d0f1216dfba00ec100bdd76c4f4b405c913baa78958ae31c578463877138cf89255a3935cfbd1b77dbb5f66b87543131da4aabb6781427f417e841141dcb47fcd82a92aeb3c50030d71eb7f3b17b0207a6cdf654d563a420bb742ac30c0e01235910886ff045652d5035b7ab98a1b6abac88ea5996b965c2d3f3305e075bbca267e8547c6c7769fb9f91e20849b524b7822965fe036a515c60e24636a3665b23b878c5b7658f7c49f2059255c89536426510875cbdca111bdc29183459340c125df30c05a7698490193d88c52410a14a7f12a118495413487b434568d105f2d7b9c0fc32e80a13e142528ca1825e0830cd41071aac7124042145be35e30d541c2ba31a82a5f479b3bad881164aa347386c9bfa505c9968fdea866120c8b4e809bdb1482d790a03fcb1ca88c15aae8047e1678ba66833ca430d592638bf3be19592027b3ccb044a9a4d01f3804c2fe0ca60cc7c017dc14dff60562f20d912650fc24449a78998d2b0ce4d9b131955affe7b5c12278cb5b23847c8090fc0578f71760918e9ee8274673845ca29f8d338fa89637265c518f902a9ba8ad9615764ce9835b322e0b5bb1fe928888318988e435cc3c3a918ccc773371a9687884f0822558ae634a54d7c74556528f2d7cb212f1901a82ae68905330b4550518b7b44c117f335f9c818635a2a29e59b39784b021d88354d707cfe0b3599b54fa4a1218261dc72a00cf2ccef8c6c2fe131899f9a239f545c4605296d7b39beb0832732eb608464df29d193b2f2c3b7c69cbbc2082cda14863071235a75544320c1c7930262f82ac7ba788c6c09586c2420d7385a0a6c50d050910e2956844b558fa78b6cb2969e866a0bcc1b7b980a02669c226b6c9267f6e66995d6b37eedc8e34f516ef48a69a3461f3742cc6268b26a8c158e4bf34c072d4e37a4e273ee3464aea81b57c52ab4d5a1e94a668c9a14612196f6a792646581a8ff545179323aaa8369c21181c1329464099cdf940fa56ce1f204ad4b048d5e783e1948b3493b273b2a33d8c0183e386786c7e7e421b1536610cecb16b7a98641b95693879a7d8bc444931cedaa6c45303aac0a48ac29041085526ffff11b531b1800f4e1fa75c4d008c4f9a112932c669d543551204405da8b4 z = d1d49a515250dbceb9f6e3fcc1c7d5306918964b21ddb22207e03e57f0600da8 H(ek) = 704649a5d8034c6224ae18950bd7b979342c03c7499f7bab9cdea742db9e086c dk = 3261790e9484c6453502778de5faccecc56d94fbbb3d6a039d03ceb70b254f2a201a9192b5992885eb6c9f44b9bb70c584cc4891782e47caa4124cab6db66f6eacb09aec6d6cf5324ed22cfc2a3ca366ad3da0b0b9b0aa1ae7c07c9776c7f2734c28a4a57577378aa2b7fa49e489a8f7a2c80d360e622a3a41180fb1167e56533ff3e3a00365090b8455170896946c7fe95b100cd176bf3c442d6c96e8d4b996a980d671a2406c15a826cab288359cfa2b5a3580f5bb5584b6c8dcbc5024c7149fbc580f081da2eb739a1c560a39b1d1b02b15f730fef1315589455ca13e3409526a5640f3924090586cfd376c21375b77630b7e0aabdc8c811e564c7155158ac14cff898ee621af8c05cfcd2cc41be341215818e6e5a37c167a381ba1c4a65724f64da94ac06e530d260229bb2c61a1d17630aa3b3f4aa4a1db7f740bafbd9aba41490f19b6127dfb651c2032317123662830c6eab9ed4b47037c30a5d4048ea69de1769323a85726766277a82554c00cf3b500f6a9ba070b6e1e010fe667429d5259d027ccaaec559c760ae99b62c014cf76b08c89a72d3e233af5251976e288da3a8fa2820e6ca8ca953ab8f504060fd2c0104558af67c34691c1c4c2878d5904c94390b1639548e206659804a3759a6a7930921a3fc2853d8e90cd94b523fe1a30704030f04b9d4fc919fd22c27966aa53180916009e3f831a47b53f5951087d110c010cb81a415d88c3cb19031e3f30a21496903f59ce75742227b22ca7687ad3b05c0aca42e3747bc5fb1683b796a10bac6a158a745836478829707b70aca820d3a9b6adda8091bc0c44c9bca1f57bae60165940ac87815c1e36a783a88b2b68655d22ccebd1490d4440a00775dd1a68f0d3125c7cb48d8a91db2993542c5541137e817206705bb23a261eb3740d952b1af92181f8a629e156b7a6d703d9225706a5bee26845bd80552df9a620f16b4c1444ed2514ec8c2aed453bedb9805174ada9610c91aca500ccb221c109a56377bfc043fc0410340c0d4a509be7d1252d65af888905ad42bfd9cc0e84b63d82032de9cb1cc1264fb6b65c2304818c566fdb36c47e43b3e43b405f7b8944340f78830901507d145b1818c86d9b003d03e5a33310ca66c44d63b2bdb427cc0dd68fd32176292359ce639c9177454e6a36d7cb808e13a9d309310b455202ec6bcf2891d2590755b92e4f0354e766b049d77b4b5cbd8b332a6d1261cc58a384ebb842d92273202eb7b45570cc42fb039c18b4a1308062d6710601c209f5b425d3a6b8735911fdb6bb26a556595c5e69d66a5fc346552526d8a8a292b3cda869b28fab0b2cb6162e583e8c9c558c4c8c457cb83e67c2f03960011091fdf5a35b88712d3aa5e0d0961242653850acca27be2a8523b0557dc38a3fd90acddb190c813c3e86d50e2dac874f2316c607a3582aacef1c14dee409551a9e02f60e9737c9940799b39932cd645341444414c77f4fa9046ee4020fb68d607b46759615803572502a296c291965b2c92320c663d504e06a0bce3286a854c74a6256e168c0b750805359986493a25f75b5f8923bbbd4b2a30b6e9092ce0a5035939c47e900c4235a447796a426713e1bd269a13493d0f1a25721155a28143a355f99c582c2d258a270b9f78941af004116e94f2f9825af17c50b600705ea1a9c2440df6803518a5ba558acb5b732d06a3c80e555fa374d80d82f08c5b47ca12cbe6520340538c2100b5e094392acacafe1ce4ad74fa451c4379219140103e9c3ba7ba683cddca0d3b02d57104c292b2e25bc791d8b11d5079477d7b0f930176fb0a5cda99afbfb6fca86226cb8152b250a536ca60b6ccf93880007068b41bbc5c6e9b8bd92af8a717e37c69ac7db7e76a2c36eb028c1e098915274b4d59def6c42d3c25bb35310846809c96bc43b639e52a3730654cc8db548faf21e446ca874a3caba777bac25b56902481c79a744d70d12130ad6bc8136349e3234c556267e97b0a8ccf772528299fa26111172c223f2484102917bdb6de7770682698763e5b2038779f812363a727f40949b76b6913c8910d6f51dd48983ba149c070590582662fbc9053b667e1eea1ca7173e421576f2d8ad7bf415899484bd1530b4fc855354952cf28d0f1216dfba00ec100bdd76c4f4b405c913baa78958ae31c578463877138cf89255a3935cfbd1b77dbb5f66b87543131da4aabb6781427f417e841141dcb47fcd82a92aeb3c50030d71eb7f3b17b0207a6cdf654d563a420bb742ac30c0e01235910886ff045652d5035b7ab98a1b6abac88ea5996b965c2d3f3305e075bbca267e8547c6c7769fb9f91e20849b524b7822965fe036a515c60e24636a3665b23b878c5b7658f7c49f2059255c89536426510875cbdca111bdc29183459340c125df30c05a7698490193d88c52410a14a7f12a118495413487b434568d105f2d7b9c0fc32e80a13e142528ca1825e0830cd41071aac7124042145be35e30d541c2ba31a82a5f479b3bad881164aa347386c9bfa505c9968fdea866120c8b4e809bdb1482d790a03fcb1ca88c15aae8047e1678ba66833ca430d592638bf3be19592027b3ccb044a9a4d01f3804c2fe0ca60cc7c017dc14dff60562f20d912650fc24449a78998d2b0ce4d9b131955affe7b5c12278cb5b23847c8090fc0578f71760918e9ee8274673845ca29f8d338fa89637265c518f902a9ba8ad9615764ce9835b322e0b5bb1fe928888318988e435cc3c3a918ccc773371a9687884f0822558ae634a54d7c74556528f2d7cb212f1901a82ae68905330b4550518b7b44c117f335f9c818635a2a29e59b39784b021d88354d707cfe0b3599b54fa4a1218261dc72a00cf2ccef8c6c2fe131899f9a239f545c4605296d7b39beb0832732eb608464df29d193b2f2c3b7c69cbbc2082cda14863071235a75544320c1c7930262f82ac7ba788c6c09586c2420d7385a0a6c50d050910e2956844b558fa78b6cb2969e866a0bcc1b7b980a02669c226b6c9267f6e66995d6b37eedc8e34f516ef48a69a3461f3742cc6268b26a8c158e4bf34c072d4e37a4e273ee3464aea81b57c52ab4d5a1e94a668c9a14612196f6a792646581a8ff545179323aaa8369c21181c1329464099cdf940fa56ce1f204ad4b048d5e783e1948b3493b273b2a33d8c0183e386786c7e7e421b1536610cecb16b7a98641b95693879a7d8bc444931cedaa6c45303aac0a48ac29041085526ffff11b531b1800f4e1fa75c4d008c4f9a112932c669d543551204405da8b4704649a5d8034c6224ae18950bd7b979342c03c7499f7bab9cdea742db9e086cd1d49a515250dbceb9f6e3fcc1c7d5306918964b21ddb22207e03e57f0600da8 m = 3dc27ca0a6594b0e56320457c45a0f76bb8a213ea4a76d442186a0aefadbcdb9 K = 4b4eba37eff0315dc6009dcffb4dfbbb680f8f2ebde8715fa3d6daf70256a2d9 r = c52fc55f9edb30bda71bb983e058bc111b227dc3c853b66caa5fcb7f32e69b57 μ = 810600811668811668000000001068000000000000811668000000811668811668810600000000000000001068001068001068810600001068001068810600001068810600810600811668001068000000810600001068811668000000000000001068810600810600810600001068000000811668000000000000810600000000000000811668810600810600810600000000810600000000811668001068001068810600810600811668811668000000000000001068810600811668810600811668001068811668001068001068001068000000001068810600000000001068000000001068811668811668000000000000810600001068001068811668810600001068001068810600811668001068810600000000810600000000810600810600000000001068000000001068810600000000001068000000000000001068001068001068811668001068001068001068001068811668811668811668001068810600811668810600811668000000811668810600001068811668001068 A^T = 85a5005cd2b383ac6044664968b24f7aab18f9451a8d419e6b9246346b1234098f3295a5e2394647b8c50656aa02757eec3c51c3e791d652c42abc559b725863b0b4bd8a7148d2afb7b51c38970b424680894cc9ef31358923cfee292962c45d974241ed91630526c844c38b19d1331e5820a850bb4df317b0818bc34c1400a45af5ca5c527502bce33cf1486f9b4c886b5279f1bc10b04b49dccc7ff85433e19a2b181a9c6135c0e0db47cb9a628e8065a2f4a8a6207c3ababe7a2419d3f756491265860288be3c6407a6978c8865bff6aa4f119a5234323c491f1fb00d82e70795d371d9bb2b4ad7894ad4c9814a42b86c610966c8a6022a96c541593bce64827a65fa9df219a2510cc69a83861042c0eae2ca41b63057d8b364273bd32a16099caef20c733643c3da2a81749c9f7dd019869a8fc8715828104333c01ddf062fdc54c45e574afa049302d273df99c54614c202e75ab207a9cd783d44d029fe729e03c115e3a7cdbd3c561edc4f91e106eb696a4c22b367374b5bf50e3eda8b63b3040db68ae9da02201733fcf6a724fc9ba037404b2b9888a865fa81757412b79f14473c106dc9909d2083c79b50c48dc3c8b0e331ddd7996e447e93c96aa175b74c484ac3b3cbd3301823c890f78727540830eff042f17534153a0e7ec6569ea9065c2b89934ac0d5402eb3baa0c667351b8058dca7625511c4753c0a30f33d79643b13663661a2588ac16652924835cac6ece1bbfa111895010959333bd9cc8b44b6cba956c2b980918f5906d2137dd0b04a5f770226c5a37eb9b004eb03a18b1f6556732dd300e0b20612c3b9e29a62b6b2bfcd153e3b928bd158396768a998671e7b2715498b8c538946fcfb84500b57c69ca2ea76afb0652cb4d9082a288984ac7e5493ac9e78c289d78816d3c882ab679cec9ad37cb42d24b182668d355b39ea428f81bc2ecee397d6f04ff74b89e2e4360c420d8868685122178f420d11400f1b0163f286a4605c0d3499b8e21909eff8ba6cf6c4e3780353d2252b8b2d40b1b26b2c7cb1e33e94db35a8db85773916b4459428d6bfa3707c2e079abfa5a6fbf251df37cc8ef0b8ce04913739a3f681341809a0aee971b90201d0d9cb387011aaeb4960826964e2bc3562ad894c597caa5d26a6a804059fb7c9824d4b0f5c91181309797dd65c9ceb3845a98eb5ba224be121d2e0b12a86a83880355de16f9d585c0d655d899a8f3261afa2c478ff62749707829c9849f0f38cc40629efe7570ad1566b8a0d4e062e727c4398b241e638ba04d05384aba8a290b2a1115c9c5205e0d78b9bc38f72f11b06871a7e79746752998990aa59639992dcc07064134551584a823d7cab532578ca6b0aa167441dcb5653dd495d6d9b9587a64560f2c2bcb40427c10199c0043d734e4e7a837cf504d58793053b4290647502120ad74215a295946b7acce421be4d451fa8ca1d2ab2a3bd1542493686ced9c6a5e577d23b8d39c4bf40f27020c06158ebc01eb9934740c5956a1343f440b03ba287395964b674cd707af0085019c8c1c7843f630ab0d2b067c4548a6103946a55c1f80473f932a5f0dca3d9cb80bca99d51361fb6b38a1ea0abbed286447262e51127e38293dcd01397e236eadb3775c0114d2165f7d32d5043a283c58afbd358b335bb02a3abef72cf0e201e1c7cae95f7071a85b94b0b243f469d8b392318e85f018a96f75429657944b5c08b316153bacbcf52892a24e06ae01818d2c658d16b923f8a73831017b5d0ca6c91904e8b918cdb54957c2924fc9b3876cda87c3e0823290733717b8a98a9d9a85807a96a7a177e8c621f134b8440613ea936479b2a761ca47f522965fc136752447b06877007587b24a33c16af24a011e4b76a2112707399340a07c2f6b34f2a813929fcc06d75cf180a39c4898bf1b586f006986b8583e1790aeb0786d62381635c1e84d033b7b9aef43a4ff16a45bdb78073e832060a4720fa35048027fed98f1ba597a4d033d706312f92c7552a218b5a0af67847f3a83b9e1325ba522a57843686ac1e24849c41737d368bb9cd3622ec27a7e1432f81b37d44601e84f8b0736a4b22c243d5d3a78bb243445711076023c2b607932197b230892e900ced651f1b85b8bc836c14ea3b88a1c5154a8875b903ae30012553ab5f10cbce648ae2966a4b125a5cdbacba165021a235b7ba8d655325adb92182b80df1b7259d821e9bd53f33baa30796b91b929401f1125044bf28b0ce510801b8b8a0f1a983e037cd8c712b4c971a6d05161d8b03cb362fc7640bdd14aa13dc218eb97db5f0cf3d56b99192c9ffacc5e271a8e7950202e7886d0a9e1c0c7aabfc2c0342a1d712b78f624e487a5173329a48298ce6292f0216bdf3317d2e2aca6fc6c8cda658fe67605ae36adf1a8c65da46e10c4b8f518cd08c9be4b269fd8c973f54bc3af1517c787dda30960e399d14fa247b6acaba19b609936c947b9278b7575c115ee7f91de7b30f18b94f3893b1cbf69c320b2f5f777438718738eb71b123a747500fe2483ee2517b7bc54184d6cbf286b30ff2865416542366ceb165891b7c21dcc102a487530440a2449b11d6817250020a658a717a69a388229984b65927c7caaba3b9f59917df489d95652e55a0c7f96a8c576acf1b8acb29d51969924bf1a4052efcba804b833a898e280868094c1b43b661b759242390ba1c10292dc4800e236cbc5ba64baa24d46cc7acf61bb5bc054f845d84921546b02c12e0c7a355cad8c74bfaca69a83caf69a4a8fc6b12d9ccc9cde8c11a7a73ae0a3b4540a1573723b3576b2728c5a1b3a26ab4b7dc20a3c6895fdbb97172441f3ea67313d759c1aa3a16a445babc116833197a7002e8f68c8d38b955690d4d87242e45a4b5a30970c5aa14a6cf8eb997d41c4513a472e42a27d52652d0d26c43c85fd35a80ed7a51e8c1b5a7d9a781f4079628aa39bacbe9885168c20b262a77379a66f3d96a5fd902c8ac84b211bd3c226a5197330ea0a55b9c7123f63fcd7516d3b559eaeab3e3ba54219bcdd205c051118bf3180049639b8b062bfa6345a51ccef4f8547b40cfe10375e69392ddf5bfaa59277bd25a75fb3750a42ec47a5f62168c78f2996fa9407f578674bb95b88504eb401541ac5fd3c424313b99d38b113664b9caa67abc06329a6c6a8a89ba04ccc347344983ec9f98d5a930a96ec0d15008810afdf576e068096634b025d46cb478b75c00058370a70eb4687bd902438666c28c3717cbc9001d2b0a8263eac97db0858ecabc8a6732ae64378178a8baa954a9a1daca6ff930f51701aec28b8a9a502b3c68a0a52f30024ffbe929698a86e6758dd646afd98156825a793607b2ebdc29aef8290fa89503971556d63a665c7a3ea50af10791a2032d45eba531b2b41f675ab5a7c012610f3e94cf25d20a5f9950ae088b79192583e6bea1f073c2c7ca3b0aa5c7d8a8a7c905fc913129578a55e0217a6233e414c441d460a834bc5f85437f4b73d983927693665796090231813eb26365eb9237dcac2909a3d92c4888976eb8e684cb807d15e13f0a20c3d48c042544b06ee522d9c02baa6a295cf061c5e4819ae98ea999719d54844618921db3c9d69760401154818112e909a503c17f548323bd14bad132b60e02ad286113c9c3a75fe6b8eeba67092546752b99df66150685a7d6a24f9deb1c87a355c5860d86b6900e7b56e4db9bdbbc56655332b8a8b6eb789314117dcf91acb434720c14a5bf1c856e8a9ef70a095167b5d442479a8c7ee94278bc9147b512352471b350d67ee11cc9ae03419f477e090632ae50b7285b331f820816c01c0ba06249fb894f421909c12cf9555c96860471e32ed5b9306c99a5d1043dc83b730a58878e31146806a2ebb7cf666a519a3140af80107659a71b6108a1231e38e667dddb281b399dc3db72ebc3aa99073c778188b8f6243c5186ed7ca98f56b6730b63ba90a660e22ba9a7399d940b956a3955b456a84b3d269260c7702c12d1cfb008ba3250a06e04599da007a4d862da67251158b8a11484159b0b08138635e7691ab97d14e124af645a8a020c19a916fa4b3f5ec9ca4dc15772158ccbe416b3a1a5346b22c42c2901781f6cb9536241590c21b82ce31406257c4a7cab9fa988a3fc8fce8553a3889782c817a7125ab069c77ba586034ccf3bf702ba0103d7da1558b1b812f34aa9c88f12c63c81c72f45567a8279c74078a5337b67226586d79c5de2252690841e6d24c7cb86c20e5945f2550cae40a2ef112f0ed47b09f9cf5c139fb8ca9c41e54e0240cd6285c2e6826857aa523ba7cfd5304556b9367051a225884a6dda99e995b9e987167706aaee9896ca0612d89243ad208c91a237ff9414b6803a7a3b08d70717974c3262e45a4f3a501d442571e095db9ab536382d212520abc7110501560592b4e6480730d0027dc1143aa3c517710b301b871fd3ba9f159eae036d95b62895d9774c9176844399da0a870b0b5c476c9921816d7573bf75a632f6f82aed27657ae18126ca646fa2a112602ea0e34bdb6092adea950ae3b610977639896e264396d87813af70a045b46040c3294d93415ab576d1316bfa6c2fe125ca886cb6177c9244823053b25bc13ac567b409c4273b96a9c375231f301486d70509a9d60e31982c052b34a9f3c381c0c615717f1460bbfc96856b60c143cc63e0c9c892e3c511ea09faa770fc028199c5528bc0761a3a34b1f82a9744a8f907652ce628683441ab5cb6c31947f2fc7378504ab630a4c85907c0030e33152bdb15c05944a99b170ae1f3615611c3793568340a740f537604bcae3a01cd3218674bd8a62dbcc35e6137ed4850d6355667c47a3bc255fef61a r = 000d00010000001000010000000dd0000d00000000000000001d00000d00000000011000020000000dd00200000000d001f0cf0000d0000d00000d00002d00001000000dd00000d00000d001000000f0cf0000d0011000000000000000ff1c00001d000010000100d00000000100000000000100d0011000000d000000000200d000000002f0cf000dd0011000001d0000000000200001100000000000fdcf000dd0010000000d00001000fffccf00f0cf001000000dd0000000010000010000010000000d00000000000d00000dd00000000000d000fdcf001d000000000000000100000100d001000000fdcf01f0cf001d00000000001000000dd000f0cf001d00001000010000011000000d00001000001d00020000000d0000fdcf0010000100000100d0ff0cd0001000000d000000d0000d0000000000fdcf001d00001000001000001d000000000100d0001000000d0000fdcf001000002000002000020000000000011000000d00000dd00110000000d0000d00001d00010000010000000dd0001d0001100001000000f0cf0210000100d00100d00000d0001000000dd0002000001d00001d00022000000dd0001d00000d000100d00000d0000dd0000000011000000dd0020000001000ff0c000000d00000d000f0cf0000000000d00000d00100000200d0000d00ff1c00001000000000000000000d00000000000dd00000d00000d0000dd0000000000dd0012000001d000100d0000d000000d0000000000dd00000d00110000100000000d000000000fdcf000d000200000110000110000210000100d0001000011000001d00000dd0001000000000000d000000000100d00110000100d00000d0000dd0011000020000000000000dd00000d00100d0011000ff0c00002000010000010000010000000dd0021000002000000000000d00011000022000000d000100d0000000ff1c00000000010000001d00000dd0012000000dd0010000001d00000dd00000d00000d0000d00021000ff1c0000f0cf00fdcf0000d00010000000000110000010000120000110000200d0000d000000d00000d0010000011000010000001d00011000012000011000001d0001000000000000f0cf000000ff0c00000d000100000110000000000100d0000000000d00010000000d000100000100d0011000011000012000000000000d00ff1c000220000000d000fdcf000dd0ff0cd00010000120000000d0000dd00100d00000d00000d00210000000000000d0000000001d00000d0001100000100000f0cf011000000d00000d00000d000000d0001d00000d0000100001f0cf0010000010000000d0fffccf020000000000000d000100d0001d00002000000000000d000000000000000100000200d0000000001d0000f0cf0100d00100d0010000012000011000ff0c0000000000fdcf00fdcf0000000000d0020000ff1c000000d0000000001d00000d000100d000100000f0cf000d00000d00000d000100d001200001000000fdcf012000000000001d0000000000100000fdcf02000002100000200000f0cf001000000000ff2c00000d0001200000f0cf0000000000d000100000fdcf NTT(r) = 04f9ca89c561434b8b211a27d12154a6a154d5e2b684a6b3f63c7e2e9553051261653ba2c6e1ad0dbb1e41a12ca3c0966d2c1881e6bfd9677c009b3e42533573696f12c463da7867fed5a6b391bb59493747350193737981d22b3f27c386564a44ba1dba4174978004bcc3489f198757121dce3779f24550bd32211dc2a3b778af87075df0a1889ab60b334b02bfa10b656513791ac4d67a8cf7181f17195586e33f662832bb58795741170f244dd3907713239beee1b271a3a7c1f60df44757b2f4cd212369e8d8b4bf5a268d0c49e01b2ea2f9462139b9adb030d4718961847348295a87c9c6a5a1b55af7767094b37cca7dc377148ad037ebfb3b91ba34be800680c7b69b9a6d4bc73d6256b9c170692cf58f834c213096758012219354bb048c0799819d8eeb44e1a20165a128c10699550088ce416e88a2ba7b440a6295c89aba9f54d65cdad373c9440e520622f38781ab0658a1abcf698b447e9a3cbcdbcef583183e94230abb1141da2a15818c91bb6b97bc073f8228010b24008051257a762bc1747a49960fb82922c097256bbc1851002740b8bc2a08f0ac99a08ccd8a3c168f54148a32a3ecab1e178741042199baf4265b797aa6f68b16f1313c94679c91a6ff703199981c620ca47dd8cbd407924a071c0ad2bdc0dc5aa2c2c937243a7aaaa127589151593223a9316d959b2d5cbd67eb420d7855cc6987e55c40260a6ff444a2ccc415fd624c28aa52215449b1267559dc57d1114cd8da9fe589adbc76027d6bafaa8caa2e2b463f299adcbb5192aca10d9879680146038b67226a9608b8a74d870a809755f7114780d668dbc4a7e4006138068051199370e788842ac006325ac61761d65349da2130fbe59cd0214f21541d986a6e9d984416294fbc461c4a873e1d02c81a259fd600667bc8593056a9d04c6b10c3177d302d6380318ff408e01404286a9684d8aaa8595079a2c749ec4906bb739a7a6a03616eab0b390efca37c79516f59cddef05f11ca1f12478942e0455e53211b5bc5d7c62e63f709f749aefef8008458425225bb8a1320ebccb69229c1e3a5b470166d1b11cd92747e698b3e2df96272c2cc37d66e34731cfc957a054b7361020328c929acb81a4fd029d7b380a39ba65cc73e95a63e755246b1862e41f3c12bfa09df36be0ad6bc442857ae234823bc28da432f3fc63e4cb1ab0633026040b0718242f7e2c109e4adf07270a5f91dcaf77030132e87d22167943fea568b74179798c358d6c1bf68b12be9949058d9c786462eef1293e1e53ae0a1c14fc71e7aa54ff68330c733c4d9215c41293d8925b639f16e93985d0d3264578b41de624cdfe234750005f6458da266490599385083af91b954f4e28a15e2023615803414b6c2fa6e845067ee706e00208c20d4b8b38cc13cc07cfdf1be12bab1846243fb1a6db7a60bc9235b29984b66e499c71a9098c353c6f49e2dba8e5c3810e50b12cf8a4111d1b4e3da0c9ad163010ccaebfaba28bc86f476a2960511b7fa24e4977a83b59930d51bcaa964a6888f2d2655c53ca05a40a5fcfb2f4735934e15ad21c4549d539d9b8c5a57b410822b7603a498b6510d61507394e0264f4a56624ca0202c37 e1 = 02000000000001f0cf0100000000d000f0cf000d00001000011000000000002d000110000000d001000000100001000000100001f0cf02000000000000f0cf002d000000d0ff0c000100d002100000f0cf010000001d000200d00000000120000100d0010000000d00020000000000010000001000000000001000020000021000000d00001d00ff1c00021000ff0cd0000000ff0cd00010000010000110000100000010000010000100000010000100d0020000ff1c0000fdcf01100001100000f0cf0000d0010000ff0cd0020000fffccf01000000200000fdcf0000000000000010000000000000d0011000002000010000001d000000d0020000001d000000d0020000001d000100000100d000f0cf001d000100000000000000d00000d0000dd0001d00011000000dd000fdcf0000d00100d0010000ff0cd00100d0002000000000000000011000ff1c0001000000000002100000fdcf010000000000001d000010000000d0ff0c000000d00100d001100002f0cf0010000000000100d0000dd0021000000000000d0000000000200000f0cf0200000000000100000100d00000d0ff0c00000d000000d001f0cf0100d0010000000d0000200001100000fdcf00100000f0cf0000d0000dd00010000100d0000dd0010000000d00012000000d000110000000d0000d000100d0000d0001100001f0cf010000000d000100000200d000f0cf022000ff1c00001000011000ff1c00000000002d000000d00100d00000d0000d00011000000dd0ff1c00010000000dd001100001f0cf0110000110000200d00000000010000000d0001000001d00000000011000000000000d0001200001f0cf000d00001000000dd0000d00001d0000f0cf0210000000d00100000100d0010000000dd0010000000d000000000000d00210000000d0000dd0000d000000000020000100000000d0020000ff1c00002d00010000002000fffccffffccf0000d0000dd0001d00001000002d000110000100000200d00000d0002d00000000000dd0001000002d0000f0cf0000d0010000ff0cd00000d0000000001d00000000000dd001100000fdcf020000000000000dd0000d00002000000000010000000d000000d0010000020000000d000100d0000dd00100d0000d00001000002000ff0c000100000100d00100d00000d0ff2c0000fdcf0020000000d0021000011000000d00000d000000000200d00200d0022000000dd0000000000d00000dd0012000011000000dd00000d0000000020000001000000d000010000200000110000100d001000000100000f0cf010000010000000dd00000d0000000ff1c000200d00110000000000010000000d0010000020000011000001d000100d000fdcf001d00ff0c00ff1c00012000000dd00000d0002d00000d00000d000100d00110000000d000000000f0cf0000d0002d00000000001d000100d0001d000100d0000000000000011000000000020000000d000000000100000100000100000100d0001000001d00ff0cd0ff1c00ff1c000000d0000dd00110000100d0010000ff0cd0000dd00000000100d0fffccf002d00011000000dd00000d0000000 e2 = 00100000f0cf0110000020000200d0000d000000000000d00110000000d0000d00002d0002200000100000fdcf0100000100000100000200d0000d00000dd0ff1c00000000011000000d000100000000d0000d00000d00ff1c00020000000dd0000000010000002d00010000000d00ff1c00000d000010000200000020000010000000d0fffccf000d00000d0000f0cf001000000d00ff0cd00000000110000100d0000d000000d0021000ff0cd00000d00010000110000020000100d0000d00000d00001d000000d0ff0c000110000000d000000000000000f0cf000dd0ff0cd000000001000001000001000001100001000000100001000001100002200000000001100001000001f0cf0000d0000dd0000d000010000000d0000000000000000d000200d001000002f0cf000000000d000000d0ff0c00010000000dd000000000f0cf0010000100d0000dd0000dd00110000100000100d0000d00000000000d000000d0020000011000000000011000ff0cd00000d0000dd0020000001000 u = f91b3da8215463536106bb8018f637ab5b27be306bb9dbabe521b580f90f88f714fd2a734b1629e5eb407f9c627f842f7fb99bdd05332fa5132b94436a721b3a37b03dc647cab4b65f778c5a93908c3346124200f2a76f3e3c2ebfe98def49cb54f65ab0d6a29cb0301510a9cf285b7487a30ba0ceee3c00f8ca9bc2761ca1f31ec22625b8060ba0647227165804169082dcb11cb6a8fc223e18ba0b68d4a725711e6078afb5462c1a9b4fcfe27813040a7341b3cdc3c2b8cabed5ba91db02000cba01294950ba231c6808011d1a707357028355723c851468c1c60312af4b5c6a9b5707798431fe10a2db837841d4985118902fec43f05b2c216c9688e43a3bab712cb01fe9a0121418ce2b9523711513b605a197ab5a5c9a6791433c4cca723191c6ff7377c94613c0d4859a347758199366764c9e29327d67c17cd93b636309e7e07a6040076a3494650602cd90364cd1bf344a0bb11bb43ca18a63a096822a4562033577914b40da012ed28055b36091007ed5595b56e52f09711cec196855a371e9532f91a0b877553fccb32212b77d13086ebd6b6bac89a9b77b7938d414a65774f54b8ce5a127244469f5bc4e4a33ba1d977071214ed8926467b870c927555b92276c139c648494263785902965e5a14894440e68f6977ad290cb43022941bbd9724da3c7baa0606d753475dc401147357f57d36430f1135caa42e02798674028b44abbd6226353ba5181782c6d16cbd5f73f48f0c2cfc305ec88263bf3919f388e39c2002c75accb724355852ac4367feb5c2cda7485e2750a4fa82dc66b37062c64ac5b2ddcfa4ae145c3a818b057b0c6f2c25a8430bb52aa94e97549c8649763c415a4497f84104e85eb2bbd19bbc242b7990a2136a6b5e2447705fa9f147c4653e34055cbce33562c6846afaa407680567b42c31451e00fce1146c2fc37132b32f7535767a413c05b54a5a941a741c3fc8315bd64b464201967c614950c097eb62652b215d007cb73212b783bce283c70056bba059267dff5cf64cb791c5b6750c90f53f4ade7a575c8b949c99b813c373992e8909d0400d46a9a982a1442e11b0f783f7091a3cc02a99fac84f03781378211189bc4ee1604f2c50f793c8d685c623a97c151f35e08c2152a5bb72c130d93a08364360e4af39690f63401d60bfaf9aed803a2bdb4c54ad4ba18267972874f8a854453d38ed40a6bf06b3c9e22b325e1552c69b1ab4c1977679f6565873f3925d557a6aa321e29b404b7710c0e960d2ab240e367b9ae197b5c624957a2379406689a785080972ef6128d122c9f88d13cb5b5ce4e5361482a51bda989d383577557c0d4242d4613c2a8247e616c2757039c1169261bb5b63487134ed87f88d2c6dea4687173c6e1799fa2f16bed29cd816b2a229c6c743a8c20b68b18c67fc5dcc76a457376f150103a8b213634e50c5a0c202da20310cc116cb705b0b963785b28a63e376107f5358abbc807c5c02de89537d5236b71230c507e013ab774f088f3a1b2c9c220a6133537da6de4389f49072731076e63253794f903674a8d35504d492371630769f609733fb7b1e5ba7eed2318bdc3811cf3121f905420eb47c3a68888e06880329d u[0] = {3065, 977, 424, 1346, 867, 1557, 2822, 2059, 1560, 895, 2987, 629, 190, 1715, 3001, 2749, 485, 2898, 2432, 255, 1928, 335, 2813, 1842, 1611, 657, 3045, 1038, 3199, 1577, 1151, 760, 2431, 2491, 1501, 816, 1327, 314, 1067, 1081, 618, 439, 1850, 2819, 1597, 1148, 1226, 2923, 1887, 2247, 858, 2313, 908, 1123, 530, 4, 2034, 1786, 3134, 739, 2495, 2270, 2543, 3252, 1620, 1455, 1712, 2605, 156, 779, 21, 2705, 2255, 1458, 1908, 2616, 11, 3306, 3310, 3, 2808, 2492, 1730, 455, 929, 495, 1730, 594, 1720, 176, 1184, 1830, 1575, 1409, 1540, 2305, 3202, 2845, 1564, 2699, 764, 994, 2584, 187, 1128, 2685, 293, 487, 2144, 2807, 1717, 708, 2842, 1273, 719, 1934, 1043, 160, 371, 2868, 973, 3116, 2744, 3052, 2773, 2331, 731, 0, 2572, 27, 2345, 1284, 954, 450, 2152, 16, 2589, 1793, 1907, 37, 1411, 1829, 1340, 328, 360, 3180, 515, 2801, 3147, 1701, 1947, 117, 1145, 792, 254, 2593, 987, 1928, 1089, 2445, 2129, 2305, 3119, 1086, 3056, 709, 3105, 2406, 1160, 942, 2875, 1818, 44, 507, 233, 298, 2068, 3297, 1323, 569, 1393, 305, 1462, 2576, 2967, 1450, 2652, 1657, 913, 964, 2636, 1836, 305, 3177, 1023, 1911, 1737, 308, 1216, 2141, 1178, 1907, 2392, 2353, 1638, 1223, 2462, 802, 1917, 3094, 2428, 957, 867, 150, 231, 1966, 96, 116, 1130, 2371, 1637, 32, 205, 873, 332, 3069, 2612, 180, 2993, 2881, 316, 2218, 99, 2410, 2690, 1106, 866, 848, 375, 1209, 2624, 29, 558, 2061, 853, 1547, 145, 2016, 2517, 1461, 1366, 766, 265, 455, 2540, 1665} compress(u[0]) = {943, 301, 130, 414, 267, 479, 868, 633, 480, 275, 919, 193, 58, 528, 923, 846, 149, 891, 748, 78, 593, 103, 865, 567, 496, 202, 937, 319, 984, 485, 354, 234, 748, 766, 462, 251, 408, 97, 328, 333, 190, 135, 569, 867, 491, 353, 377, 899, 580, 691, 264, 711, 279, 345, 163, 1, 626, 549, 964, 227, 767, 698, 782, 1000, 498, 448, 527, 801, 48, 240, 6, 832, 694, 448, 587, 805, 3, 1017, 1018, 1, 864, 767, 532, 140, 286, 152, 532, 183, 529, 54, 364, 563, 484, 433, 474, 709, 985, 875, 481, 830, 235, 306, 795, 58, 347, 826, 90, 150, 659, 863, 528, 218, 874, 392, 221, 595, 321, 49, 114, 882, 299, 958, 844, 939, 853, 717, 225, 0, 791, 8, 721, 395, 293, 138, 662, 5, 796, 552, 587, 11, 434, 563, 412, 101, 111, 978, 158, 862, 968, 523, 599, 36, 352, 244, 78, 798, 304, 593, 335, 752, 655, 709, 959, 334, 940, 218, 955, 740, 357, 290, 884, 559, 14, 156, 72, 92, 636, 1014, 407, 175, 428, 94, 450, 792, 913, 446, 816, 510, 281, 297, 811, 565, 94, 977, 315, 588, 534, 95, 374, 659, 362, 587, 736, 724, 504, 376, 757, 247, 590, 952, 747, 294, 267, 46, 71, 605, 30, 36, 348, 729, 504, 10, 63, 269, 102, 944, 803, 55, 921, 886, 97, 682, 30, 741, 827, 340, 266, 261, 115, 372, 807, 9, 172, 634, 262, 476, 45, 620, 774, 449, 420, 236, 82, 140, 781, 512} c1 = afb72488670b7d47769ee04d7479303a40b8b9d395eccdae13519e11f68df02993fa4fd89727963aecfaebdc3e9885815453be1c92e3d8eb8595d7e044ce8ad0b11765354a00729648fc38ffeaea30faf201f760c830c06300d0b602b764c903e4af7f0060ff4b21231e6142e12d11dac0d68ce4c5a65db1d9af1d9ecfebc8b4b10e5be9ac8525937e0da1366a23d6cd9441c52087dc2bf9cef4ea55371b0e00172310ed6225296269011ca3b8e402b2cdc859196f48ef89d7c82f78250960d1e384c73045f914bc8f16fbbb53ac6bb33bb9658944f78b0e708204177cda7fd92bac79211cc691fb06b37f19a5b4728d5e44bf1393167e61d7a46a2d092eb5f8e155ef3d4ee2beae490bb97044971e90c055b6f829f0434366c03ef20d99db1d86aa1e94bb33550a1534075d2727c08a9e0671d7029b0607471a3b5230d2308006bd48533a2d34ee1a4e2badd2e29a7c76c83984fa0aadb9954c99a1258faecb5ac9304619c8ff6003510ea38a720006ce7b96ae58e668b90cd310c05a6d3be3a3f1ca5749596919811fbbc324bbd2025b680e4e5f595e1e83865f05494415a0c979107c5e880133526cb60b82314b6bfe0d7a2d4be6e936fa9d9fe64e16fcce1207bff6e28fb3a7f2fa0a019745cd0d53a44553a19cf96be357a4cfcde068389f47347b7b977f73755ccf05afead81b488fce6f2964def2b6d1a59557ba59ad71af9c2900b63836ff669e8de1438b929edf802d59f1c4b76f65d04f7ceb8f9e36f87d4d8391007e1990191938e14856ed4f84f63d38b9b655189d7f76ef508204af931a75e1fd011ff899f13d0bfff972cb1a679e2f073587dfdf3b8a6457fe897fcefd1ff8956bf3d7ad1355611ddd9002af05ba9f3a66346ab26b015035be428f3146227be21447c9dc002d7ea371f2e98a156a1f2f2205d43961fdadd1939763ee054d07ca1a6f1bae0f102d207a9f11039d5b6041d9e92071d72f755c57f3525d0e1e954a1e465b5406fd5af583aca7e48cdc5a9c266ddae6f3c124c4a9698aed2d69ce2c4d25485d70480fdd0da18a4f6d42aeaf97baa4858b440602582a634f96938eadb63f9cc74ac1e54fd0772a3ff66fa92dbdb6a4ec7c7923d0ee6fb5f9bc300701ac6c2f920d7e23188ed6798cf47f0df850f40a471cc8840ecbaf7834bb5b78b3ace2bd0a5e9dee5fafda8d73388671abe30574ff6e0478e3d1138d50289cd8254129a9cc3a7ac758428d73cf58ed848abb192c70b842809b141b4e82a899bcbd4d281f15443287bc3eec2330367688da43f24e30f3ad10f435508b461608b18d3baead359c35dd61d29ff574a100686c8b4521a82a10588cc1 v = {2446, 190, 239, 1807, 3181, 3106, 1567, 142, 2474, 2283, 393, 3127, 2371, 37, 2459, 1292, 2590, 312, 3172, 2780, 560, 2552, 590, 507, 46, 2245, 3118, 1859, 683, 610, 3, 2730, 1832, 3240, 339, 1375, 3326, 2321, 872, 2076, 1438, 840, 2768, 2610, 389, 2755, 190, 2044, 1800, 2608, 2546, 948, 392, 544, 3174, 3001, 2511, 2522, 2707, 1879, 1165, 336, 915, 480, 3315, 331, 2154, 73, 566, 2157, 27, 2278, 1858, 792, 707, 3113, 514, 1687, 1635, 2825, 1926, 2173, 1470, 1650, 1558, 2137, 3137, 1348, 2218, 2105, 2320, 948, 2603, 2610, 3302, 1672, 1800, 1768, 1607, 1580, 1526, 1993, 1076, 2419, 489, 1982, 2535, 2646, 606, 1809, 3116, 1789, 2374, 489, 919, 716, 2272, 3160, 1377, 2158, 2380, 2664, 126, 1486, 810, 1739, 2221, 1605, 2507, 221, 2077, 2096, 2039, 1174, 18, 403, 458, 764, 3195, 729, 172, 403, 1187, 654, 2405, 2389, 2750, 1095, 3216, 3275, 2525, 1571, 846, 3252, 581, 1238, 3047, 1797, 1574, 2452, 1741, 242, 2813, 2587, 2053, 424, 1825, 2615, 2208, 929, 2556, 3130, 1377, 59, 1592, 315, 235, 1882, 1033, 760, 1204, 306, 984, 1410, 1318, 2556, 1292, 1104, 2583, 1319, 1230, 2615, 1561, 1254, 1162, 2284, 2865, 2089, 2953, 969, 3102, 3195, 252, 1494, 156, 2063, 3127, 3223, 2897, 1081, 3045, 2592, 1420, 1107, 1790, 1224, 1374, 1589, 2422, 74, 1570, 146, 2320, 477, 110, 638, 3241, 2576, 1404, 3214, 2962, 1793, 311, 638, 3318, 2844, 907, 877, 2825, 2879, 1415, 2519, 1914, 3144, 2887, 3062, 2027, 2922, 297, 828, 2890, 1302, 133, 855, 2363, 3228} = 8ee90beff0706d2cc21fe608aab98e8971c34359029bc9501e8a1364ccad30829f4eb21f2e508c2e3c74ab222603a0aa2887ca53f155fe1c9168c3819e8534d02aa38531acbec07f0807a3f2493b880122669cbbcfa99d937a758d041593031ef3bc146a980436d2861b608e428731c392c20272696396b086d787be2567169685414c54aa988310493b2b2aa3e68c6808876e47c662f6957c343497e9e17be769a55e12712cdc6f46991e97c32ce088c561e5864c89a67ee05c2ab36cad5864cbd90d1d0883f76749123019cac12f7b9c2dac3019a3e428655995be7a4490bcccdd39624e43cb45624de75b70264699cd260ffdbaa105881a2177a3a0183afca9c361b50338b613eba07509842fb42413d8235826c59f0c0545177a52ce74a319664e8ac48e319b82899b3c1ebcc7fc605d9cf080377cc9519b43e50ba28c3545fe864c5e556376a90422260910d91d6ee027a90ca17ce5c8921b7037e127f6ccb18bd33609fbb387759d7a87c4476bbfeba7b629c1334a6b518570353bc9c9 compress(v) = {12, 1, 1, 9, 15, 15, 8, 1, 12, 11, 2, 15, 11, 0, 12, 6, 12, 1, 15, 13, 3, 12, 3, 2, 0, 11, 15, 9, 3, 3, 0, 13, 9, 0, 2, 7, 0, 11, 4, 10, 7, 4, 13, 13, 2, 13, 1, 10, 9, 13, 12, 5, 2, 3, 15, 14, 12, 12, 13, 9, 6, 2, 4, 2, 0, 2, 10, 0, 3, 10, 0, 11, 9, 4, 3, 15, 2, 8, 8, 14, 9, 10, 7, 8, 7, 10, 15, 6, 11, 10, 11, 5, 13, 13, 0, 8, 9, 8, 8, 8, 7, 10, 5, 12, 2, 10, 12, 13, 3, 9, 15, 9, 11, 2, 4, 3, 11, 15, 7, 10, 11, 13, 1, 7, 4, 8, 11, 8, 12, 1, 10, 10, 10, 6, 0, 2, 2, 4, 15, 4, 1, 2, 6, 3, 12, 11, 13, 5, 15, 0, 12, 8, 4, 0, 3, 6, 15, 9, 8, 12, 8, 1, 14, 12, 10, 2, 9, 13, 11, 4, 12, 15, 7, 0, 8, 2, 1, 9, 5, 4, 6, 1, 5, 7, 6, 12, 6, 5, 12, 6, 6, 13, 8, 6, 6, 11, 14, 10, 14, 5, 15, 15, 1, 7, 1, 10, 15, 15, 14, 5, 15, 12, 7, 5, 9, 6, 7, 8, 12, 0, 8, 1, 11, 2, 1, 3, 0, 12, 7, 15, 14, 9, 1, 3, 0, 14, 4, 4, 14, 14, 7, 12, 9, 15, 14, 15, 10, 14, 1, 4, 14, 6, 1, 4, 11, 0} c2 = 1c91ff18bcf20b6c1cdfc323b09f33d00972b0a447ddd2a1d95c32efcc9d2624200aa3b049f382e8a987a76fab5bdd808988a7c5a2dc939f2b34fba7db71848b1caa6a20424f2136bc5d0f8c04639fc818ce2ad94bfc072891451675c6566cd668b6ae5eff71a1ff5ecf5769870c182b31c0f79e31e044eec7f9feea416e410b c = afb72488670b7d47769ee04d7479303a40b8b9d395eccdae13519e11f68df02993fa4fd89727963aecfaebdc3e9885815453be1c92e3d8eb8595d7e044ce8ad0b11765354a00729648fc38ffeaea30faf201f760c830c06300d0b602b764c903e4af7f0060ff4b21231e6142e12d11dac0d68ce4c5a65db1d9af1d9ecfebc8b4b10e5be9ac8525937e0da1366a23d6cd9441c52087dc2bf9cef4ea55371b0e00172310ed6225296269011ca3b8e402b2cdc859196f48ef89d7c82f78250960d1e384c73045f914bc8f16fbbb53ac6bb33bb9658944f78b0e708204177cda7fd92bac79211cc691fb06b37f19a5b4728d5e44bf1393167e61d7a46a2d092eb5f8e155ef3d4ee2beae490bb97044971e90c055b6f829f0434366c03ef20d99db1d86aa1e94bb33550a1534075d2727c08a9e0671d7029b0607471a3b5230d2308006bd48533a2d34ee1a4e2badd2e29a7c76c83984fa0aadb9954c99a1258faecb5ac9304619c8ff6003510ea38a720006ce7b96ae58e668b90cd310c05a6d3be3a3f1ca5749596919811fbbc324bbd2025b680e4e5f595e1e83865f05494415a0c979107c5e880133526cb60b82314b6bfe0d7a2d4be6e936fa9d9fe64e16fcce1207bff6e28fb3a7f2fa0a019745cd0d53a44553a19cf96be357a4cfcde068389f47347b7b977f73755ccf05afead81b488fce6f2964def2b6d1a59557ba59ad71af9c2900b63836ff669e8de1438b929edf802d59f1c4b76f65d04f7ceb8f9e36f87d4d8391007e1990191938e14856ed4f84f63d38b9b655189d7f76ef508204af931a75e1fd011ff899f13d0bfff972cb1a679e2f073587dfdf3b8a6457fe897fcefd1ff8956bf3d7ad1355611ddd9002af05ba9f3a66346ab26b015035be428f3146227be21447c9dc002d7ea371f2e98a156a1f2f2205d43961fdadd1939763ee054d07ca1a6f1bae0f102d207a9f11039d5b6041d9e92071d72f755c57f3525d0e1e954a1e465b5406fd5af583aca7e48cdc5a9c266ddae6f3c124c4a9698aed2d69ce2c4d25485d70480fdd0da18a4f6d42aeaf97baa4858b440602582a634f96938eadb63f9cc74ac1e54fd0772a3ff66fa92dbdb6a4ec7c7923d0ee6fb5f9bc300701ac6c2f920d7e23188ed6798cf47f0df850f40a471cc8840ecbaf7834bb5b78b3ace2bd0a5e9dee5fafda8d73388671abe30574ff6e0478e3d1138d50289cd8254129a9cc3a7ac758428d73cf58ed848abb192c70b842809b141b4e82a899bcbd4d281f15443287bc3eec2330367688da43f24e30f3ad10f435508b461608b18d3baead359c35dd61d29ff574a100686c8b4521a82a10588cc11c91ff18bcf20b6c1cdfc323b09f33d00972b0a447ddd2a1d95c32efcc9d2624200aa3b049f382e8a987a76fab5bdd808988a7c5a2dc939f2b34fba7db71848b1caa6a20424f2136bc5d0f8c04639fc818ce2ad94bfc072891451675c6566cd668b6ae5eff71a1ff5ecf5769870c182b31c0f79e31e044eec7f9feea416e410b uᵈ = fa3b3da7215464536106ab8018e637ac3b27bd506bb9ebabe411b580e90f88f714fc3a734c1629e6db407f9c627f942f80a99bde05332eb5132ab4436a721b3a37b03cc647cab4b65e678c5a73908b2346123200f3976f3e2c2ebdd98dee39cb53065bb1c6a29cc0301410a9d0085b7497a30aa0ceed3c00f9da9bc2761ca2e31ec23625b8060b9f647225065805169082dcb11ca6a8fc323e19da0b68d4a725811e5e68afb5562c19ab4fcee27814f4097331b3cca3c2b8dabed5ba91db02000caa01284950b9131c6808011c3a707447028365723b851469b1c60222af4b4c6a9b5707789431fe20a2dc837841d4985118902eec43f05b2c216c9689f43a3a9b712eb01feab0121408ce2b95236f2513b7f5a098ab5a5daa6792633c4dda723281c6008477c85613c0e48599447759299366664c9d39327e77c17cc93b646309e7f07a6250076b2494661602cdb0364cd1bf333a0bb20bb43b918a629096811a4561133576914b40da012fd28054b36092007ed4495b55f52f0b711ceb1968549371e9532f92b0b876653fccc32213c77d14f86dbc5b6bad79a9b58b7937c414a54774f63b8ce4a127244469f4ac4e4a23ba1d977073014ed8926468c870c9275559a2276b139c658494261785903965e4914896440e6606987ae290cc43022851bbd8724da2c7ba9f506d754475dd401148357f57c36432f1135daa42e03798684028b55abbd5226353ba5182882c6d06cbd6074048e0c2cfb305ed68263ae3919f488e39d2002b85accb724355752ac5367fea5c2cda8485e1650a4eb82dc68b37073c64ac5b2ddc0a4be145c3a938b058b0c6f2d25a8520bb538a94e86549ca649762c415a3397f85004e85eb2bbd29bbc142b79bfa2036a6b5e0447705fa9f148c4654d34054dbce32562c6666afa9407681567b44c31451e00fce2146c3ec37133b32f6635768b413bf5b54a3a941a741c3fd9315bd74b465301966c61496fc087da62653c215cf07cb73112b784bce273c70065bba05a267dee5cf64bb791d3b674fe90f55f4ade8a575c7c949c9ab813d273992e8909c0400d57a9a972a1442d11b10683f6f91a3cb12a99fbc84f04781368211198bc4ef1604f1e50f783c8d685c623aa7c151e35e08c2152a4bb72d030d92b08363460e4af39691163502d60bfbf9aed9f3a1bdb4c54bc4ba18267971774f89854454d38ed51a6bf06b3c9e32b325f1552b69b1ac3c1978579f6655873f3925d677a6ab421e2ab404b7610c0fa60d29a240e357b9ad297b5d624956b23794166899785081872ef5028d102c9f89c13cb4a5ce4d5361491a51bd9989d393577437c0d3242d4713c2a9347e627c2757139c1169261bb5b63387134ed87f87b2c6dda4687183c6e1899fa3e16bee39cd817b2a218c6c743a8c1f968b18d67fc6ccc769357376e1500f3a8b224634e40c5a0d202da21310ca216cb7f5afb953785b38a63d276107e5358bcbc807d5c02ef89538c5236c61230d607e024ab775f088f1a1b2c8b220a5133536ca6de4289f4a072730f76d62153793e903673a8d34704d4a3371641769f5097340d7b1e5da7eed3318bcd3811ce31221805420fb47c2968889e06880429d NTT(uᵈ) = 658a6b5efbc194a138f66535a84c094fa4843ab572afd4c8a2f4ad134a8794691e7efb1418606e20541b27340275ea4361911cdd3c19a49b6c1fda588324b40b172612d19ec44c4aa7e1c1668726748317bbb7cd84764bda1b9de00230305889694a55dd47095f97122f322ce4f10f4229a9b8fb4b3360b065d3bb1ab60bda5895b58621a71687daa125d8a9cb9ea1a59e629b802008f28780de2c29bd726991629d56614980b66005800533b907b28b2860cb0609016966058848b08a9bcc5eaa4234cfa9377025b67035197105c32f5aa2e46741a7a3973f976fca314a6535c7e6d6b3522773602c4be442bebb793b2ebcabc5bbb713ba5ecf3b7195a8765aa9baece8748b8920df179ed4227cc88ac7d6170615113ea09b3da2cc446e889d0b9c6b72f9685fac48f39a9997c3ccbfa281b255b38a5c15285611df2728d6e31efac48fcbe27118fa2b9f28bd272b69e72c9688862cf8030a9cab5d83654463491ec1e8ac3c1c59a763207c841ceeb2380720195d950ab504b1942837602177b4844e63c3bf700181e51067f675945f1c522724ca71fa418b617e0665025d18261345c6a56602b984cb37500a563c7cc56612d4d0cefd77021c2494776235178ac3a5035e806a1fd4d926571a8d33f60397804265f55ed580ba750ac8878c3bf7498aeb4373947c68ebd6160391ba444026bc12bc5019396bac7272ba514f2162f38b783a990fea3bcba7334485930a705644f8d8761a2376e375976c206a4864bb6d212d483aa075f4a7fd7209c40934ae4965bd8822aaa2b07be104a82596fd8302bd459727819f6e060368b0058bc071956a4363693307d780f1b44107aa280e9b7079194dccaca1c5173eb5300f51467d2d5aa3aa1217f91a6680a2408125239461277289a2a5b4a963454ff286c67d5baea9a99990c03d0d8c9efd96b905a04ddfe24d4eac80f17b3fa5d44493b7477c696d94d2a97d80a86032593aa07d2cd39e39a6af03e01c169bbde74a3f812091a7d1a49538ab4dd6a2a0d7590dc1a70cd61e5c2a5d963b2a94e45fd25b557a864097d93e4bea711fcb0a83901adf4a6614606ae61abc211a2665f33324da039590ad42a09d0b19707ea98334c8bae38304de943745474350b6bfd859959e928ab3477b707a0a73aa8683d876da4a78db3003eab448395439d8019c24561d78ac95a0420323583c55609685fb346759571d37a0d40b7cae14947b7ca819190dacb7389a3b04f0d159ea891307267baf81714f986da4fcb8550326ac81c739ec8dd2091c2bda40440841b00784f3a8a41604cf25d57c95560a16cb50b45c4359781218d1386831b32f53a7ff9899c3fb8980e16bd5b26a0b6b39d9734c125403cffcabb6a5a44b00657f14a8c6934c5d979c70c603552b3321698966ba3f386a23f2bb1381a040c120980b546fa4158e24499246c991fb144d9a64928001834f85c48b144e21d6780197c899c31c2835a75b255fd66c136eb0b303b695a43a08717855782b0052132259279c1c519c18aa8c56454706e655c53c0cfbc6c29b07452ed9c49ae12ee4fb1c43927c73b76784788c1ae4a760056a444a17066911989367eb62c5b1a4056c666121a902 vᵈ = c1090dd01075311cc381060dc1198fa011c3f10800c1094ec1090d311ca970129c70021a00108f311c757002270010a9510700a0015b00108f401382b00534911aa9a011a9d010825117a9c10941a00127311cb6c1199c911a75e0041a40031a00001a21080070128200108f5107347012c3a011688116b6511782b01568b01582310c4ef11882f10841911aa9001068511768811668b0158210149ca01182c119a9701275311c75f1081a400327f118c3b01582f118a9d0005b401368f11868c1090d21188221084e00001aa00134310c34d0001ae00427c1198f910a41310c00c1196840030070024e311c7581169c81060d611b9c21081a5117a9f10834c119c3b0050081061ad01075100434e0040d10045be0149ce00441c1094ee014a981064ee0148f611b82610b41311cc3d0005bd01082311cc3610b41311c9cb0054151074eb01568c1090081060df1081ad0002700109cb015c3611b75d000270010b6400334611bb6b0159c5117c3611bc32118b6d00034610b4ed00034f10800 w = df460546766a5b666761e00314d06606a0cc4e9ccc74f662ccecc979566189e6689286caf39c01f7fc06bc7c6a08b0662cd070d4260100b06115f067be4607a43c70fd26cb48860396a66abecc6b4df0062746c7891c658a266d490000877cca1ad06f2ab6c854e6c874560137406e9b8c0137f667dd6c0784eccc46f602c1dcc917e0c9b6f66236a601e19605c17604432003d30608c41c05ab066aca6c7127906a79060989560706266a2476620620ce4910c9ca0c6cf916cb38d661ddd6046ab667befc66c9066914c065e4cc6eb2cc6719600542a069b1d6c4bebccec18c6916c005050072d4b66a12b7725340050350011c77ca2fe06cee5c6dff266135a6cc29806351306c4736003c466ac41c699a3601d9bcc946e6cc744cc9d0a6013867009000040cd065d5dc070920636126c72c3003d9ec607050ca3640cc4a906548e069837069cce6697ab06ce5ec6172506a2d406013175b4c766f089667d56c6e2186cdd4766df5a602390661444002fcd66829d602efac610b776b9a5c6c KBar = 2f3eac7d224d818aceb416748cf117f7f61a8554e8b2b6522fdcc6dfb37e9995 fips203-0.2.1/tests/cctv_vectors/ML-KEM/modulus/ML-KEM-1024.txt.gz000064400000000000000000000670141046102023000217700ustar 00000000000000eML-KEM-1024.txtKFrйVt#MSɜ&.Ve~ i~c{w>-vӞi}=ަuoӽo-Sm{;wϩmlvo7s}Gzo2Nk{uMW^v\\|uN1O˳M>zLW.v}/z ]׾|XGy<ؾigs~߶O>{ݞ{kyn^7}u3KvMoX{|g۲ג]uO5/\ヘE?urL|5د%n'.ǜ՞}yX{,W[ϲZ`1\wOiZvlǷy\˶w'[o]9p}ugy~8z7er;缼k{-O9~o,i['oX{ԛw_Kw<5uNV۲fk<Ŗ=_,YyO=E[b.~wo3]󾬿]2ޝ^s2-ڗԎsyȲ{i:gg~8˲wow\rY\ڽ\[F_S=n88/$`cqd{s:D%G:){o-rLT|O>9\·_O ]*G*g'G׮o}l7g`yTm^ݮs-k_SSe^ȾyZSĬڜ[)Kwkn6h}ߴk-3n'<{<ͩ[[syWum[S6w\>mmr79&ۚ°?{VXڮu_wrF9N=7oʎr n9u}xNsnk}zvlۑ*1kQ߾OλB=Y{j)wά8W{cٜ=O6ӜB۳kK\_{$Ԅ,׳$ӖB6=51_tIwr9җ(sǻj-6o~YtxܥmrcsƻYtV3C žM[5{${SR՗Vs_!yߒo&oy}[jeG/?L{xSp5:/wte4}96r kLҰ|}Lg)\d5[rK9)o/2׻}W>g:i"sյ#Zi9ԙ T}K>f%:RNӅsRbά|@Z(_ڳ=JfϘo5Mb&Z۳Ͱ6oۧwߏ/m } $=>O!}ML9~[6_ٱXR"{8{r&=]l6WOARaSq2eeHɻϙ=>>vzƖnk=ۯedbڳ>:ÑKiX,9Elt -F /=S2kۜ;/KjN#5+sZ̕i#pJ)iGfԇ9ewX/\_Aky8ϔb;X-! $= @Ŀ@@@@@xQD?;@@@@@@D Ĕ !?"Uoާo7@@ї      o 26&s     ! z;@Ŀ@@@@@xQD      o 9      B ļe@@@@?Dd o7@@ѷ׀U     ? @cQ0M      bQC      OaJ      #Q@[@@@@@@D_$7e(s' Fi QDˌ& FiJS(bΎh5@SvL(b} Fi[("3      aT rQĈ0el%@      S +@@@@@@D 'R6      *QxK"("jk3@@@@@@D #4@@@@@@9o3@@@@@@D #4 z.-%@2r@@@@@@T QĈ0e4j%@d8QĈ0eZl%@}_ Fi0 QDY@@@@@@D #”@@@@@@1ƶ@@@@@@1"L;@@@@@@D Y' F)@@@@@@1v\[      J_      |K F)@@@@@@1o @@@@@@D#”i%@d QĈ0eE@@@@@@D ӛYj(bD8@@@@@@D %@ӚQuerZ      JtQeV F)M@@@@@@ai5@S(      *\m(bD|{ s(bDr      /w6 FiۧQ3 @@@@@@1"LQDrQĈ0QDN6 Ɛ=o(bH}~35 Rh@@@@@@1"L      " Fi^"j;@@@@@@D #”'      J-      aʀ      JȁQĈ0i %@)f@ӞQD3c@@@@@@D#´@@@@@@hbDr{      t` FiW("4K Qx2@@@@@@D oP@@@@@@D#[QDebD~{o%@#bQĈ0'7 8L@S:I(bS      a      JXR$      a!@@@@@@D _<] FׯQDJjN@@@@@@D #”      JG      J#@@@@@@D  Db?R@@@@@@D cL@qQx" 2@@@@@@rr&      *#{      <%@Ѳ @|@@@@@@1"L@@@@@@D 4! F)E@@@@@@1@d\"xM"n'@@@@@@D #4F ) QĈ0e5 Rs      J|X(b(bDR@@@@@@D       *p("mc@@@@@@D#”      Jb@@@@@@1"LW.      uZr      J       -e2      a q      JQD. F)շ@@@@@@Ӫ      *+       sbD@@@@@@D 9k      JL      3+n F)#e("#ϚQĈ0@@@@@@D  D      XsQDn F>Qxn" rA9%@> QĈ0ݣ@@@@@@T#?QĈ0V@@@@@@D K      JQđ F)]@@@@@@ij@@@@@@D #dJ(b (bD25 J@@@@@@1"LQ/ž=%@s@@@@@@T'      az      J2      azZk%@,oQĈ0 7 ҋ@@@@@@1"L6 o(      a5 p{      Jw. S{      J@@@@@@D 3@@@@@@1"Lk%@(bD      9%@SJi("hn/@@@@@@D #3@@@@@@D Fk(bO=bDҎ@@@@@@D )3@@@@@@1"Lm      Q Z(bDR@@@@@@D gk%@SKE(ŵQĈ0 Z(bDZQD@@@@@@D #      J)      a@@@@@@3QĈ0}h@ٞC@@@@@@1"LߞQD> F;z("Ck#@@@@@@D #@@@@@@eMbD 2      J @@@@@@TYm@@@@@@D #@@@@@@zQĈ0n%@<@@@@@@1"Ly      q@@@@@@1"L!B(bh            J8R}[(bDz*@@@@@@D gk%@S      *Hs;@@@@@@D #[@@@@@@D "L='      o(bDy      JȐ QĈ0eu? ;#QĈ0M@@@@@@~@@@@@@D #4@@@@@@1@|@@@@@@DYk      JHǰQĈ0M@@@@@@暿      aF""QĈ0M=@@@@@@Ds!%@ػ%@RRA      *Ѽ@@@@@@D ӵ QĈ0@@@@@@17@@@@@@1"L]      ;s%@|      k      J@@@@@@D @@@@@@D #4(b}1%@QD.ubD%@      aZ@@@@@@fbDs> Q      a > 2]@@@@@@1"Ly@@@@@@D ;      JQDO Fii(e "L}      j3V F)QD[      JuM"]> QĈ0(bV" r]      J[      JZ> R}o(bD%@{+@@@@@@D #”@@@@@@Ѿ/(@@@@@@D #´0 o(b(b6" FOn(bDR> r9X%@6& L            s QĈ0e       J}@@@@@@D #”K      JHZǞ(b|Y            J      ;Um FiW Q~QĈ0e      J,QĈ09>%@sQĈ0eA> G FiϜQDTI "L5@6@@@@@@1"L@@@@@@D )@@SQDQĈ0e~%@\9@)%@,) 9i@Sƅ       @S      +pZ@@@@@@D#”/      J;@S*QD6ВQĈ0zfE (bD> (b      T;      J      *L@@@@@@T1"Lǘ      *ضs F)(" "L@@@@@@%@ӑQ}(@@@@@@T1"L^@@@@@@D c}'@@@@@@D vLQxQ3&%@:@әnQDN F)(".c@@@@@@D #”C@@@@@@1;      JL@@@@@@D YݜK F)=(bN" _z@@@@@@D_Zw@@@@@@1"L? 2̣@@@@@@1"LcD("}. Fڧ            J (";}4@@@@@@D#”@@@@@@/8@@@@@@D #t/"s/8@@@@@@D#t C@7QDwϘQs<@@@@@@D #tQĵ,w@@@@@@1"LwFn (bD      JH      a      JGQĈ0e7~%@q@S      'tn F @@@@@@D@(X%@7YX 2(z3=%@ӓ&QDޔVQĈ0~%@Yj F)QD: QĈ0QDVqKbD'c @@@@@@D@S>(b秪@@@@@@T1"L^@@@@@@D Y5#/@@@@@@D#”      JHy      a      J> QĈ0%@dR}/@@@@@@D #c (b@@@@@@1"Li'@@@@@@D @@@@@@1"L? B{      J4      Ԗ{      J@@@@@@T2~      1M%@|QĈ05E      ˙l%@S~("-@@@@@@D #”@@@@@@q|<@@@@@@1"L@@@@@@D ~      ajM tU F,@@@@@@D9      J @@@@@@D 9i@@@@@@1"L)@@@@@@D k_      Jo? {(bD}      JH+@@@@@@D#QDt? F˼ Qĵ%@L@@@@@@D mD Fr@@@@@@~@@@@@@D #("      j>      *QĈ0|@@@@@@D |      a|@@@@@@u Fg6(b:@@@@@@D9@@@@@@1Q      aJ[      Jx2|      a9%@po_(bDzg      -B      J        %@Sjk("x@@@@@@T1"LQDO%@E2+@@@@@@2Q(2ӕ"u??(bDr      ~G*@@@@@@D#4@@@@@@L_      aJ7%@Fg      J0s]%@SQDz8@@@@@@D #4渚@djr@@@@@@1"LMQxg" p%@dBe @@@@@@T1|M("#QĈ0u 2@@@@@@1HQ(@@@@@@1"L@@@@@@D5%@E      j8m Fi'      \dZ6@@@@@@D #´@@@@@@S       aZ1t@@@@@@       a       JȣxQĈ0w 2iO@SNm(">QĈ0et O_      JuQxQxo(9      aʃ%@d G(bD  (bD;@@@@@@D 3o      JQDE!@@@@@@D #”@@@@@@@@@@@@D #@@@@@@wi@@@@@@D #x < C      ̠g      J'-      7QĈ0=m%@= @@@@@@1"LOOb@@@@@@1YQDs/@@@@@@D #”9@@@@@@ QĈ0w 2ad(bD      2@@@@@@D#fg@@@@@@1~/@@@@@@D #”Ѫ@@@@@@o F)=@@@@@@~_6 F)      JCXz(bD;@@@@@@D _6Eo%@S[ @@@@@@@1"Lm @:@@@@@@D #4&U Ls%@SQė      j      7[ >bDZ{;@@@@@@D ۲@SY      *XSQĈ0}@@@@@@D Yk      Jo;@@@@@@D       a RGb:@@@@@@D  `%@ӗ QD? "Ld      j5      aZ@@@@@@D-}%@E      jئw FiE QĈ0%@,QĈ0ew uQ_u rm@@@@@@1"L_;@@@@@@D mQĈ0      5mw F)#L(";@@@@@@D #      J89 QĈ0M@@@@@@TFv      a=      d      jL      ME@6 T6@@@@@@1"L@@@@@@D [@@@@@@D#4r      *0ZQĈ0M_ 6@@@@@@O("ɰQĈ0      JȬ5 s@E      ju      aJ%i%@,XG(bDv@@@@@@D 3k(bD{l R}3G@@@@@@1"LFQD0@@@@@@1"L@@@@@@D =@@@@@@D#´LW(ms6 @@@@@@D #”q@@@@@@k @@@@@@D #”      J bD,      t);      a5 rJr%@S_(b.bDr      n9^%@D@@@@@@T"x      aJ]i%@ζ@@@@@@1"Li      /5%@SU("h:0@@@@@@D _k5@@@@@@@T1"L      #[      aJn%@7m("s 2m(bD/u      1p4 F)@@@@@@7 F)@@@@@@A{DQĈ0m[o%@f(bD,      *xQĈ0e@@@@@@D 9HKbDk%@v6 F);@@@@@@6qeNbDon%@6 FiO("'zJ]bD@@@@@@D QĈ0exk%@3B@@@@@@1"Ly      l+ Fi?QėZ Q_S      *XƩ@S@@@@@@-@@@@@@D #´      JH(bD~So%@P@@@@@@D #Cln[W $?D#C8 m"gk   *@\d ” 2 r-@@@@@@T07w [a II| ”E; re@@@@@@T S@@@@@@TI\ Qb+L@@@@@@T* @@@@@@D0=i      *@  &k      *@@@@@@@D0e@@@@@@Db+LQ+*      VrQb+L9 23      *@U>q, tPh)@@@@@@T$Qb+LyQQy> [a:l@@@@@@D0ݲ      *@ 81fips203-0.2.1/tests/cctv_vectors/ML-KEM/modulus/ML-KEM-512.txt.gz000064400000000000000000000271351046102023000217110ustar 00000000000000eML-KEM-512.txt[6vwpH|=~^nۭRV g*槝ԟ_6}vw>XuZm;;纗wu{s{\휞Zwٗm[魯ږڎ瘷=Ƿomi=G۷}Ʒӳq>i~;|噎<˾ߺ^{zi_]t{]g]gv9Gu;Ey=k[<s?wcLz~Ӻ/_gnt?γt|Z6sר;\w]}}=߽\r=n-ߘkY>}绞inznaZk}ƘeqOYVw|~[zۗk5\s]뢏Zئq{-TK=i9zϳҧu/k{y˸s]S7:-khjQk Q^vlf~Komkyg[[o͵i:O㭯˺4-S=Z=c_g.{]& ~vmzhugz׻N4ZY|^Co]򷝷-G޶uUw;:q4m~~N_{e=}jzkxgZy}7{8S\wR}94sx}Wk_={p=vթ^encAZG]O-˼Yׯ}O|uީN\d5 ks2Wj=m~[?j}됼{-g_'bj[ksk`Ǵ/obc=ѷY{vZQa Pyǻ_U+359靟m5]jwOO]I-J{j޵O]{|)sV߲-ְs\GkuvoknO1#|N^O֢`?@o23# > >  @ 'i@ @d$d} F@|@|@"@ o{ @"a @(iG@$HֆY @ A!@DIm @ i['u@$Jv)@ AҶm@$Jl@Iۺ @(i{@$(.u@DI @ ig @׃@$) @(i[Ϣ @$m* @mm H} @%mڥ@Iz+@ Qvmo@$H5@ Iv٨@H8uf I @ iE@ IҶޤ @$mZ @V @ i{Ԅ@$J+7 @u @,i[c @ i[@$J`o@DI۶ @%m6@ AҶ@DIm @ i[Gf@$J7 @ @(i[ @$m@DI} @ i[k@$J W @~ @ im@$Jo]@ /~9 @(i @$mv @mo@$HN[]*@ IҶNC@$H։@$K ߋ @~7 @Qk H=  @mM H}F G@ AҶ H= m@ QK@$HH< ɒ K  @m  HT$l'@ Q{@$H9< 6 @m @(i{Y @ @DI@ A;  H=[ @"a; @ Av@$J^ \ @$i{W@$HnW@$Kցm@Il@ QҶv\@$H֓ 5E@ A] H} H @U @ ik @%m1@ AҶF  H@H<@$J4 @6 @(i{5 {w@DI<@ A  H n @mm HP$jB @%mk=@ AҶa@$J4 @t @(i[G @$m=@I HHm @(iԮ@$HR=@DI @ i{}@$J֌l@Ij@ Qy Hs@ Qiw@$H=@DIg Hj @%mkQ@ AvY  H}k @$mھ@DIw_@ A7G u@@ AҶ  H} @$mV^ @m]@@$H~ H} @ QҶQ@$HN@DIo~@ Avyk @$mu4 @N@ A8 ? @mM HT @4 @m [ ߋ> @mu@$Hc @ i[[ @%m<7 @r7 @m  Hݖ ɒo @"a Hmu @ QҶun {Y[@$J6m@Im @(i @$m{ @mw@$H @(i @$mu @mm HP$ܮ ɒ  ɒm @\$' ^@ Ay[@$Jm@I: @(i[5@ /u @mͷ H6 c@ AҶ&@$Jڎi@Imi @(i;j\ @$m @$i;-@Hxmm @%mG+@ A9@$Jڎwi@Ik @(i[K h @(i;F @^$ \ @"r= @$m(@ /@ Qv H=j @%mu @m= @(i;9@$H>@DI: @ iM5 IS H{ @ @T @ ix @[{ @^$\> @%m:@ A@DIy  ߋ 3@ QvC {  H @%m  H }@$JA@I^  HG@$HsZ :@ Av H]z@HXp@$Jt@IcI H] @H @r @ i[sz@$J. uC @ Qviw@$HZ :@ AҶ  H] W @m1 W @mL@$H*@DI|;@ AҶ,@ YҶj@$H֮Z v @sY@$I۵= @ i 8;@ Av H H]@$Hn 7 @u @ @yw @mm @(i՜@$(>9 @(i[ 7 @ @"a HF=u @^$ @%m@Iۥ#@ Qv_ H;@ Qvߟ H= Y# @ @DI: @ i4@$J w @m= HG m  ߋ @mi 6@ QX[@$H@DI @ i{@$J~@ /^g? ;@ AҶ @,i{ @%m H= @(i{@$H' @m H]~ @%mw @v)@$I&@Ic'@ QҶn@$H^9 @(i{ޣ @$mT@DI, @"a?  @ i~ @%m;@ Av H @ @DIk:@ Av[ H @"QC @(i{g@$H^K 5I:@ A Hj @$mk^@DI۫ @ i @%mQ3 @ @DI{:@ AvY:@ Y^ @"a-  H  ɒ9:@ AҶ&  H  Hy o @j @"a  H SJ @3 @"R @(iO@$(ֳ >w @u @m HP$ H}j @$m?@DIk@E@dIۚ @ i۟ @m H-0@ QG@$H.@DI۷ @ i[@$Jھ~@I!@$I|:@ A@$JھwH @^$| @%mkv @7u @mM HP$} 5;@ AҶV@$J@E;@ Q[ H @%mk2t @QK H ][ @$iw@$H>_ {v @/@$Iۯ= @HkI ߨ ߋ@ QҶW@$H.G@$Kڶ@I6@$Jڶzq @mo@DIv^ @(i@ QҶg@$H>s@ AҶ @$m@dI۶v @m{@$Jڶ@ .No@DI>O @ i\ @%m{-@ Ap{z@$K ȟ;@ QҶֽ @$mߟ@$I @ /> :@ AY Hm@I~@$Iu @ H H]> c@E @(i;j @$m @(i;Χ @$m @(i[ @$m @$mGU @w H@I @9 @ yL @􏰖m@dkC  VW  H/k @?u@$c@ \50 p H3& @e2@$YX I~b@$i@ яs< z 5&f @T HP$\1 @%m  @c@$IY@I3@ Q 9 @$i;ߵw {jb @$mk @ @(i;i @$m3f @< Hj6 @%m7  @rռ@$I@IۭF @ QҶr @$m  @(iԕ @$mg,@DIۥ6@ A!@DIm @ i@$J.@I> @(i[#p @$m-@ Iv HP$\z@$I @ i[ck@$Jڮ1 c@$Jֳ@Ik+@ QҶ@$H֦Y k @m @(iw @$m9V @: H-6 @m-@$H. & @ i=c@$Jn> 76 @m@$H^ ɒuX =6 @m  H@$Inm  @m H: 5v @m-@$H. @Hc@$J{@I;@ Qv? H @%mN.@ />  @WC {[@ AҶc@$J @m H0 5 ɒu@ Av{ H_@$Hu Y' @ kO@DI7 {Y H=g @$me@DIۣ @"a H=5 2N @mM @r @(i[q @  H=> 5N @y @ i{ @Yc @ i@$Jڞ6 9N @@$Jڎ @(i{} @$m+ @5; @"R @(i{@$Hn@$Kց@I:@ QҶv@$H^u< 5E@ A@ a]@ A; H> }@ Qc @$mw@DI{W@E7@ QҶng @$my@DI{?@ A@$J9 6n @6 @\$u @%mk @"W` @%mk=@ AҶ @%m@ Av H6 = @Ҥ@$x > @m Hq= 7 @m H} @%m@E¯> @%mv @m H}@IZ @(i[: :^ @ @ i@$Jھu@Iۚ/@ QҶ@$H^x U {Q  H @Iۯ&@ Qm@$H@DI:G @ i[w @%m6@ /. :@ A75 8@ Ax H): <> @  @ ;@ A H@I @(i[o< <@ QҶ@$H.@$Kڶz@Iۚ @,ii@Ec @(ig @$m5 @m @^$| M@ A{k @$m[@ AҶ? @%m۸@ AvZF@$J@I @(i[f @ kt @m]<@ A@ YҶK @$m:@ QҶ@$H֎@DIy@E]@$I޶ H@DIۚo @ i[y @%mǼ @r H3 5@ Qv@$H@DIq HP$1 '@ A9@$Jڎw@Iۯ @(i[K5  @(i;3#@ޏ|:Z;ߵ]֧~?Ͻ],Mc=g>s[{iY=:>o~k׶}Xmjumm|uyۦcގw}m,2y)>zqq+O˳-]׸陯zgzv/ym/1\Mx#lcُ}w9L(w;8mylmL3XxX>MOl}^ۯsjK^{eK{1;ޗ7gwiu/{c7F{5+X;nf;՟qG񎸾1k}buk|vs]y_#~~<'6}=- 76xy_ǹDΣ_O_~5wXco nGYKӱ[׵+eWa{~[ocwmQrĵ2Nkس/}_ ]ϳαX8dyK^uZ~t=Uy/{r.-V. tYbZ" W79ιMe<~9 lQ(˹un)n3cu؎<;5x|Mw?֧qT;(>rN{iZ5q̨uͺDQf1nwߖ#vzmK~voe|m ^_\٧g9{?{;M3*bc;**v yY~v߹K(yobڳ ziOwlxuk;F}Qh㝟g4iؔw6cEsw4#:=QBy\׹5Dc8ck9-v}|{,GX>q]u_1.[vx;6eqFѧD~>hK]:[T/_t8_}Cf-'[,m=cm6k[3s{E-v$q~q?Ϗwz_=}.LTw(gޮ8=CiSpD_,QW}亞yg=(m]gZyyMq:_q1?dchE;|~>z!>uEysubI3lۺ/.,.8i?F16硉e^}h>~Ÿy8˲mϿy;.5i>~&׼YclFĂrE;}q1mGG+roϗ}~y:qGAm=xٲ[7:_5qm^\!kq%y+DS8ǯ>b[0F\ἣ6cDޯu9c-{;x|6$*m=3g?F:caUpǎ PPPPP@EPPPPP@QPPPPP@e@@@@TP1:b@@@@TPE_lPPPPUc{~PPPPUTFxmPPPPUT>jPPPPU@@@@TPs ~ ;zA 5((((**N 4((((**^n@@@@@޶= Q /Fe(((( ֶ@@@@TP5((((*j@@@@@ĥ@@@@w@EPPPPP@e so  PPPPPg&& @@@@@}TFx [PPPPP@e [((((oVPPPPP@EA\m((((2 4((((** oPPPPP@@@@@TPO@@@@@};PPPPUTFx{@@@@w@Mkr@@@@g@e((((b&1 ;2;@@@@TPO PPPPUTݱN PPPPP@ew((((i/((((2 4((((**@ JM[((((PPPPP@eC@@@@TPq&v@@@@TP^5((((Z> @@@@@uO *#h G ֳ@@@@TPY'@@@@@޹7 ;a((((@@@@@PPPPP@etiPPPPU_= Kl{((((bpħ w  +31 ;2;hPPPPU:]PPPPUTFxo@@@@@ck@@@@@޵ :PPPPP@e@@@@TP((((2»$PPPPU]PPPPUTFx6((((**Z.((((**#`R((((k j((((PPPPP@ewPPPPPQ[PPPPUTFx@@@@@uo7@@@@@ PPPPP@mo((((2‹A i@@@@TPE5((((**d@@@@@ 'P((((?o ;NQPPPPP^5((((Qz@@@@TPd@@@@@=PPPPUT PPPPP@1PPPPP@e@@@@TPsY{ - -((((**!֡@@@@TPaPPPPP@e\@@@@TP1@@@@TP= 1< ;2{ OPPPPUTFxQZ ^((((*/›PPPPP@=KL((((**#7 @@@@@^((((**#7F@@@@@>z@@@@@^0((((**j/@@@@@^ PPPPP@M< PPPPP@ExOkPPPPUTP4_((((6((((*j]{(@@@@@; ;  j@@@@TPPPPPUF@@@@TPm4((((*?@@@@@^;o@@@@w@((*((((5@@@@@u@@@@@^((((F4 Z@@@@@uq@@@@@^@@@@TP:ݭ@@@@TPlPPPPUT:@@@@@^TB((((b 17((((*j[PPPPUTFx1@@@@@F}PPPPP@eׯ )_((((2‹ ;ZkPPPPU_b@@@@TPC+PPPPP PPPPP{o o ;u6 5((((**@PPPPP%@Ũ PPPPP@((((2q #fPPPPUTFx# f3χ((((πc@@@@@uEٴPPPPP@e7A@@@@TPmѺ @@@@@ *4 : oZPPPPP@EI}(((()QY ϡ 32› @@@@TPOPPPPUԲ=:@@@@@ŭ /@@@@TPQO41((((6:@@@@@=TPPPPP@ePPPPUTg((((**#y:@@@@@'@@@@TP PPPPUԑ_8@@@@TPEPPPPUTPPPPP^`@@@@TP#JPPPPUTFxq vp /j@@@@TPhPPPPUTFxq:@@@@@5LPPPPP @@@@TP|u((((Z @@@@@}TFx:@@@@@5p @@@@@ zPPPPP@e @@@@@@PPPPP@>PPPPP@Ex Ͼ@@@@TPv((((*_=PPPPP@ePPPPUԈW((((**#\z((((*lW((((** PPPPP@ PPPPP@en[((((ΠR_ cPPPPUT *- {((((oPPPPP@b PPPPP@eǴ@@@@TP{4־@@@@TPt((((**&@@@@@}TFx:;@@@@@O}  )>PPPPPo[:@@@@@z@@@@@/(@@@@@Ok@@@@TPQ8Wt(((( 㹯((((2=G((((hPPPPP@ekq)PPPPPGPPPPP@ek((((埼9(((( e((((**ԜPPPPP^?@@@@@r((((/{/@@@@@գv ;2 u((((**@ JCZ ; χ((((PPPPP@6] @@@@TPwY@@@@@}TFx[,@@@@@y` v((((*jqw((((**#PPPPP@( PPPPP@eob ;}((((2۳M@@@@w@X9((((8;@@@@@ /z((((C PPPPP@e@@@@TPybF@@@@TPcPPPPUT((((**## 6 ;2;ֵ@@@@TP+ @@@@@}TFx1:@@@@@5@@@@@^I((((B1A /%@@@@@U}PPPPUTFxM zG[((((J8mPPPPUTv((((**#PPPPP@=Kv-((((**#xPPPPP@- ((((l((((2; PPPPUTFxqw((((*'@@@@@y bo PPPPP@ew>@@@@TPq̗@@@@@}TFx1s;@@@@@J F4"((((*.w@@@@TP] 8O@@@@@}TFxI;@@@@@/((((**#XPPPPP@EGPPPPPPłt((((*j PPPPP^_((((E((((2‹  # *#PPPPP@bb 1((((>PPPPUTFx;@@@@@lo((((**#8 ~ F((((!^((((2»@@@@TP㉃{@@@@TP+((((**@ JzbX 3 T wG(((( ((((2» QIPPPPUTFxuPPPPPxyPPPPP@e 9FD((((n((((*((((9L@@@@w@kχ((((APPPPP@#@@@@@^PPPPP@4j((((πiy 3rv ;2((((F@@@@TP^@@@@@U#PPPPUTFxotk((((*y~w (((((*m_((((**#7&@@@@@՞s/@@@@@ f PPPPP@e>1q ;bZF((((2{ 'nPPPPU_7PPPPP@4((((**#PPPPP@%@@@@@}TFx Q{v((((*# z01o ;2kGPPPPUT5>@@@@@}T(((( ;@@@@@U@@@@@^kK((((PPPPUTFxml :)PPPPP@eף@@@@TPY~@@@@TP:@@@@@uǍPPPPP@e׷@@@@TPq)oPPPPUTFx1:@@@@@f~PPPPP^PPPPP@{M((((2O (((( z;:@@@@@ƉPPPPP^PPPPP@t((((oD((((z͸s((((*;@@@@@u9 :@@@@@PPPPP@e7& ܬX ((((m:@@@@@v((((*#D((((1 @@@@@^\h((((syyPPPPPōu((((*ꌹ:&((((**#K oZw@@@@w@= /d@@@@TP1@@@@TPE((((**v@@@@@ޔ((((EW@@@@@^PPPPP@EMc((((2 . ((((*6:&((((**#iL 'Pc((((Xw@@@@TPQQPPPPUTFx;@@@@@g3@@@@@޼*@@@@w@ o>((((((((*# ڢ /F((((c((((2‹;PPPPUTŬq((((9PPPPUԯMgQ((((2 zb /((((w((((*#ec PPPPP @@@@@^((((vc((((2[@@@@TPq*@@@@TP-PPPPUT> @@@@@PPPPP@i((((2[F<(((( ((((PPPPUԔn((((2‹1 7:D *#u((((}+@@@@@z((((J^@@@@TP((((*j$}V((((**#(PPPPP@m((((2‹= ܘ3PPPPUT.LPPPPP@*?((((*kCPPPPP'PPPPP@e[PPPPP@Q+PPPPP@e۲@@@@g@((((, ;tPPPPP@ePPPPP@l?((((**# PPPPP?((((*/k(((( b2((((*#ؓPPPPP@rb((((b2 ((((*~(4((((**#PPPPP@-PPPPP@Ex6 c((((2‹S= F@@@@@^|((((hc((((2‹PPPPU @@@@TP٧ j&06((((**#mz@@@@w@PPPPPPPPPUTG7@@@@@޾@@@@w@ENYPPPPPy6@@@@@x%(((("PPPPUT`@@@@T PӾ_'PPPPUT J펲((((1!(((((**# ;L */3 c((((2;6 їPPPPUTFxGl @@@@@uhPPPPUTFx1@@@@@@@@@w@e6 M{PPPPUTFxѥ@@@@@-g@@@@@PPPPP@$PPPPP@ewm@@@@TP((((2;r$@@@@w@ &@@@@TPN((((*=7 *#3 Z_ PPPPP@ej@@@@TP18PPPPP}PPPPU'@@@@@^PPPPP@eՎ /((((((((2‹PPPPUԈ @@@@w@ew O 9 *5.((((**#k((((PPPPP޵@@@@w@h ((((2»@@@@TP[;q@@@@TP]; %3& @@@@@}TFxy  3F I((((*jYPPPPPPPPPP@E< PPPPP@ew((((b((((2‹]PPPPUT)^ *#{;@@@@@Ʀ@@@@w@ewѲ ;bEg((((@@@@@7@@@@@Dg((((:b܍ /((((ǥ@@@@TPh *Q<((((**#g@@@@@)z o *[@@@@@޳Es((((#PPPPP@eD#(((( y@@@@TP=PPPPU߈x    iѫ ;q ;2{9 )1^((((**#h 'P((((w@@@@TPwe@@@@w@e4 QPPPPUTFxPPPPP@ c[ ;2‹}PPPPUT =:@@@@@}TFxe A mpPPPPPgt@@@@TPA((((*jc7((((**#6 :I E-@@@@TPw @@@@@G((((c@@@@TP=hPPPPUTFx!PPPPP@]A Zte((((*jPPPPUTFxQ\ k?{@@@@w@eע ~t((((**# PPPPP@e h Kk((((z V((((2‹? x-Z7@@@@@}TFx1@@@@@PPPPUTFx@@@@@? >*#PPPPP@wF((((2#$@@@@@}T\љ= >*#1 8 @@@@@ *#h 'Pc@@@@T PoW((((3f@@@@TP+6  ((((*#PPPPP@=Oe@@@@TPv((((**o ((((**0b 8)P _ 2fips203-0.2.1/tests/cctv_vectors/ML-KEM/modulus/go.mod000064400000000000000000000000671046102023000204030ustar 00000000000000module c2sp.org/CCTV/ML-KEM/modulus go 1.21.5 fips203-0.2.1/tests/cctv_vectors/ML-KEM/modulus/modulus.go000064400000000000000000000044401046102023000213130ustar 00000000000000package main import ( "flag" "fmt" "math/rand" ) const ( n = 256 q = 3329 encodingSize12 = n * 12 / 8 ) var shortFlag = flag.Bool("short", false, "generate the short subset") var kFlag = flag.Int("k", 3, "2 for -512, 3 for -768, 4 for -1024") func main() { flag.Parse() for i := 0; i < *kFlag; i++ { genVector(func(t [][n]uint16) { t[i][0] = q }) genVector(func(t [][n]uint16) { t[i][255] = q }) genVector(func(t [][n]uint16) { t[i][0] = 1<<12 - 1 }) genVector(func(t [][n]uint16) { t[i][255] = 1<<12 - 1 }) } if !*shortFlag { var i, j int var x uint16 = q var doneValues, donePositions bool for { genVector(func(t [][n]uint16) { t[i][j] = x }) x++ if x == 1<<12 { x = q doneValues = true } j++ if j == n { j = 0 i++ } if i == *kFlag { i = 0 donePositions = true } if doneValues && donePositions { break } } } } func genVector(f func([][n]uint16)) { t := make([][n]uint16, *kFlag) for i := range t { t[i] = r[i] } f(t) out := make([]byte, 0) for i := range t { out = polyByteEncode(out, t[i]) } out = append(out, ρ...) fmt.Printf("%x\n", out) } var r = [4][n]uint16{randomPoly(), randomPoly(), randomPoly(), randomPoly()} var ρ = make([]byte, 32) func init() { rand.Read(ρ) } func randomPoly() [n]uint16 { var f [n]uint16 for i := range f { f[i] = uint16(rand.Intn(q)) } return f } // polyByteEncode appends the 384-byte encoding of f to b. // // It implements ByteEncode₁₂, according to FIPS 203 (DRAFT), Algorithm 4. func polyByteEncode(b []byte, f [n]uint16) []byte { out, B := sliceForAppend(b, encodingSize12) for i := 0; i < n; i += 2 { x := uint32(f[i]) | uint32(f[i+1])<<12 B[0] = uint8(x) B[1] = uint8(x >> 8) B[2] = uint8(x >> 16) B = B[3:] } return out } // sliceForAppend takes a slice and a requested number of bytes. It returns a // slice with the contents of the given slice followed by that many bytes and a // second slice that aliases into it and contains only the extra bytes. If the // original slice has sufficient capacity then no allocation is performed. func sliceForAppend(in []byte, n int) (head, tail []byte) { if total := len(in) + n; cap(in) >= total { head = in[:total] } else { head = make([]byte, total) copy(head, in) } tail = head[len(in):] return } fips203-0.2.1/tests/cctv_vectors/ML-KEM/strcmp/ML-KEM-1024.txt000064400000000000000000000225201046102023000211620ustar 00000000000000dk = 50f270a298b166e770a8db8a23e25caf5103dde4a166502e2f73c68ee86e13915f1201216c914520870b987c140e9666239b7423142d6bc013be956d55a7b9de90391497be646811d53302d4e7b613631f92c7277f09ac692b867c717118a45c34b288ff35813327343f649248701cc15257500b4d07e3b865700747ec52d105bda94ac8e5959f55b405c4d68771114320985a8f1845d0900d59453fec74b460d9431d8017f9010163a3bb758b7985aac0f38b57eb682a60356e4595805b99132ec12303a4a1a2988d29d3171b0ac591440d7d951bc2c4bab18c32c20c394ea01d07974e8fa166c52932cb56170237194551b08aa246b2f88a9999b27c7552f8c89a911419f2c022ac4a0cb7e20c61ca43f8f03319810030902c3e8b9a8345a117eb7e2a464337a82709d73143817ac9e13c2871b491983ab85b81d1a874c894a9520749feb30cd21308b5f04e4698744ab853a40978f10b71cc2b821a70acbcb49e7035a23447b780d369ede739dd3a1584e093a2839f04aa604ce746deb70ed9005cda374fda7c8a06d19c3e34564482251ef67d5c295172f9178811014d982ec25ac921522d1a348161e4156751076de0c980fbcc59c95abba409ca2533d3370f79a2a2a323479d7829292b6d8c0a583454905a737628b44ab7f3c09184b813786d17b6c84ac73872f1afc1e787b35416d5bbad881b6a59546da4679c382ba3fac18fe4696e69fc7ea3468749fb2ef45153a54361df05af30f39686645ad7342c0f132e47a52ca3a53943212bbf5b5bf67156589b3e9a7b32276b46ab0c29635537f737789d04c5a428060c0b0d86e6c582373587702afde88d7b210fadda659293ce6e9a30fca39b9383431be19e64ab7adcc2bedcf672542bbf13137f82e7a4b799b8a1bb50be99b21c82578fa8465ae7584d0b072bb9c3ec623400470c48c6059d7a2114c022e235b78a33c491fc95d4359e4ef41c1ca02a50808679c05aa6c7a888977cfb8950b23597e6398588794e1de956cdbb69cb211483dac97d20127498c122d2601a30918f276332aa9652832d3ae3c4b97c3593433074a99e8193781999bef7888ee754328e8b0e75cb43a05c2d89eb2ac98060c684b12de824aaf475801480bc575150866eeed64924b383cb18456e265e78d932172445cb8315c047410bca529dd85da5666bf098b0f954ae04169af9e62e652505f52273b3b80a251a0d18a675fb833ed1649eedfba2e1933f6b8012d354a2ba95733590c4da039691c66b93f4cf1173c9c39a7deaf984529c7fff4175a5e2128dda7da4d1512ada61e8cb48ae860908801ccf631ecc36c161545acf21c16efb641c6cc8f43ba00bb5c537b59f277211e1935131f80d0b994f2e30b2a7398884335da7f81c7dd4679c1218517953d52c62b1da4a5d7721d6ca035240b220f003c9a33415e65213476067f433efb7347f62b05764cc3a503c1920593a51caa8ab1e05348f7e602c772b92297a5d899600e6894146765312cb83a5884dee4a3748989cfb3c713727a88d260560a9a873eb6f4d283179e305361812ddb38371da4680e66a4494192a8b465f9387a106bae5f666044370f5fb3670f8bbe5f89c58658d87143f08d10e6f298ea41a9e74cc43c202bbfa1c1996a0a7230bc26d92388256119c03b0073c8b17c802ae15bea9db3516a00fbfd0948a434bc6a3cf3d46c6dd95591da456afe89a310a7839373243a1bdf867b6e092353eab1ba94c3384668e2251620110719cd780ccc41a87a37b30eb99a477439a19a383b2007f04036f42935c028c1ca517122571704c2f418a9287e670db2112e4c0925626996d9735d7f8156d50275f40c35bf005b646adfc842d8f175e8562bab24b4cd0da7941ca0e230833c67a0558d9a6936492eeb4bb8256bfeac676a867760915ade68b7e719321c7c08e0fb29230db8d6762c0e07119ece95f1a592cad557185d71b97d71708d2b3cd9751cebc8e5116cae9858a6d419d1e83a887d2386ff556dd283f24664df9f27e10e9b4e4d0b4a753cb27cac56d65bbb6eb9bcd74ba971c6b9dfa3f83a211c822a241d92e2c078f7c02292350580fc819809c9dbaab1c2fa4483815219ecb97beec1f57aa51918c6193c3b075676026f4899e041b44504f1f453fd4d93e25547e9a5b9881193a45036c5002409dd902b2382c7a462d647aa924c43003737fade12006bb137b89bcb9480140b67aeee79c4e1256c1b79f2701d08f186256d4906cc173257c3f13932fa8cb4ce4a19e316121e9b3158d4aab19ab8c74c20593b81cb4cb37dca943632caf4d2a572488bc9a4c756743c9f4c31949e93cdfc0bb18b121597b3a28d908ab5847f571b073d3769c0c1575c609d9717df799a41771c910a24008a75401954cd4a73e2601ba85c73bdfe0447dc75be3e64d2d554b6d30a100a6bc73f6628325209bb5aab21b1d78954619862b9e5a6a6ec8030b093603ac7d26945393352fb611c89e936f30f973842578bcc617cc6301ee76472788755bd6894d9c7f5dd7b3b22183f380bd2b702fd5766d78c8654e0409b960625ed9b97894af25656d715abff2b03bc1e94087f4837bd67e6882126dda71efb8c81c3c8b573c9cdf8387bad10d8e6b3d06ec318225cf0ca80a21d3202e0a24e041609de2a22254958e84481ee97648b37b162954e0d4bbbbd70d0efc9c576052e15314fc930f7bdab5bbb2469a2c64725b0c230b5b6b726d782545cdfccce0dc7a1a80a118551f21456d528a8f5748815b000e2bc65e633aa9d3267ead075ecb47405f907dc485bab9d6c96b88c42cbc6329284e43817e3747b88a62893b5b900bd0397987bf3d295e67243993b448bcf651b65267de69c45ce88a283772d520157ae68d663117a6db8602030ceaa8aa12d0709a591d84662c62f8b7a80874fdaa0ba4c3983c861e58f4124b808b17fb81d35c4f1ad3c6d9d667a4d43db0b87ff62bc360646719449604947c18bc8aaf6c206baa7bc21429950621814cb878a7236778bc55c71351c08305d0c8acfab70250829195b453072b7fe07b584a6a929b0d59ab2915443fc135bbfac0b25e005a3e1a6e8c619110265160a8ab1e02cf339c7b838bc551390b3dc4bff0aa7d24ea23aa87a9677bc94db843bfcc1341d3448fd5a0cd13ac46eaaa3a3cce4c1752493c25997c7609cc44a1415f17d64b92292a78c953bfb8a8e96c7b548b0398f0a75ed96f88245110743eec403d2f70b141873f6d91aeb94c52bcfa4f827b7749746acf86b6e93754f08736945a3b936baacb131a72771681207291e7c61ab4aa132528b9e16cf75493c15cb2b66288489848aa2b6a09783d70091bdf3369e328587610212211b2f5c99ccdac1150a77b10880a90b924b93263e0708004b10928338f0d872e1ac77dd15892fe5a444fa56f13f584941b861ebb46874a0de5255045d317de96b90366572f4735d4363608783b46f746fdc44b65d0b765157bc6585bb9e60e04510f6ad043dd058c6b16a60aac543fbc0f24d16b03800acb6452ded6ae11b1273210a6791478ae095b1b616ff38a21a3c656cba94707167eb4862d02fb9eb8bc3add809cbdfc28d0365c7bcca218a8b8912c77ac6c41ffc605003d32d85a973ed1b44a034d2ca5004c161a21d2af83972313920728c82591e7c1170643ce4bbc09cab1f5e4ad2df5b994e48835d69ce64627bc0acc7ca09d4229673c398063ab69f697bc85221b3092b914c28f174440dc783d7a6485df0a7959473e0577c7e220cffcf80f0c093e4de4ba9ef71504a782f4633526c181c7ec2d2a6a7b7b68a699291b1550902983aaf9f07aa44b936d125da005a7aae7c6586a0b1e957d1742674c070519a3441ad01c6aabb30301b40ff90eb8623ade74920e028b408cbefec987d4411aee55945ee100b7b1cf964802d15c5ddda84e0bbb8a21409412e6b567403342c7447ed9354261505d7ca4a331551f439bbb606da8a66ce91607a5381c7a76b4e2e5cda6937f6d1911bdb13d5b76223d56292a5a54d021c072a00cc4f9af92683d4a90393e9356a9d8079fcb7f9714710a67ce9b14ca91246bf9b910824939fb4cbc4b4b4ba30975ca443e8940353a5111ce50160bea1cfc48a9647cb792c386e4b923d0317fb71760f9a1127bd24cb49940c9a83c6b750092b67a5fbb20aa8bb826087cd8a6633d50c62f1772b3ac0934894efa4bb02d99ce94b218959625e43020971460311b10fb1966fd11c98666012800b273d04a13f3baf89ac45a7757e6a37589703595fa561b6114c5ec0189ac7232e189b72b8abec94dc51522d7357648a2bd2ac13fc3029066647c989537c1642b6bab1835bef491e8d616819456a8105a26f089176989510d4f9a7e0e66e62785c03550767e9181d37e771e6eb642a2a51cc458138f163fc916097a441c8eb5962c4a73b8b0965c33ada29e3b395d7007f27e28c9b712ef c = 00841583c166562ba812d6b7c8cf33730e7e8f90ae302f2e201e7eb4fb12382427ec0e9a8b6b530225e2802514d7498afc401989fb7a7834665ace77b437fe127a72de61f178a56d4f42177830fd5901fcc20a111f8fbc4793ccbbacbd4d542fa97b9d45e44cc9692b0a8d880cbf942ebbffddf5594ea61a6451caf67d3c61c8ad0006bcd95cbb09923679134903eadf3c7f436f2c7e5f290a78c089efe0045811cd7b2242b0ec17614c9d4ab3e5efc064388d0e195252ae0a0f8fee4de7f8757763ca282224f3bdee808d7b004789a1546f687ca17cabd389de94426eb95dac260f18ca74a606b8f157e3352df4ed208e8a5763893cae7cef0a1a2c9f80cc66ea6a622d7eb5118422852f62a1cba127f53d6a87a5d90552b43cdc447d6c5ac613110b76d55d5d30503569d25d5d90fda552509080ce66b8007e1e7e8da084ae1dde1ab618887b5100e8f4130e479462be2221e3ff850958526364693234e6c81ece3b691ab9ffc9de007297d8d350897be22149447bb57c09bf945ab209de2ac86e33e596911b9074b832822f3493da7a8fcb87f313324a434d5d1e3f9bda3ae96c356371472dbbeab931d38cee523aad20664f532cf6c110dea6ec45e77a59efca7a19275e3176c2daf65f7e7bd886382151e05f2b5f88a0a842cf8aa3e8ccfc37c60e1b093342863e3a56484a48ad54a547ea672bf626d687530abd5d441a8795d216fa649405c960e087ebcb8a95a59539b7eb3a0f7afa016baddf0e41d4defef049051bb8e400a47ef1cc4b2a7751e5916e793f2f66a51ff17c29973a85306453c9b6342cade367095740a6db91b40ceb8015c20adb502e188cf3706e34a6ddee8f51d836a0bcea615f9829b349c4cb7523a3eb1c9d79a7727a100567d5a303588fe195120256c473f35b0502e24edd07b5371ed5500e8f6712f8e1f890b5ccf932c8a8b213f1c2574c3d89bdfcd68e4e6e2efce652fe00befa343dffd2c748d72bcabd98a94d8a0732cc7d4d7ff1b0d5765747965186ad70e3c0add8b37ba945b4884f5cc22efa2463181b26fb0d46461da4a1145443e05f0b42f5397212da9859969b667f7d671bbf4988fdb0a0899cfb04c6277b4ef534fd8d3b5d5248b11cb26b2ae401e6d8f46c9b4876a46d624df56c3ca2fa0a6dbfe6eb5abd0400471492ad9ea3ce40cf8448f8d00716486efc0832af4dd92fa54e7042b7e3079a51bc95fea5a1d323447d782ea1c8c6d1beede1ab05676688673a2f42b6db31325cd3aa3c7065807d3db9b6986035b78117a9ae79c04b5c1f48bf6c284719a2dacf83f5d9953441aeab142740d30bf13cf0963d4e4fbd79f3b00e417fd04a3177ff571a6d7b13b29959c9c3828f95e7abce734e0a4b8480f179daaba489e4053d3dfb1b6ff2e68aa4c0dbdb8ffda1a8d44842924ffbf583335ffb7fa7c3e767b1f66338aa49e140c87f0f722312d98ed3a93b329ad1623fd078915d443b7fb907d333a85d9fb4ba4be70a8c9e4031bc435e4eef328c6a8eeb52e7c8674f5c4df0777c10571aca220083a99891aaeaa703de92fee836ec6211cfc35e123a05a5e573e9bb7594d5316096fba90e3e6f53f6a17a2c2d89e75c8245bc86cef5463da7d9e1016b749cc5ceb319f770c2e99044dd06a4f545cc7ce33dbfa90888611a15ddcd150f20dc03a022abcf2bb03207cfef5660bc48aaf1a634e36a0d5d96b5edded93c67a8a88d9ee57d83a949e455d8b4442195cb470fae644fb92ab1c4c1bc0203d7337c43d98b63df6cdb0a8a003a7b21cfdf013026a0ad192488c1c069087cbfde7b328e3ce62309ef966ef7888f7a09b62abb4c2149ca1d4711870ab2775beeaf60e13c620f49167a3a7282bb4451871ef6ba91d8771153d069169c22d170a03ffaccf4771ee2b80b89333cfcced7271e0cebe8c92807b2e13daa011d070780351d303a02677245644b3ff8935282f60d1f361c8cadb140ff0be4c88180c0366378db09b1049d356b37147df7aeba67ab81a2639dbf695adc287fc4f9af6afbcd1d192c334168c3d47bf471c0ad685f0ce040ac548af8b58ed2b6ca5c1a9c63af6e0389e970dd9fd09ee48476fcd7cb3a75be3481ab0558d44f7122db575decd907e9b4b40826c6a399672bdd4939793c95c3b697ac9b5f4fabfe7a483504f58b9bf7217a4de48fe4ff1e7b3f34273be269eae67b3f9fdcdee483f48c K = 92ae6010b30669d2dec5d2774979765103889a9cfa3e2812bb3543762ea4df43 fips203-0.2.1/tests/cctv_vectors/ML-KEM/strcmp/ML-KEM-512.txt000064400000000000000000000114201046102023000211000ustar 00000000000000dk = 5961ad4848355fd421beb06e2557b15909a87fc4c5a662964fc96d81692bd631002f341727359eb02a779be4285932ba25f96ea170a4a11c51f5352d8f6c0d20c02151c567aef2ca08342c7e09b68aea38b11c2989fa1942eb66946240e5cb4d57384567f800fa0102fa0505d891b529124f0f796e3f85cd26b0ac63d865a63476fde55593db3a9c69ce175bb97fc864f333ad074a887428733698ba808a605bc846fb72be53cb8c43b54e2bd8340d197c20dac1cc028ecbb136c126895fca2fd5463f0c021a57b15627c1011b01b180bb3f27124a01f74a0392460bfb896d3bb8b7a9af588874fe8b9205771cc5a079c0a21dcc88b77cba67162646f88b4decf97fd96a226b39a8814ab915c19b50ab22901c3627acb86062155b164e007c411522a571d71455e22778b49c038316fcd6cadf4111753292f7f0276e39737e92272e811298c471afd24d18f2a70e7574c9f7a385c8490669868e3374dd6496030bbec527b400fa5aec089e225776a868594af22ec2f96bf3220374875b39e07184696881077c9e70bde1f052716118b7918ca7b475cb5b4d86669ad35373ee49bbead52f210464ee27ad6b4c1171b1980c974a1a8489b3f3c47a1cb7b5cbc841f960b226bbc7394a056013ee49897c9a4c82b3ab5d4a2068772a22071f15fc428217361e200745ab94cb2c63235a9a746403fb0a72d2d2c36bac110bcc9fc37335266616b86875deb560dc2a19fda2bf17352966d00a07f24bc4b60c24d54c07b0627a3c507ecc48b22a32fcd423d6c3a6014c0ec7a75b3384a5044019e8f211d8623785167b18e5398fb63e22ab6e62ca8c6316110ab4391a13c067060aea5b47788b55a9aa3bbe41acd5599d952c8f1cb4770d267d8c10a98df31be6681e23b01e4b48031565123a5656c13165b46690497c0b25d4467cf839389220c3639f5d57a03090cd261a9a36c59d032674231843986022e0a2190de9657c0a350840b47c06a036c047c8816947da4b1c16a7c6e0c63971208968331cb2b368d98428596b75562076a330bc1cced9978049c15e111967159130756c69cd939a5b904ccb23cf669a01d44a0d329bbd75eb42aef97402a1cd9263909cd678630656f4162b55b881144595f693c114b32aaed662c20787ab48c71a67b7e1d597ed493f3420cb561cac812549c2cba5c135b563e9592ba195d1fb8cb4444fab75191579618dd43fca27515f110641c352df20780ad0089112aa64d34eeb00a6490ad09bb4bbc6c42d0ad804726bc1bf5bcad24746eb1a4b8701acaf2a82f0c0a2d9d84777b395ec4a953c7cc213b3070e7714e82120c92c173c3661862899da6832240955a372737f055b4d88688a5c2c55c4a3b70780119b3653ab7692c3c731ba7c91e55f89637d8fb29262618e32e9cff14abc3648024c64310b47027ee4cf1d5985de9251520bca3d716eb9989123d298587c7029c714202132a6f14d51920cfdf2b89ff58a4bcaaec8bb7b888013c155a0e93558e2ba3ff6e8058f26156fbca16702c599d2cf323bb771945e1fdc918a428a00f69573fa3cd8088b6228480b91cbe27aa3e5da2571363880a235cd664fdff18bb12c68989476ee56386ea0883be2c458864949ab3524a4be228763c27524593b25d8e95af656942f77b820d42055454f07f2085fb11305513ba8511f9a4360caf09bae125ebbb972988acd1b6a16e9537e27713a7fa865cf426d97d266bdda5a99b19066b8b03872c6299591b40a2833c57ad97754b8b88440637fc9b332c039b4c2c2261b548ad384098efb7d100693dd9a30cc779f7a7187e146c9d1d93ab7e96fe13504ec043bd6c465b365786b244b7990195f76c66efcabe0ec92f0b302a749817953836d3070da8a4596545a0afac70dfc989bb0b16fd05e0db948cb1b8995c8c4d73730bccb0beb7336d7f2074270275f1b734f977c9fe641f45770fdec292f28c85ae0488b9c32e90730e373bce63966228a0622e4a17cb04d3c608f3ba3633dfb727bb1ab93fa2543f972e3e45d9d481288cbcbfc9a6fa8d656c7a7563e028e65713ac94023cfd15e244274244c38d57158e7e360426b84191a94c55537c18c4a7d0a880939a0097a798f1534d979ca79dc224f48068552561e11163b6c2a79c5c6dd3ac8203c96672935c131558e1550841be848115fc8aae866ceb49f6ff7cc2bc19cddda6f052930dc583aebb50ec2e2baedda9ee6f8771c312a796dd418ae26fa0f65cace005792076f44f152c8cc97c8b4802a4b5d4550a8eee465eed6b36666e929d5d4095a12ed c = 00f16e1645a08634736c206fbd6f6a5942f609a3449a18d3bb8cdae503f69cd728957ded842f7cb84abc7802b346acfbd1881aad3168d452e5359e002641de5ff04f067e1a68192ad966b2f127a56aab0bfe4789122000e356f71556e5d414075269b128e21168770560b5a4e92fefff74233e6836e1d4fc18f8ef3f93d17dca8fe41c2fcb93a2217fc53c551e7ddf947f43b07e1c60fd8a7aff778a7227aaf00b6349287a44303e7b3e9779744695061e45a26113b568879b8685fbae6d3513983ad39e8604abe448ea5c950c43d6dded934bfae51c8c34ae22f4a3e0e35781bab8a4fbdc888b9057d553b9679185481c2f18caead15704143e7bd3f3497ebc232ea4172767f462c0e14c597d8ef008a776c1134283acf777746f4fc63a56e57217e3ecaf6f4065924ec52f6429b2bef71ff1ad5736c54c07a44bf544dfa60dfd9893f2f8746642dce0e5d463300056c4375efdd299a1211fa1605a46d52e3b3a4f1031db95c88f6772c03eb076c49042fb2d59dcf45c1fc589f773117c3895aa7aec83685049d489ed7173aa1d8aa75badff731acd50ee2e569920f7c7941b47a7dec566d09958a907f0779b7a0b1dcf6409b3078960adfa494004fa201b714d4b46d606ae3cb7e30feacb137a0679c1b0df51ca1f523e8603c76b8a9114945215d883857f7aded8d16df86dae7cf6dc838fe4c3606c9cefbba0d428656a4615063dfb7336c4aba005d7703883a70292e736461ef562737c9b86ab349d9fb852ae69c570e3c353692d8c0fb609c6f8beb862f4e4fca4ce1eb14ceb0cf667e132c086a2ac4acdfb3f7d50abb40f805e533d715c6bc120a14d337a0fa06121ce367c727d61b8e7fcd34f575b4c4549614f1f5a9628d29f3a11491c04d3630cc2753de0e6b2d7be78a0c4a94453c53437131809763c9b82311877399589a34f395ce035e0d462a123723e5684677654ffda40f65474dc2b2175292a4e443773595fb9e9c3ded7eb05e3aea1b90cd2621669fd2046f486259fbd6fd41d2163725ead11a1f0a7e99c31de89d421d3327d3312f29fe34fb5c8645aaeeaf486e04c7a K = 3f238984ba263b21b17267a4fcbc3d6d803d2d4f122f746b44e9a5a1592ea6b7 fips203-0.2.1/tests/cctv_vectors/ML-KEM/strcmp/ML-KEM-768.txt000064400000000000000000000156201046102023000211230ustar 00000000000000dk = 8c65b853a6bdcaa8966106bd29f7aee2e386efb5a0b0c6605562577bcab1ef330fd04625e86a1957408586da127291ab9e245fb52b044d2a201b5c0db9d806cc39ac9819aa66f59db5c816c2ac0d0e2a846130ab01786bb0e459c667769311242f49a2db96223128a33f05b4f28291df7c414b659b2354385d3036324c100c49af75e3c393a1b840d8084fc2afdcd134352954af8c9f95707cacb6b58c881d145682b4772213061a35b15cfe7a620a71bcd48a11e5f5b430ab3a8350407a654642209fe005319187081c434826c54dd1947e4ae1a65d5a918b17b167271920283f4738ba3ba7425727c88f87b5b9193d61baca86947b8c2b65ab619edff5364c58ab9363ccbf17ccfa440690e30db4acb04cb7a676babda48122283c56fc267b44c0c3d4ac9e04b79442f216721a7718612781801b0e909cd2a3b29dbbb770b58f07c3be33f1b4e58857c8d858f7227add741c85da3f205241f2e74054d540eb980dfc6b6051024297ba751aabbf3a44b499d1b116f6aff65c59aa794e31d4bb407abd904055198271ea4909f50b3cad87c65de09ecfe40398c195248633d220867cb01a5034438cf604d403c0d2f5936030a4afec94cc17bb009b40aa09c3f2fa3711811d6f1709714347bf05a28434a6cedc5baa0072e253ca7230357ad9715b9139cfcb46793544c0952041d4b41f105c578a3de183a1f0093ee2f07070d180730a203899a81101217862cfb8e3954368584695afc37a9d52901e66fb981455710456b8196b9bd677762c021392d0865eeb640f1539cf6ca1a08a7e5204676b311ac1392843193dfcab93f8d17c7350beeb1900518a4db3224766d2cb1ff42cbe189055c4449e97ce3bd2a80e745a574021c72234cc87b4991802427c0ce6c59c950218c96ca3409414267c006b8b7cbdd49dc2710ddb246f06207b59a9bee1118d18e379e2458c44d64b978b6d94972a177a17bbeb2085c683c4095b9176b61e8a6f3de251ada307f46c56ef3a7d22b477633a3f1fd52dfa9904f61b0264184c0f24816cc3339b0a0d1182abd972ad77729a4d5016f101bad4c02b44b1c1c912bb2f963efb788aa336c491518f09f40b72ea8292328252f186d0719cba3a8528a8059c574cf874313f4a41ef63ae4cd630ba8b7485b0ce3b3898e62b9e7cb9be5a4c0c74919692a8996f4a09f95a0e8537325527c75df6b9b367c14c6867817a19c468a14da728b9dc4f2877369c7b10cc5972d71810d3719aade06f187533674c4026b767b6f75611027ca8868116211e953c00ac401f5940a1f17b0ac8c1450e02c580e77a2f23a3acb11b8e53295a546bf5f40f87fac6a42bb200ed0a053c89556050e21c65f7290f68b2670381cc06d8aff43c962d122987c0ab57934dfc167ec8eb07546891eebaab4427097958bd19ca5650f42bac5890f781540f790501e63686d71c82f4c9ba739974fa0886ab4e325673b3a1413f5aa63870b22d052596841cbb89a59c58087b09208d876d9587c492c268bc80129f860bc9e2218a060d299342cc44b25d26b7726a1a22d8c657d582162c2b99a41b1666a4870b88f032ba09318596cbbb9b8711622b436f68508734532b70ba414b6ffaf695ebe8c1e120215deaae438a2abc183cc50cbe397a5c00bd1498da324b9a159a30957ae32835781c52743d72876c860c1dcce37e0c0c8ff3c2b36acb52ffab61dbb40cbe4b7a7e755a12d01ae7b95129f50cd7d494e290913d30013f99a4a15c2fcc5a03e1702e8575937cf752c3831150c95b51d3676a08c070c454eff93c37947b14bc564594be715a7dea960c0250cb4d219036556c94f2cca7191db03c443970339d92cabc6601cfb31e7d46a94994af8bdb790e468b79491a237bc397f70000181299828f164799c7225000fa6ab542a2da301d7e0a105f80886f0c79f1a4bf85a0a33d21ac13008d259cc0a54520c48b438afc3b28379975c18b40e0b28ba6227674820990bac4f3c99f1c4932c59cfe726bfbb967a7227ce9a00cce9b0647264d73d5c935161108549b5636caee3cb6ca47136a125372918d8bcc2994f23ddc1646948b288cb5707b4934d28cc719d0a98b323d05a5a444bbb47ee09aa8a0cf1e7b6eae14b5740987cb629cafb74144727d21a230ed456d8ed41f11eabd23623b51b520aae80a0807baaabba3fa755a9e12a92be7715c7c98ac6527b9e1a74c20abe1966c0f9c2086892e3e172c23ca9d63e73e8c085f2852c12e6a475b7218864a8da5503940a195b5b621ce085b3f7a398f99cfe10a1fd45178a4972964024f5f2242b0d60c53bb06f8db30e806529b786c1a571241c55de0114e4f2a27090321b2e5b0bf5c95b2611b379025b1ca664bd4ab1c86049efc236e2b903e7cc80c1751ab946f3ec001a857926a2604e5ac3e0316912ed5606b08bfa9e82cb5e54a6d3a4978e1c32833a0c8f0102ab916d4979a840432df700192cb9efa3096abc446ae938432276f7d3b12237cc067387d4d31a0d8109bd2a51c69d8a0840b38ec474d8405038219969859540f938156802e729a9a7335378cf10ffd338956dbbd6a7380d8376b7239260e3b8f9f3769c720c7e1969ec7097b18746db674c0ea724e5443909a8b5ed4a5c9a418ccf937634afc06feb832367b8c0d44135771bc14107f2a589816077536aa6cf25b3c11b969bcfa78270ca74a1a38c03566fb87810722276b691b8f51bb93184662b868a9159945771d40a23c750821c5e5530ed6a4df38ce27381448893cce9928f67691ea7b705dea7b15c89b9d0a19380987c22046a1a62df9480d6790b3ff4823851173c3330e92e8c10b021b12a31d36f2953ca9c1a6c510799634f637837ae12e7c52b435daac2cf451556809be3504c1b191d0b6aad9502258a1541c4c95986b7c2a0aa22d0b180350aeca7c840d298ff1b59b974b816eb38fcaa7b805e07167e34c25236658c56624f03073414d6c794b24b19985c123aec7aa017c19202894905a11d484a829955382d992506333966c1428098be4ec9702681805d26193ab935d9077153b7b52012d38e522d8c1b1f23a3014629db6d6c747449bf5412fedc015236a3ea003bd9c5296d67547ec4c1c107166f50263df890c531088e9d557e8e62b373c21d0c724b1f732c1dc202a34c6ae342087942c8034a45717bc70920cab1853552432d430b0021a51d0834876ba52205598a61372c6d48a18e841f6db19eb5ba57f86087c350eae351d4ba38678fc9420cb08e2d862b424ff2d56098fd50890b85d1130c97b1555ed7ebece6dac6d2ab22846bbab3a9a19e98f697cc6e08263641689dbbe1c3a1405d10ee38e793ff2c756df34322bf6853bd5867f32980974824b3e0df89b4237881e c = 00c77baf0a8c8a66376873139cbd94b7a528efab474501a1019d065ffca8641361251af7fe361a1c1cd2570ac64f67fa37379828a825ffc5d75044adfec86818652b3157cbfef80bcb6d70cabc16e0b8deb4e6f992c8373490725189118fc0df53a24531896a4a873e55f994bb9e685d98f38d0e6b0e13c13c3c2fbf919db5eaac31149a78d835a83b5c0122610746ba6587dd54e25383f19c019bab1c3f4393801ae4723675ad2489ef0e340ed199ce5868db18a805eb750c49e715826b6b4c017f50b829a976bc7aec666663ce62f131e0fd5c7087f66326308877f4950885f807f46745b1f003f7d74c08c638c293cabba2edd2c1e2004a791557641a87aec932c0e54615c859065fa0be7cfcbfea6695533117874c55939fc3c919d5326eec4fad95aaf2a01c66312e35d35369005d98560bd7a7763db0511ccd8f72ae59a8f0890167bb8428a2928b4a850561cb8588d629c8dd789d075c1b93e6a6d0f474515a20dafd55588b66e5067fa1f66df8351b4f589dd0115bd07b8c4d7acf186afd75879d8ffbbe555959df6e2ae0d5c5d0f922a4439f9255d524c53906d0997a7df7a57f79e77363ca5c2df8db2c348fd7f2b75a5c7714f634d902060e260a4677544c452f9e90f4c5629a7adb230aea7176df1d67690bcc7de74580d7db707284dfc371498bb7e0167966f1afc97acb195c04a2622555e138016b3ecf085ca0f3e75f8442168ff5c97998cb9f68944d10efbac2e9591b89179a1a045cc719d2c6216239376213d4e1284295e524c952fe1aa7787b473b82dead91dd4b724da82275e28a763b4de06fee9b1a8eab3967033cd9fc24dfe9a124362de988eae7369801d9339026e5fd958183eaf2173ce9bcffaeb2b42c5bd096c2ff86a18865809ff2d49c7fc942a1675fced4961637c997f27378ddab949e548f692f0f0179b714d1a1c36b798c1a73af883553c9d04878e5927e13036a1d44837fb7d533a26aef429c40625a813ebfa041c48a5582e76e5c894ccefdcfdab1866ea64fbbedcd309cdcff8477d0ff00d342930e88a6393099f165659e4e90cd156543027be51393df7cddfaf965bc8863c295b9a6af043e9ea7166443fd62d837528acca6f1b983037a6ad8f51f4f1f47f8034823cd679565ccd59cfc428092ffd2c7bc88d414f6a9e3b71e9f8ae2b5151a54245b5f89f8ef841e18b87b1b205cc8bb1247d4f00119f3fa35d31f62b9e4efb08781cadcde489895bcf29447ccf9da2142a52a8709e3e46de387b27d0d974b708d8de64bd1863098595088d88f757338df744c549f4ee84f3d877c461497d5dd01efa0dbc46a1e8255001f50051f4a6b4a7b7e0a6dab50f59edf89ef11c14e8ef09a488ce7288e2cda39b0f36a5b004362e5aae833175785a3463470c982a6f995a08e0afad65225e3eb7da2d3cf4fcfe25fddbf67888230866feb6eb5f7c18b38158bcdd94d8d656e7fcf9e45ac23b8e9ed56cb5397858e29856c5c7ee4cb440c3c92e52b455bc2466f2d0df8f231260ce733 K = 3776199a4a9dc4c731891e6b45da7b9324972df6f6cf61c99699f60e374bb561 fips203-0.2.1/tests/cctv_vectors/ML-KEM/unluckysample/ML-KEM-1024.txt000064400000000000000000000311451046102023000225510ustar 00000000000000d = 8c7238e1965ddd73b1114b897e1bf4b308c0d9cc710d0482ab8b9e737405354a z = 8476013560151d986dc7834dcb57c75f845f8d7ee71558d0955f3f4feb723cf2 ek = a9bcb364f93cdcd97d0b004c5b42443d19cf74d80dadf9bae0fa5bebc00bf435568f2acef6fa1e3e22189a6207db208b2367856c591e10376a6e92cb165b2e05c7a3feb91744588e59d51fe323a90719a7018c670374a579201917f62d5e29bce6d7294f301853b239e97329f7e312c9090706a83d6c8702f1c462944bb487187f6cd1cc4040b542bc4cb4106eba18168029b5fd17bc6e0c6319283b799ac6415cb1730268602115eeea5e38665ef7ba38ded2bf9743ca40e29d16baaf9b0a0d9e7679959c7fd7112b64d85ab4837e7263c35ba81143c973ad833962c9944ae7bc16e54755fa19ee7a72f6041981549925212910f0924710c1501c2937089ef5b9bd49fa51fc222978093d3d9226fc25a275898707669e0d980c53b0b9525c89f25baa174a1ffba361e33a0c3d4255335c3225b2ccc8a6c58da868d0a2262963b9048559084814694240ec2061b2582e60a82b207c2750c1aff73a86f5f7ca8261117c741e138b117d5ab0a61c6a1488747cd3200e38b705194490130f88905a95e52ecf47a78a14725d6cad6085434fb21adf579ebe090279979d6a53b2ffd7182ab464a85b3299fcc4b7175b6cb5c392ec65fd892676b74b1591af3670bb02f39bd6b9cd3c015dfebb8cea2a24c723872e606961e10ec2946ddf9b05fa6a7c72845a5d4abd6e2a6ac0f0115f51849a38203b0a467788b3a8062fd1a826bb463c5567c271c50e43c6952f01410c970495c41faba3a54983cf145ab395b2710875c181314a55f121f362639644aa8e67b34d434174168518a2055b433c19694d36530fa89bc7a9da09a4e3affdfb84bb3099a0337719ac12418281af0a17034522626a21a02b9c71092616f0115055051ca67074854db077a4604852ab7435cd1c38cbf75eb7566fa853749a406317a6b22f324e1beab1a046595814af28304190cb8d0fe14a8b787fbefc17ab694dc5c9409c00320f08847d07c6d117795fe1531efc7b9f3695bf16016dba79800042a4312327a31921a847c28b2cdf3481027427e4cb3a01a30749eb37e29c28dfa447eaa2033dac11105aacebb52c6cc2c5f65556a21623445335978b18566c837f12a6f261cbb51b315a7c84bdfc4c2cba4b251686ebdca8f50c83c83061ca0386daa9b8f2ba03a88551f713aac58941835593ddd822cdb2b5145a4c63fa5054d898e3496fd8f1a7d523a995a3c896a26ee3b69caa9b243688c1648b4eb831b09d43b970620c6cc3a883b447f309874ac19a30d5a515b6b3f57c9383b0b57cfcb8c677b509d70f45fb36f8c698cdeacf8bb0a1004c42e58a5ddd60c916134ea6878a809c96c32aa971cc1da0a800de90973f76b97c200fde6730a7127a20458228c53f64dc07502a7debf279bc3c17f876661f9307ef914245312d0fe76556c6b3353b1cad2c48a2374be689c25a04cc0a7369c2514becd91aec402f198c93a1097c7bb67aab441e7b48506e13798f51bc996204487b3582b361330102c8a74c61cc4f3ba61641a2717c34886332a3dcd80846163f5286116fd16e4572b0ddd6961b39a02a6a1aa96c7d74150e9e4796b0804ff0e59a11981217884a5c9c868fe915a1341a8b2c6758f2510649257be6ab91583d252c5998eb0f43f95fcb35b0f9b9b7821832aea82dc9ba84ef13c0bd8bc2659808f3d9286d300c8e603b7b156f7aa2b727bb63ddacc441452d7fbb9132cc00cb99ca9873b8f3e0b9963a929d4427a9cb8e74122fb18b121527a0a6390e4cf4557a9b321cb1036799a0d517bbf9080356c8179b8984fe164cf06a972ec84eaed7432ca287e51947bb2cbe998462d52b2604203250b46c02e9c4288427ba59ad4828887797a93f92ad2191a30df08f2f29990851b1100cc142a5a4ab1bae3f23bd06cb5fb9cc89403154ecd4a63115ab9db960f6fac9727b6f96eb53c0745ac8f14525bc3215c107fae97cd16004525135e3da51f4d50fdda569adb21657fbb19cf2a34344b503348cbb567e911c04e72b3628232ad11832cb1277c58733ee923874410ce506820dd9b018947c07375890e317ea152c0255896e7703601982624acaf8b98f1971a91aba26548ba2a006aa83471933ea71c1660166585a9c6bce13242f368b45a5e63b0823a3e3190089256968f54dca2a08ddf81870f17f5c3c6fe50d06fc1bbbffafc56ab7050f2773ee8ef8d28ca4b97b43c8d7202e71 dk = 38b3964f66210f78a9c59cc189cca21d3605692c015e8197c089303af1884a977649d7c262828938d23c7716557241927876862538a5da53bba1311bc111862a30cb5148b1d3c49a7dd9c5dde0c05ca3c15637a8ebf3c5d2155b458546a9411ca1cb735eea5cb4d0953559acf9f7985ae86adb2ca0b086c69961c89115990f0543f5d65349886894182f11dbaeeb3cc5740c6bdfbc8ccab88f8583292be46b1666be3b053cd1230641e83d686a9186501759ec2dfca01ea3725f3f5846699b8321bb90e2d3b567e32b70ecca53b5ab1f421a99ab01a5d4bd8531261a86cf676553a51cccd8d3c027176c2e5abf341cc3571c8bf249c76828cef9e52052247f2ff1a6e5b231ef99907a524e4540ba067875675719d13821f67633d9b3c810078c7a66220c385374a2759a693339227f90745eeb83c7005ac6dbab52d4526e673c92a2160563191646e246090b5969a8a37436c3dcf433f626887900ab7fb65b00590817684ec9e826cb86b156c48c81a59dc9633266f6422e2ba95a8b5e7d06b96db36cdd3c5bd984caf036634e80484871c7b53387c4645da4d40214d2cbb5597b85706273ba0a3618a3cee7397fdb336ef5c5b1f418dc1b8f077c2e7ffcb9d96b6c61486751a516eaac34c98692f2296fe5d041ec9302c072ad847b1610aaa93e2572e2c045e4eacc7da437e11965b0106803f9c84035b741499583f958c2d7c2699a421b451aa0f17af4c33a7d8ccaca5a2230402e63d1973e56ba44236542a21844557643c9a606ca0aed651d98e19f800c4f22b78b9c170901f4485fab5d382351e1f8c49a7642c92b58fe1a163e61bff335760184cd3bb827184b4e0772096b69c802a9b72c754014905556679b136105bd05a77a292756a39a4237a1b746c9f98a51a52b526aec6368c4b6f56386ab23474672b03b90bee473b06053497db540ddcc42fe85b434c734e9d0b71b48177860473435986d86caf24708800aa6abc1a5d8591f3fd6bbaa9bc923bcc89bb2bfd1ac34fc4062d452b7116c0f532577f8351b33f08100695998eb18a2f46ebb7a4d001913300193a9e6cc666c30b72722caf0c027dbb98af124aaa06b43c53f10751916533c15582081235192c13266b86c88e09f276011a617a63e038637a618ad0c3164c354c223283b5b7a363c7773506ae8471e85ca7670bc209ee949f0b791e3b58e0c934a5f0898f2e73994bb96423251255072c69862b7142df8b37af586939d6b8639b426da940a0eb6b5987c733302452494a73327356567cb8c0c8f6e79424e23ba86c08d75474be52191bb344f06b929b3eb61bf27a077a679df00489c9ac352d75482461636695968118608a26f45e0c88f870fe3210ebd114c2df3081e786aeb5b2d00a51689780a99bb4c3d8c5fdd579ea1e628bbfb59858704b4fa6315285384a5b3b0982c329a1476d4b9d7840fcee04753c78a41848c33e1a0b93a26ed3a657eaa084deb48747cc5003b4acc8107e2411f08897e60b750aa29bc74c69759b361ec92504c922b28387eb97b50a2790f3fec75619bc3ab069502aa5e46076e20b80b256798ac2125edb870d3b764b6534098777379c389a26422981128b04192e8bcacef3b6865b87439e61948c2cbc3355f14e2cc55eba13eb08020182c865a90fbeb67b772262b2ac6df64219d8a55091425e4eb4f598277a7da73368717b1f78ef0e2c7c083708793229dbc20b5c1a52fb78900741bb6a572ba064bbe5cc07dd794d3e749d64022c77a211f7a71cabc470ec6a6fb974805134cfe24193042a94f901876064bde67242a0badcc8c8625329429d6797ceaa93807a92813884b38220c641330c86321ba245a99a79e68610c165966a9223c339c54c641e7b86638917945ba6d5611852cd65764528bbfa81602e69db38532fb15c2bb70aeacf53f230ccb7341aa4d7c5ab10abba978be01574a81f3906ac7a257a8b7b8a974c77b447c679900ac3c5aabcb1d98764f377dfc59bf9058459bbc1cddb9949db5a61149268387222bd0237977361a282ee7509b9dcc5c54859cf377cd41e92f2ee92b72e02bc7760172b9b958066ddfbc7a1f8a04aec4839a367fed2559d80a88f5c07454619f3879ab2296980ad1770e8b137f1694ca705141ebc6a4b4708eb93d2c63b18522b5a9bcb364f93cdcd97d0b004c5b42443d19cf74d80dadf9bae0fa5bebc00bf435568f2acef6fa1e3e22189a6207db208b2367856c591e10376a6e92cb165b2e05c7a3feb91744588e59d51fe323a90719a7018c670374a579201917f62d5e29bce6d7294f301853b239e97329f7e312c9090706a83d6c8702f1c462944bb487187f6cd1cc4040b542bc4cb4106eba18168029b5fd17bc6e0c6319283b799ac6415cb1730268602115eeea5e38665ef7ba38ded2bf9743ca40e29d16baaf9b0a0d9e7679959c7fd7112b64d85ab4837e7263c35ba81143c973ad833962c9944ae7bc16e54755fa19ee7a72f6041981549925212910f0924710c1501c2937089ef5b9bd49fa51fc222978093d3d9226fc25a275898707669e0d980c53b0b9525c89f25baa174a1ffba361e33a0c3d4255335c3225b2ccc8a6c58da868d0a2262963b9048559084814694240ec2061b2582e60a82b207c2750c1aff73a86f5f7ca8261117c741e138b117d5ab0a61c6a1488747cd3200e38b705194490130f88905a95e52ecf47a78a14725d6cad6085434fb21adf579ebe090279979d6a53b2ffd7182ab464a85b3299fcc4b7175b6cb5c392ec65fd892676b74b1591af3670bb02f39bd6b9cd3c015dfebb8cea2a24c723872e606961e10ec2946ddf9b05fa6a7c72845a5d4abd6e2a6ac0f0115f51849a38203b0a467788b3a8062fd1a826bb463c5567c271c50e43c6952f01410c970495c41faba3a54983cf145ab395b2710875c181314a55f121f362639644aa8e67b34d434174168518a2055b433c19694d36530fa89bc7a9da09a4e3affdfb84bb3099a0337719ac12418281af0a17034522626a21a02b9c71092616f0115055051ca67074854db077a4604852ab7435cd1c38cbf75eb7566fa853749a406317a6b22f324e1beab1a046595814af28304190cb8d0fe14a8b787fbefc17ab694dc5c9409c00320f08847d07c6d117795fe1531efc7b9f3695bf16016dba79800042a4312327a31921a847c28b2cdf3481027427e4cb3a01a30749eb37e29c28dfa447eaa2033dac11105aacebb52c6cc2c5f65556a21623445335978b18566c837f12a6f261cbb51b315a7c84bdfc4c2cba4b251686ebdca8f50c83c83061ca0386daa9b8f2ba03a88551f713aac58941835593ddd822cdb2b5145a4c63fa5054d898e3496fd8f1a7d523a995a3c896a26ee3b69caa9b243688c1648b4eb831b09d43b970620c6cc3a883b447f309874ac19a30d5a515b6b3f57c9383b0b57cfcb8c677b509d70f45fb36f8c698cdeacf8bb0a1004c42e58a5ddd60c916134ea6878a809c96c32aa971cc1da0a800de90973f76b97c200fde6730a7127a20458228c53f64dc07502a7debf279bc3c17f876661f9307ef914245312d0fe76556c6b3353b1cad2c48a2374be689c25a04cc0a7369c2514becd91aec402f198c93a1097c7bb67aab441e7b48506e13798f51bc996204487b3582b361330102c8a74c61cc4f3ba61641a2717c34886332a3dcd80846163f5286116fd16e4572b0ddd6961b39a02a6a1aa96c7d74150e9e4796b0804ff0e59a11981217884a5c9c868fe915a1341a8b2c6758f2510649257be6ab91583d252c5998eb0f43f95fcb35b0f9b9b7821832aea82dc9ba84ef13c0bd8bc2659808f3d9286d300c8e603b7b156f7aa2b727bb63ddacc441452d7fbb9132cc00cb99ca9873b8f3e0b9963a929d4427a9cb8e74122fb18b121527a0a6390e4cf4557a9b321cb1036799a0d517bbf9080356c8179b8984fe164cf06a972ec84eaed7432ca287e51947bb2cbe998462d52b2604203250b46c02e9c4288427ba59ad4828887797a93f92ad2191a30df08f2f29990851b1100cc142a5a4ab1bae3f23bd06cb5fb9cc89403154ecd4a63115ab9db960f6fac9727b6f96eb53c0745ac8f14525bc3215c107fae97cd16004525135e3da51f4d50fdda569adb21657fbb19cf2a34344b503348cbb567e911c04e72b3628232ad11832cb1277c58733ee923874410ce506820dd9b018947c07375890e317ea152c0255896e7703601982624acaf8b98f1971a91aba26548ba2a006aa83471933ea71c1660166585a9c6bce13242f368b45a5e63b0823a3e3190089256968f54dca2a08ddf81870f17f5c3c6fe50d06fc1bbbffafc56ab7050f2773ee8ef8d28ca4b97b43c8d7202e713e8a5c61bf743019116026877c8e08dddaababde8395b3e088b6ab4338ff4ee18476013560151d986dc7834dcb57c75f845f8d7ee71558d0955f3f4feb723cf2 m = e48f74ad416e99631003ded1478aec62a02c245d88ed7f2fae92aedf13ca03b3 K = 5895ea3e868881674be74cf26faef68471dc731ae965a9c2094ed852349ae477 c = ec8f4c4fa1c52108712eae2b1d6e4a6eb55656855298fe1f1b76b30e26c4457e862c523dc9d56dd0c584853bb35c1eb038a84abb1a1a35ddb0f893fcd84340cb315b3205285479b8f3d64f3bc38085155c2de0663052007416b682e6dcc5e1702a4845ce1efbfa5f5619183f657f0341bb510f2d07a87019c971b87561d74414c1cfb00cc95fe769d6c6f45351c370fa66d323405085d4c33c228ce02d6883ae116450252605a62da9a1dae2d685e2e6821a0d17957b86320a45a5ee34c73e69f97a0f00e2fbf35402a8ac31c70454a318268c3637907e9f7911b3af8a2f491cd7ee5513c3471cb6ffe5c38e2263933641c4a3adfe112d04713a01a855f9d1085b59f20cabe401693a56a54f5e8917cc388310ab93be04d0711d7a54d599b8ddb8ea23ac41a6c41681ae1beab6afdd15f2c8b19cb94b5a9f3d9a4ab069ec01619e211b1804ec04689877660cbdd01ba2be1265793184a60a4ae7852f7639b25b2a284f29476f4fe15beaf168584d8a54240de7440a6b7f33e4be116d4440cee4de53a491e7e678fa75bd267d1ed22a070b057e61a4a9228e0323ec4ab050521fc7cac40942b0dfc6a7762e503b86201b1f50a9fbc908c3b5ebfad92128fe65e4ba5510f2ef9ad4281a14d81830f437fafe2241ca772bb4b89d702504d042741f618ee0311f40db4df310d4e2e0291f48a758ec0322480cb1c48373459e0660fa2497938fbe8d07a95d058b40c606f9e6735cbc6f4167860ce45f4f0290aeeab04c48fe5ef8d0ddbb411e480a02c529698e250d8c67e5e43035479cb22056485a16138994c2633085bc2ef32d11300768e69a224808789ed30f425c4c59fe818163d78a9edc5a5a21f63393dd8c7225c1621740da61ed448a28153379dd3786cd8732d302c2948efab43b802b672658349569ac6b65314c4607c0e11b5ce13b1a3109ab6a631e4ec77bc4468f823851189dd35855fd2cb525d7c9155bebb1641d15f5790b2a92a17423129fe14a3b405da197642ca55ee542e14f68cc6a8638127be899d9542b564615eea93846879ddd9cff77617f20bddbfd7ebc11feef658ffad35ab9ae20e8913477935653b07f4351b99d6140ee2d12e1d8a9f9874841a90833ff1e33d9e0443d5520b8f2bdf40bcee595a9763eab90d3a4a9a11aecf19bc6993f60d8219153d2818634b2156b33a25e692abff327cd6d6fea37fce4c57050ae5407a0cad67329f4342e6a177be7cd150a6c1f42244885b852b39d292078945e4bf3a5e967e2b658a8780d8dfbd1eea7c9fc5352d254d114b3a244f8408e5de03cbf73769c02d1c20243c0c19b7e28abcc69c9d3e72d833ab12beb090e587ea57b5ba4e094c95ad3c29772d34b81f1c793e77cbf9af28c24224c8af92934653a66b2fc6760bb21b4c0ed86164616adf13f0f899e1e95da201906302e13b57bbda436482e57c10b84d7bf83b7e669c5b2e959f738e4530597bfa22d36d2e55708b2a1b1c4bf6d96b42546a307539024faa06db9937e5c643760739626dd8d36233eb8201a2c4062d97dede500c61f94a44cd26f330f0f93b9590543866e9775be7e70868b7f3c7bb2b2860e350daa39d77fb94beed9f6646d401e10eeb4f739735b1711929e5adff3d45b09e72cd1b570f8f11d091166b2705ae0534b77081f1800cc94757a61783f6094b21fd9ac7e4cba8bc08f6948e12ebd482243f553272ff5ca7abb8f39eca6a8bf54bb45f1e1f55d09bff59ba2c7de869e2acaf7815a27925b7c6c39181565d7247dc3bb5b21c99a719529b470e0eefb4a9d3d3d9f36f0226adbaa9cb415c17d8ae9529499e22653a889abb74f0625317b3f4a8cba7ac0fcda16016d9abeba3bdc229f4c12bfbe69c3f43521cfcdfea42b20a4b8ab28363748ac2bf8b043399ef10dda976f5d8afee604749213302f250260465c0a2ad73184561a571b1e44b6df1723b1ba714736a99c2fc59d08a0a9b627f8d589b67b4fd2d9be6f74a1108c9d82576fbc3615d662ef17bf29c3d213b41af34ed14678a073c62d2c37aea124c4d3b7d479696a0ffc758628e13e82ed2832dcf30ec45e0f57fb33ae667bf9d8a4d3e33ffa56daf21a39d1ab4631e0ce716f7940a4bcfde7d1198823bd985c79a5a7ad098107763c2fc93429c10ac92dfde340df1eb38c88f97beb58404716ebac6b04b0c0038daa1753d0b250daef0d28f0a86783 fips203-0.2.1/tests/cctv_vectors/ML-KEM/unluckysample/ML-KEM-512.txt000064400000000000000000000150451046102023000224730ustar 00000000000000d = 8c7238e1965ddd73b1114b897e1bf4b308c0d9cc710d0482ab8b9e737405354a z = 8476013560151d986dc7834dcb57c75f845f8d7ee71558d0955f3f4feb723cf2 ek = adba5f8200668806c2b53b3f9f8c7ab73a615a7a211f90c8d5b37f59048f66e59d4fd8284d10517ec29157798c7a28a0f02881bf4a10a5bca3440484fb0349a61a229c3773eb60c77e201b9d63cda769306b6558bb023e2147508d8836fbd042ec8842a7f6b20d401b0d9c36d320cb0e6374ebdba7c43c8ebf5085d1e2255c01a050d26602c486afc7a3425c90fff079f9e13d6b45c8e3ea778dc28c4a1835a992b8caf2711a3a812fe65eb4aa1b3ed44d84f85b6cfa3fafab2d9df20b191586b1d6befbd87f787c7a65037f20d354e3e14578172a653804b335351122b5ee73b355496abc8a2a478b7c784c59925b161b3117e8d22dccc33026931d88495ba4d47397598998dbb164300549323084688fd07a950d292a83c19df352cf26d51681e9866745871d775e292cbb556018fa19a51191306009a9b5b9cee99a594820057dcc7f32966151588f0ae17149a41de70912ab9366ec86be7a1b152b559fa6992de4f007dec3ba73693b9de4cce8f7bf42cb53e1c535e7113754cca126178892e935fc21675d687f629c77bbf22ed3e574c375a82bf2b73f16a553f95ab5d45a80f612b164b01e6552fdc7aa31c4ba8691963821ac6559732c338e3aa71803861d10f171c907713b323ef2a75c2007a72be0b3df1c8d812c2687da6f0a86bf2a754ddb7517a1c55d65993f73903cb2ac58f48cb23dd8adbad7a3fc375ce706c996c66926b69d32b8b497c073f3679cc075836716ad4f4470572391320a0eb217876dcb2688c02cce659d6269a1ac7401a64a2fa4acb85ea58879337444075252f85978b56c59b89f166bc3f5f2a85a0449e50266f7a7a76ac8113ec40fe273117ce704a257bee9982cfa682c6a1887c53bc5fa121bfad3c64579c4823110bdd2794d91757d2c928807b74d902b38e9b1f872af91f6799a53b50470a31d937101879e3c3961e59385e50a8aa40cb22141054aba3136cc6b7738244228031689c65503632bc7cc144c095af70e078bacfcb75026592ef2b93d0e66439258666b6811899456c027c941f5c7ce686d20fa2f02f11cfcd658318b1e7785b219dcc35c3c6fe50d06fc1bbbffafc56ab7050f2773ee8ef8d28ca4b97b43c8d7202e71 dk = 4ddc7f1c67865333aa622260b8d1230745b00db64c77d2977094031f48181c8860daf7339b947d1170cd66b847f7b0335fb74845a94da6a22eafa638e11c4e5d459d04548d28ec5f28115a8e5a290138ae198423e9f640d94609ec926d1f0bba4c7cca9b0b6ca061bbe579c6f3a3c31698cc79fb80b70b9e1d22bffc449b5f5851bdb1a08ffc4b58c7ba955454cdcbbc38602ca6ab9a7ada778826c0d89c1cef6297549ab2d22a0cd2594e922b0912a792d0ba037143c70676c813e08e3378c0902baf0418009a5910625c5703b105caf7b0864643389b51a98c8ec1d106f8a9192af2bbe2a16584805bfdd1177093c5eac149869172ff63a88a7973bbc80672598899a2483bcc141e3cc6e0f33f36281e7a518881b2210a354b9284afb024c4ec1b341414ac9d6885dcb5115150b312f9476f1ccc28692b00f52f0625a37ddb0b3ffb23fdca0caaf560314686225c2e3f039f31229032d026644b43e18a5a91290e2e382b562b1002b408f5b411e240767f03740178ba7d4737db644b159192dce611a30bb950d2795d2c85c123472ca16665d469e7c04dd3c5785e104fbd745d00442534c77aa024be0d8287bba9bf6408302a40a12e3743fbdb187b874bf5c99c1398a088265744657809a4457dd157bccb42d21ccf251986e182c2b723cab8fb176030775f28a038357953bcc8c8714b3e669dd3f1c92278b91c339767c0aa2eb4880e87b544ca11e09339031571abb97eb1dc7c354405db23b153153b8d3088b983180af9bef77738725b9e919c2a00a85cbe097aff21714ca946a133ab51818652c78a1a23c61829894a4865c1a601ea555f6b846dbababe7bd36183d8ba7836397c3336b0ca59e8ea92a99cc8cf381bf524bb83709dff3086a386b4646703f362aadb792dad09480494ca7b372c7181c31de06c9a0b6a7ce52d7c74331337a1337c447bc73e9fd1a4e5921463b8248a96cb26417963207889152432b223edd48b5416c82ae35a0680c2a9c5cd1cba9c16d09b4374250ed375c103848ccb8b51b2871af9beb0057c9ee8879f596633456185c75335168126dc028ca96eadba5f8200668806c2b53b3f9f8c7ab73a615a7a211f90c8d5b37f59048f66e59d4fd8284d10517ec29157798c7a28a0f02881bf4a10a5bca3440484fb0349a61a229c3773eb60c77e201b9d63cda769306b6558bb023e2147508d8836fbd042ec8842a7f6b20d401b0d9c36d320cb0e6374ebdba7c43c8ebf5085d1e2255c01a050d26602c486afc7a3425c90fff079f9e13d6b45c8e3ea778dc28c4a1835a992b8caf2711a3a812fe65eb4aa1b3ed44d84f85b6cfa3fafab2d9df20b191586b1d6befbd87f787c7a65037f20d354e3e14578172a653804b335351122b5ee73b355496abc8a2a478b7c784c59925b161b3117e8d22dccc33026931d88495ba4d47397598998dbb164300549323084688fd07a950d292a83c19df352cf26d51681e9866745871d775e292cbb556018fa19a51191306009a9b5b9cee99a594820057dcc7f32966151588f0ae17149a41de70912ab9366ec86be7a1b152b559fa6992de4f007dec3ba73693b9de4cce8f7bf42cb53e1c535e7113754cca126178892e935fc21675d687f629c77bbf22ed3e574c375a82bf2b73f16a553f95ab5d45a80f612b164b01e6552fdc7aa31c4ba8691963821ac6559732c338e3aa71803861d10f171c907713b323ef2a75c2007a72be0b3df1c8d812c2687da6f0a86bf2a754ddb7517a1c55d65993f73903cb2ac58f48cb23dd8adbad7a3fc375ce706c996c66926b69d32b8b497c073f3679cc075836716ad4f4470572391320a0eb217876dcb2688c02cce659d6269a1ac7401a64a2fa4acb85ea58879337444075252f85978b56c59b89f166bc3f5f2a85a0449e50266f7a7a76ac8113ec40fe273117ce704a257bee9982cfa682c6a1887c53bc5fa121bfad3c64579c4823110bdd2794d91757d2c928807b74d902b38e9b1f872af91f6799a53b50470a31d937101879e3c3961e59385e50a8aa40cb22141054aba3136cc6b7738244228031689c65503632bc7cc144c095af70e078bacfcb75026592ef2b93d0e66439258666b6811899456c027c941f5c7ce686d20fa2f02f11cfcd658318b1e7785b219dcc35c3c6fe50d06fc1bbbffafc56ab7050f2773ee8ef8d28ca4b97b43c8d7202e71c520653c1786ba01e323d525cf53eddcd12db9977e4630cc2ac10a6a81406b218476013560151d986dc7834dcb57c75f845f8d7ee71558d0955f3f4feb723cf2 m = e48f74ad416e99631003ded1478aec62a02c245d88ed7f2fae92aedf13ca03b3 K = 9ce7b7117dcae1317ba2427d19796275502a0417ed2e8c346a65b923cfb2f23c c = 7b41356c004b5e6a53a2027e33b15309838010e78c64ef7d61a21c99354367f6cf4b80949a155bca61b287b57fe318c142ba09f485eaa82e2e5f3d845458bf06ad65ef0801aca999b564f6a97d1a7b388a685df1bb5c966d3d3185bf25872d60eda369bb8004c993bb81f7e6d05c6ac77e49aecce075f0032eeca9d7b19f4b16f79f0fbb17c289218dfcff32cbb61cda905bd87005abd6bc8825bcb3af30e61581ca73a9daf8bdd5c9b8805e1bcef85eaaed03a7ccdd3c87af0fdb8ea8696cceb6bd1d59774398ee401b28ff3f8bc6cd8716ce3f9339a905babfef089d766de4a86914311d8b9a02586003c65b1b521db706a75d85316bf04e3f13c80d95adc7f7f47a111127157435bcba36b6e87601d059324d76c528eb122942e6b6ff69e1d80015cda3d19f76b09e97f9b1d274bde9e0d37c9f6e8418049400f27c0adf662ac64d3063952f1c792b6b871689c37f0d2c400e1d77a935db5e94784fc02747c55a577645809d380dc131300b4ab17688b7545062b4928aa920e4f34481c8e5db368e7c455eb38cade5e88b1f8bf1c354d127db669f9b6860fa8ede17dbe6eca2a4ac1ea4476880e141f8821061272affd05e6ebd5695fd4b7514266cd4c35043398be9fba4a2eb7a3c09084f8a91fcab3d9037f0f5206250fe6405ce13a6b909e755e3288efae0a29a83ac53b2330109a4c347a55ae13feec19d7cdfc8765c0fe3529b4486da9b587f4a517caf9f84c9f6d9f1299757267f4b2c167dfc130255926863c1d90ce05fb521c854a2edca3eb820055e0881c1b7069b13b76bc28496812068e4f705204560c9953bb13186950fdd06f5eae38de70184326759c89a1a006c9fc41bf3877aac7dad74d899a06492c968ca31b729b52495a90932f3fc242a6c99a29afa54a9980268a20e4e0f5364a7cef68212c20fe57d93d7296bf61c63128d94cdfac778f39138eacc563586bd42c04c14e468d60de55536822340c793c8407c6031672de701018fcdbe351bcc32010d4053046f68aa377e12a888f48fecd44ef7497b6653277f5177b37530a7c23ea0d55a2c1b50bea733884674 fips203-0.2.1/tests/cctv_vectors/ML-KEM/unluckysample/ML-KEM-768.txt000064400000000000000000000226451046102023000225140ustar 00000000000000d = 8c7238e1965ddd73b1114b897e1bf4b308c0d9cc710d0482ab8b9e737405354a z = 8476013560151d986dc7834dcb57c75f845f8d7ee71558d0955f3f4feb723cf2 ek = f029cc40c924b4ac401a14b4bbfb4012989042b3c11df73eb8b6ac35808b1b1bb4bc82cf970b83ce5c09e008caca9c364a2a6d7964b76aaa574532407fe293f507a0937b3f4f124a2f5946d2c78191d0cd7ff6bbc0ac4386259aad68b83b07164e35a24eb7a169c0191fb698db22b9e1f46a7b389fbc648f1ee7850459b60335316e33171ce81d9fb5a35c2c7531248479e14bd0f4904009701ae9404fea0e5c6765b21b74be55252ee9c4c7d97b38807c74a73ff5e9406c53079ed13baa96b195396567366bef571aedf9c108b7462800605f1c8a44fa8316521287b19339603d16dc9df8bbcf249cae26a0bdb2f899dfab8168ba648d648ac47b27ae3731024ac012910e5479ca7d913e1b350fc7282cd8f8b10c8bcade27081e760c41713ebe25bb4cd10952310c4c23c68de567019a8978ca3649f17a2c1270e3a78237d81ad6971cd62815467a8472d290e9f78f7fa755b9b882a236cef03407c5d7177627c568e344c32c35fd5116f38020338a1b8e706efcf3b02284b79f8964af027e8b686cd769153e31c8284243e44c44c7b8caace43fdcd02c0da14fe6b17811c42686710642289ce7eb3bf648902f0c019e48b8508b764e3b6b67a90437616ad088a82928b4c61128abc2c8ff72add3ab85a2c3572b8a445dc519e6b50f71dbaa15977d3b66810f880ba6e037caf36146d2b72eb16e435bac8e114461bb2bbd7598aff3c01046395d0347f062b5488c3460f489589756ecb9c3dcc044c01c078d14592caa1a497baff0e3444e123549bc19a4f229d967ca05d940a2354a673b9fe8b2cac9f55b2bb4081fb68e4dd436ebe12a024569d83284a60a25cd089a81401cf2b7344432c6cbf2430de1446f5204851cca9bbbcc3f134083f1b8c25144bc399817539074e90c23a3669c55667158ce3b24cebea93b3325590408b2642c9b07d07aab1c524021af746477d45132b64771816000a582bc9aa8880f723540cb36766c46fbbbb14b418650b8c70443559b6b94c07caa584067c7aa216ce50d2a2c08d0ca6280fb488b28b75e794f405948b4ca8a66006bea75050a795086cb33b607b75cb2678b8276ff2aa07eb26805c3c64034115e7491e8b2cf434cc523648b9c4727502c402466299f985ec221565c990ce2c4b7fbb98c591ca9a78911959a4035d2a1389c53b4aba0e407969998b2d93b18ba074f2f90911bbca80109ce5af819b09205ce78a38d15c602e2b950a95df3d3371a938749345424dc8b9d0944419a01f3b59b5c5c0369ebade574bcb1cb553514307f7356b95a812deb1df218c2b671ab2e5c4b800c37fd0c60d3fa8eabe895e020ba1d59018ffa263e17956f97360265918432b2c92a046c63adbcd88a3acb1099ac9ddd372d6f866f2017ca58a1664cd65525f95910a3a4149b08b63cb7f250798b9ca82d40377c4c2994309fdce095f101c23b25ba98fa9d377228d8799f5d035a069a0ce39cbc7fe7167a7b283684a38a3011774885ef50b642c615317ccd5fa342acd415970b5630eb52e246b3d1856ff2c69c92e25dccf99e38b0482807ab7b34133d30112cd5c12bac272ec05c17d2810848ab835a2f387b2a8d451dc18c31cc2b43ac95954f202a5c3c6fe50d06fc1bbbffafc56ab7050f2773ee8ef8d28ca4b97b43c8d7202e71 dk = 38b3964f66210f78a9c59cc189cca21d3605692c015e8197c089303af1884a977649d7c262828938d23c7716557241927876862538a5da53bba1311bc111862a30cb5148b1d3c49a7dd9c5dde0c05ca3c15637a8ebf3c5d2155b458546a9411ca1cb735eea5cb4d0953559acf9f7985ae86adb2ca0b086c69961c89115990f0543f5d65349886894182f11dbaeeb3cc5740c6bdfbc8ccab88f8583292be46b1666be3b053cd1230641e83d686a9186501759ec2dfca01ea3725f3f5846699b8321bb90e2d3b567e32b70ecca53b5ab1f421a99ab01a5d4bd8531261a86cf676553a51cccd8d3c027176c2e5abf341cc3571c8bf249c76828cef9e52052247f2ff1a6e5b231ef99907a524e4540ba067875675719d13821f67633d9b3c810078c7a66220c385374a2759a693339227f90745eeb83c7005ac6dbab52d4526e673c92a2160563191646e246090b5969a8a37436c3dcf433f626887900ab7fb65b00590817684ec9e826cb86b156c48c81a59dc9633266f6422e2ba95a8b5e7d06b96db36cdd3c5bd984caf036634e80484871c7b53387c4645da4d40214d2cbb5597b85706273ba0a3618a3cee7397fdb336ef5c5b1f418dc1b8f077c2e7ffcb9d96b6c61486751a516eaac34c98692f2296fe5d041ec9302c072ad847b1610aaa93e2572e2c045e4eacc7da437e11965b0106803f9c84035b741499583f958c2d7c2699a421b451aa0f17af4c33a7d8ccaca5a2230402e63d1973e56ba44236542a21844557643c9a606ca0aed651d98e19f800c4f22b78b9c170901f4485fab5d382351e1f8c49a7642c92b58fe1a163e61bff335760184cd3bb827184b4e0772096b69c802a9b72c754014905556679b136105bd05a77a292756a39a4237a1b746c9f98a51a52b526aec6368c4b6f56386ab23474672b03b90bee473b06053497db540ddcc42fe85b434c734e9d0b71b48177860473435986d86caf24708800aa6abc1a5d8591f3fd6bbaa9bc923bcc89bb2bfd1ac34fc4062d452b7116c0f532577f8351b33f08100695998eb18a2f46ebb7a4d001913300193a9e6cc666c30b72722caf0c027dbb98af124aaa06b43c53f10751916533c15582081235192c13266b86c88e09f276011a617a63e038637a618ad0c3164c354c223283b5b7a363c7773506ae8471e85ca7670bc209ee949f0b791e3b58e0c934a5f0898f2e73994bb96423251255072c69862b7142df8b37af586939d6b8639b426da940a0eb6b5987c733302452494a73327356567cb8c0c8f6e79424e23ba86c08d75474be52191bb344f06b929b3eb61bf27a077a679df00489c9ac352d75482461636695968118608a26f45e0c88f870fe3210ebd114c2df3081e786aeb5b2d00a51689780a99bb4c3d8c5fdd579ea1e628bbfb59858704b4fa6315285384a5b3b0982c329a1476d4b9d7840fcee04753c78a41848c33e1a0b93a26ed3a657eaa084deb48747cc5003b4acc8107e2411f08897e60b750aa29bc74c69759b361ec92504c922b28387eb97b50a2790f3fec75619bc3ab069502aa5e46076e20b80b256798ac2125edb870d3b764b6534098777379c389a26422981128b04192e8bcacef3b68f029cc40c924b4ac401a14b4bbfb4012989042b3c11df73eb8b6ac35808b1b1bb4bc82cf970b83ce5c09e008caca9c364a2a6d7964b76aaa574532407fe293f507a0937b3f4f124a2f5946d2c78191d0cd7ff6bbc0ac4386259aad68b83b07164e35a24eb7a169c0191fb698db22b9e1f46a7b389fbc648f1ee7850459b60335316e33171ce81d9fb5a35c2c7531248479e14bd0f4904009701ae9404fea0e5c6765b21b74be55252ee9c4c7d97b38807c74a73ff5e9406c53079ed13baa96b195396567366bef571aedf9c108b7462800605f1c8a44fa8316521287b19339603d16dc9df8bbcf249cae26a0bdb2f899dfab8168ba648d648ac47b27ae3731024ac012910e5479ca7d913e1b350fc7282cd8f8b10c8bcade27081e760c41713ebe25bb4cd10952310c4c23c68de567019a8978ca3649f17a2c1270e3a78237d81ad6971cd62815467a8472d290e9f78f7fa755b9b882a236cef03407c5d7177627c568e344c32c35fd5116f38020338a1b8e706efcf3b02284b79f8964af027e8b686cd769153e31c8284243e44c44c7b8caace43fdcd02c0da14fe6b17811c42686710642289ce7eb3bf648902f0c019e48b8508b764e3b6b67a90437616ad088a82928b4c61128abc2c8ff72add3ab85a2c3572b8a445dc519e6b50f71dbaa15977d3b66810f880ba6e037caf36146d2b72eb16e435bac8e114461bb2bbd7598aff3c01046395d0347f062b5488c3460f489589756ecb9c3dcc044c01c078d14592caa1a497baff0e3444e123549bc19a4f229d967ca05d940a2354a673b9fe8b2cac9f55b2bb4081fb68e4dd436ebe12a024569d83284a60a25cd089a81401cf2b7344432c6cbf2430de1446f5204851cca9bbbcc3f134083f1b8c25144bc399817539074e90c23a3669c55667158ce3b24cebea93b3325590408b2642c9b07d07aab1c524021af746477d45132b64771816000a582bc9aa8880f723540cb36766c46fbbbb14b418650b8c70443559b6b94c07caa584067c7aa216ce50d2a2c08d0ca6280fb488b28b75e794f405948b4ca8a66006bea75050a795086cb33b607b75cb2678b8276ff2aa07eb26805c3c64034115e7491e8b2cf434cc523648b9c4727502c402466299f985ec221565c990ce2c4b7fbb98c591ca9a78911959a4035d2a1389c53b4aba0e407969998b2d93b18ba074f2f90911bbca80109ce5af819b09205ce78a38d15c602e2b950a95df3d3371a938749345424dc8b9d0944419a01f3b59b5c5c0369ebade574bcb1cb553514307f7356b95a812deb1df218c2b671ab2e5c4b800c37fd0c60d3fa8eabe895e020ba1d59018ffa263e17956f97360265918432b2c92a046c63adbcd88a3acb1099ac9ddd372d6f866f2017ca58a1664cd65525f95910a3a4149b08b63cb7f250798b9ca82d40377c4c2994309fdce095f101c23b25ba98fa9d377228d8799f5d035a069a0ce39cbc7fe7167a7b283684a38a3011774885ef50b642c615317ccd5fa342acd415970b5630eb52e246b3d1856ff2c69c92e25dccf99e38b0482807ab7b34133d30112cd5c12bac272ec05c17d2810848ab835a2f387b2a8d451dc18c31cc2b43ac95954f202a5c3c6fe50d06fc1bbbffafc56ab7050f2773ee8ef8d28ca4b97b43c8d7202e714092928c2fb67cf2c96d9de44a4bf4773593d0ff8019dc69e0c23626a7d8569a8476013560151d986dc7834dcb57c75f845f8d7ee71558d0955f3f4feb723cf2 m = e48f74ad416e99631003ded1478aec62a02c245d88ed7f2fae92aedf13ca03b3 K = 821a5e7294086332d139f210070ad873a80f28c550dc38e78a1a9f0023332d47 c = afff2412117fdc6d06798e131fba62479e711a349fb873c7017f53c82092dcbf1a22410cb918d7def83fa0a9679390f3ce3f93b6da5c441591d38ff81b7ae2d2cc8411380c5c791f94deebc74850123a5b148456884824d36037d0d9f162ab2b57fc82dac938dc68c10590b5ec6d169e6a80bd07e6bd33ff2076022dd2f722217fe2358e455fd9ff6280af169f9cbc6d1d7cf06bc78ad1dce143256057a6b25dedb655ab4e56ecfcc7f1d1cd0e4c64264ea2c50757e71a50ab56415e2b57ac9ac358f3897dcad8999f877bf01e94cd5110c6b6371c5e2b43cc694840678100a8e0deacd959732910b46136ca27ae9a71ee4ba9c1174faf8cc7b3fde0d66721f8e788c0fb1943f6fab1cbf27fff96b4e2accaf21d82273687786f914bed4995ebfe8a2536582accfea43dd0bb76f50d74f66d71678571f6b219bb397a58f93a0ee9996194a23c1274af0efdcf2b7e9b4806beaaa070fc39e5cd8c4ff8fc1f5c9ff675a270159ea5f94ca0491c51f0e35a04a8e899e826d04473eb83a7a21d4efc12361420d657e495f537ce02aba10235276ffe3439093cdcc24aa62de1f80a1207814122682fa63bd02e184419ce386b08a9e94cf377e345695306c055936a1a38e934f5921b9909e173415bf15864ffeec146b3ff52493dd59ba376dd1d167e71f4406751f6ca1c0e844075264cf6a865a235ab6cbcd45e6ea879172d3bea233e1e41be0d79be5fa396233310e0b0c55e3b6f0344a3a52f0ccf11dc4b6e82c337f64c1702c0a78b0112e786a935e9b61d7bf9ec93daffbc93c8a019aa55a81b5fd5f33b3eb87c1538324f6c6d29325c7428ecfa2d1c54e204de9ceec4238ae270993424045690ef99cd855545078595fe24c98c11bf24199771ac1c183502103d695055b2c0cd1052d141bb40217ed3c7de62dbe4b9e892bbdcff4222a0c824b1538091377fe255c88412d095c5fc34ab70b77265d80092e88e9a943e282645231c8fe9cf7455d157759377975e3208e766c4292921fdc2137e475cdaf7c61929c52238b45800e322ca8fcf795301632db92b9509a98376f9fc05d3316df02e7a1efecc71826940babe9909b49271af157f6149c1a61036c2eed723bce56a69f843942902c599755de1dc8fc8bf25627679f7bfdbad7357b982188a06a051411b3bbead85bb62c82c86a079b4e7f0d986dfb1294c2353893950496bb806380f24be5e12c2d2a2e3eb618756170c048f3a39a6775baa65c67597deea7c6ba0175e8d42fee21308e7b7c0a4dff3bc26c7b292b514649b97f45b37579b465b27335973f867f468e3aa30e9fb85c4bfecf767324dd60e27d599e44de7b7926675376897cf42fa4884619fcdc3b89495a9064a5c11cd5b8bffea50863738601dc45887ead684f99e2d456346e55be6efc18a4b665c356bb334de56374f4536108609e600b975f18ccc16f012df946dd5ee1b337728115a04b9cbdd81246c1b765cb1ac3ed60677956e7feb4c1a4389bf1def9579d34501e68fcb3c1e58353651b01c fips203-0.2.1/tests/cctv_vectors/ML-KEM/unluckysample/go.mod000064400000000000000000000002401046102023000216000ustar 00000000000000module c2sp.org/CCTV/ML-KEM/unluckysample go 1.21.5 require golang.org/x/crypto v0.16.0 require golang.org/x/sys v0.15.0 // indirect fips203-0.2.1/tests/cctv_vectors/ML-KEM/unluckysample/go.sum000064400000000000000000000004701046102023000216320ustar 00000000000000golang.org/x/crypto v0.16.0 h1:mMMrFzRSCF0GvB7Ne27XVtVAaXLrPmgPC7/v0tkwHaY= golang.org/x/crypto v0.16.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4= golang.org/x/sys v0.15.0 h1:h48lPFYpsTvQJZF4EKyI4aLHaev3CxivZmv7yZig9pc= golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= fips203-0.2.1/tests/cctv_vectors/ML-KEM/unluckysample/unluckysample.go000064400000000000000000000024371046102023000237270ustar 00000000000000package main import ( "encoding/binary" "fmt" "log" rand "math/rand" "net/http" _ "net/http/pprof" "golang.org/x/crypto/sha3" ) func main() { go func() { log.Println(http.ListenAndServe("localhost:6060", nil)) }() var max int d := make([]byte, 32) for { rand.Read(d) samples := sampleNTT(d) if samples > max { max = samples // 518aa157193090c8bb464f8f645ed3ea4e0bbfe6cda70f86f9768782321f1f2d: 380 samples // 851cf0ee43b802c538e5b4ee4d1991a28af90eeb87fe34d54095332821e65730: 381 samples // 8c7238e1965ddd73b1114b897e1bf4b308c0d9cc710d0482ab8b9e737405354a: 384 samples fmt.Printf("%x: %d samples\n", d, samples) } } } const ( n = 256 q = 3329 ) func sampleNTT(d []byte) int { G := sha3.Sum512(d) rho := G[:32] B := sha3.NewShake128() B.Write(rho) B.Write([]byte{0, 0}) var samples int var j int var buf [24]byte // buffered reads from B off := len(buf) // index into buf, starts in a "buffer fully consumed" state for { if off >= len(buf) { B.Read(buf[:]) off = 0 } d1 := binary.LittleEndian.Uint16(buf[off:]) & 0b1111_1111_1111 d2 := binary.LittleEndian.Uint16(buf[off+1:]) >> 4 off += 3 samples++ if d1 < q { j++ } if j == n { break } samples++ if d2 < q { j++ } if j == n { break } } return samples } fips203-0.2.1/tests/cctv_vectors/mod.rs000064400000000000000000000224221046102023000160070ustar 00000000000000use std::fs; use std::io::Read; use flate2::read::GzDecoder; use hex::decode; use regex::Regex; use fips203::traits::{Decaps, Encaps, KeyGen, SerDes}; use fips203::{ml_kem_1024, ml_kem_512, ml_kem_768}; use super::TestRng; // Note: test vectors are directly copied across from https://github.com/C2SP/CCTV/tree/fd8cecee5f7746d0c6b8c3f4530c8976d629cbfa // This approach may improve in future.. // More work to do here // 1. Simplify/refactor code (trait objects?) // 2. Implement accumulator loop referenced by https://github.com/C2SP/CCTV/tree/main/ML-KEM#accumulated-pq-crystals-vectors // 3. Utilize any/all vectors available across the web #[allow(clippy::type_complexity)] fn get_intermediate_vec( filename: &str, ) -> (Vec, Vec, Vec, Vec, Vec, Vec, Vec) { let data = fs::read_to_string(filename).expect("Unable to read file"); let z_regex = Regex::new(r"z = ([0-9a-fA-F]+)").unwrap(); let z = decode(z_regex.captures(&data).unwrap().get(1).unwrap().as_str()).unwrap(); let d_regex = Regex::new(r"d = ([0-9a-fA-F]+)").unwrap(); let d = decode(d_regex.captures(&data).unwrap().get(1).unwrap().as_str()).unwrap(); let ek_regex = Regex::new(r"ek = ([0-9a-fA-F]+)").unwrap(); let ek_exp = decode(ek_regex.captures(&data).unwrap().get(1).unwrap().as_str()).unwrap(); let dk_regex = Regex::new(r"dk = ([0-9a-fA-F]+)").unwrap(); let dk_exp = decode(dk_regex.captures(&data).unwrap().get(1).unwrap().as_str()).unwrap(); let m_regex = Regex::new(r"m = ([0-9a-fA-F]+)").unwrap(); let m = decode(m_regex.captures(&data).unwrap().get(1).unwrap().as_str()).unwrap(); let k_regex = Regex::new(r"K = ([0-9a-fA-F]+)").unwrap(); let k_exp = decode(k_regex.captures(&data).unwrap().get(1).unwrap().as_str()).unwrap(); let c_regex = Regex::new(r"c = ([0-9a-fA-F]+)").unwrap(); let c_exp = decode(c_regex.captures(&data).unwrap().get(1).unwrap().as_str()).unwrap(); (d, z, ek_exp, dk_exp, m, k_exp, c_exp) } #[test] pub fn test_intermediate_512() { let (d, z, ek_exp, dk_exp, m, k_exp, c_exp) = get_intermediate_vec("./tests/cctv_vectors/ML-KEM/intermediate/ML-KEM-512.txt"); let mut rnd = TestRng::new(); rnd.push(&m); rnd.push(&d); rnd.push(&z); let (ek_act, dk_act) = ml_kem_512::KG::try_keygen_with_rng(&mut rnd).unwrap(); assert_eq!(ek_exp, ek_act.clone().into_bytes()); assert_eq!(dk_exp, dk_act.clone().into_bytes()); let (k1_act, c_act) = ek_act.try_encaps_with_rng(&mut rnd).unwrap(); assert_eq!(k_exp, k1_act.clone().into_bytes()); assert_eq!(c_exp, c_act.clone().into_bytes()); let k2_act = dk_act.try_decaps(&c_act).unwrap(); assert_eq!(k1_act, k2_act); } #[test] pub fn test_intermediate_768() { let (d, z, ek_exp, dk_exp, m, k_exp, c_exp) = get_intermediate_vec("./tests/cctv_vectors/ML-KEM/intermediate/ML-KEM-768.txt"); let mut rnd = TestRng::new(); rnd.push(&m); rnd.push(&d); rnd.push(&z); let (ek_act, dk_act) = ml_kem_768::KG::try_keygen_with_rng(&mut rnd).unwrap(); assert_eq!(ek_exp, ek_act.clone().into_bytes()); assert_eq!(dk_exp, dk_act.clone().into_bytes()); let (k1_act, c_act) = ek_act.try_encaps_with_rng(&mut rnd).unwrap(); assert_eq!(k_exp, k1_act.clone().into_bytes()); assert_eq!(c_exp, c_act.clone().into_bytes()); let k2_act = dk_act.try_decaps(&c_act).unwrap(); assert_eq!(k1_act, k2_act); } #[test] pub fn test_intermediate_1024() { let (d, z, ek_exp, dk_exp, m, k_exp, c_exp) = get_intermediate_vec("./tests/cctv_vectors/ML-KEM/intermediate/ML-KEM-1024.txt"); let mut rnd = TestRng::new(); rnd.push(&m); rnd.push(&d); rnd.push(&z); let (ek_act, dk_act) = ml_kem_1024::KG::try_keygen_with_rng(&mut rnd).unwrap(); assert_eq!(ek_exp, ek_act.clone().into_bytes()); assert_eq!(dk_exp, dk_act.clone().into_bytes()); let (k1_act, c_act) = ek_act.try_encaps_with_rng(&mut rnd).unwrap(); assert_eq!(k_exp, k1_act.clone().into_bytes()); assert_eq!(c_exp, c_act.clone().into_bytes()); let k2_act = dk_act.try_decaps(&c_act).unwrap(); assert_eq!(k1_act, k2_act); } fn get_strcmp_vec(filename: &str) -> (Vec, Vec, Vec) { let data = fs::read_to_string(filename).expect("Unable to read file"); let dk_regex = Regex::new(r"dk = ([0-9a-fA-F]+)").unwrap(); let dk_exp = decode(dk_regex.captures(&data).unwrap().get(1).unwrap().as_str()).unwrap(); let k_regex = Regex::new(r"K = ([0-9a-fA-F]+)").unwrap(); let k_exp = decode(k_regex.captures(&data).unwrap().get(1).unwrap().as_str()).unwrap(); let c_regex = Regex::new(r"c = ([0-9a-fA-F]+)").unwrap(); let c_exp = decode(c_regex.captures(&data).unwrap().get(1).unwrap().as_str()).unwrap(); (dk_exp, k_exp, c_exp) } #[test] pub fn test_strcmp_512() { let (dk_exp, k_exp, c_exp) = get_strcmp_vec("./tests/cctv_vectors/ML-KEM/strcmp/ML-KEM-512.txt"); let dk = ml_kem_512::DecapsKey::try_from_bytes(dk_exp.try_into().unwrap()).unwrap(); let c = ml_kem_512::CipherText::try_from_bytes(c_exp.try_into().unwrap()).unwrap(); let k_act = dk.try_decaps(&c).unwrap(); assert_eq!(k_exp, k_act.into_bytes()); } #[test] pub fn test_strcmp_768() { let (dk_exp, k_exp, c_exp) = get_strcmp_vec("./tests/cctv_vectors/ML-KEM/strcmp/ML-KEM-768.txt"); let dk = ml_kem_768::DecapsKey::try_from_bytes(dk_exp.try_into().unwrap()).unwrap(); let c = ml_kem_768::CipherText::try_from_bytes(c_exp.try_into().unwrap()).unwrap(); let k_act = dk.try_decaps(&c).unwrap(); assert_eq!(k_exp, k_act.into_bytes()); } #[test] pub fn test_strcmp_1024() { let (dk_exp, k_exp, c_exp) = get_strcmp_vec("./tests/cctv_vectors/ML-KEM/strcmp/ML-KEM-1024.txt"); let dk = ml_kem_1024::DecapsKey::try_from_bytes(dk_exp.try_into().unwrap()).unwrap(); let c = ml_kem_1024::CipherText::try_from_bytes(c_exp.try_into().unwrap()).unwrap(); let k_act = dk.try_decaps(&c).unwrap(); assert_eq!(k_exp, k_act.into_bytes()); } #[test] pub fn test_unlucky_512() { let (d, z, ek_exp, dk_exp, m, k_exp, c_exp) = get_intermediate_vec("./tests/cctv_vectors/ML-KEM/unluckysample/ML-KEM-512.txt"); let mut rnd = TestRng::new(); rnd.push(&m); rnd.push(&d); rnd.push(&z); let (ek_act, dk_act) = ml_kem_512::KG::try_keygen_with_rng(&mut rnd).unwrap(); assert_eq!(ek_exp, ek_act.clone().into_bytes()); assert_eq!(dk_exp, dk_act.clone().into_bytes()); let (k1_act, c_act) = ek_act.try_encaps_with_rng(&mut rnd).unwrap(); assert_eq!(k_exp, k1_act.clone().into_bytes()); assert_eq!(c_exp, c_act.clone().into_bytes()); let k2_act = dk_act.try_decaps(&c_act).unwrap(); assert_eq!(k1_act, k2_act); } #[test] pub fn test_unlucky_768() { let (d, z, ek_exp, dk_exp, m, k_exp, c_exp) = get_intermediate_vec("./tests/cctv_vectors/ML-KEM/unluckysample/ML-KEM-768.txt"); let mut rnd = TestRng::new(); rnd.push(&m); rnd.push(&d); rnd.push(&z); let (ek_act, dk_act) = ml_kem_768::KG::try_keygen_with_rng(&mut rnd).unwrap(); assert_eq!(ek_exp, ek_act.clone().into_bytes()); assert_eq!(dk_exp, dk_act.clone().into_bytes()); let (k1_act, c_act) = ek_act.try_encaps_with_rng(&mut rnd).unwrap(); assert_eq!(k_exp, k1_act.clone().into_bytes()); assert_eq!(c_exp, c_act.clone().into_bytes()); let k2_act = dk_act.try_decaps(&c_act).unwrap(); assert_eq!(k1_act, k2_act); } #[test] pub fn test_unlucky_1024() { let (d, z, ek_exp, dk_exp, m, k_exp, c_exp) = get_intermediate_vec("./tests/cctv_vectors/ML-KEM/unluckysample/ML-KEM-1024.txt"); let mut rnd = TestRng::new(); rnd.push(&m); rnd.push(&d); rnd.push(&z); let (ek_act, dk_act) = ml_kem_1024::KG::try_keygen_with_rng(&mut rnd).unwrap(); assert_eq!(ek_exp, ek_act.clone().into_bytes()); assert_eq!(dk_exp, dk_act.clone().into_bytes()); let (k1_act, c_act) = ek_act.try_encaps_with_rng(&mut rnd).unwrap(); assert_eq!(k_exp, k1_act.clone().into_bytes()); assert_eq!(c_exp, c_act.clone().into_bytes()); let k2_act = dk_act.try_decaps(&c_act).unwrap(); assert_eq!(k1_act, k2_act); } #[test] fn test_modulus_512() { let gz = fs::read("./tests/cctv_vectors/ML-KEM/modulus/ML-KEM-512.txt.gz").unwrap(); let mut d = GzDecoder::new(&gz[..]); let mut s = String::new(); d.read_to_string(&mut s).unwrap(); for line in s.lines() { let ek_bytes = decode(line).unwrap(); let ek = ml_kem_512::EncapsKey::try_from_bytes(ek_bytes.try_into().unwrap()); assert!(ek.is_err()) } } #[test] fn test_modulus_768() { let gz = fs::read("./tests/cctv_vectors/ML-KEM/modulus/ML-KEM-768.txt.gz").unwrap(); let mut d = GzDecoder::new(&gz[..]); let mut s = String::new(); d.read_to_string(&mut s).unwrap(); for line in s.lines() { let ek_bytes = decode(line).unwrap(); let ek = ml_kem_768::EncapsKey::try_from_bytes(ek_bytes.try_into().unwrap()); assert!(ek.is_err()) } } #[test] fn test_modulus_1024() { let gz = fs::read("./tests/cctv_vectors/ML-KEM/modulus/ML-KEM-1024.txt.gz").unwrap(); let mut d = GzDecoder::new(&gz[..]); let mut s = String::new(); d.read_to_string(&mut s).unwrap(); for line in s.lines() { let ek_bytes = decode(line).unwrap(); let ek = ml_kem_1024::EncapsKey::try_from_bytes(ek_bytes.try_into().unwrap()); assert!(ek.is_err()) } } fips203-0.2.1/tests/fails.rs000064400000000000000000000030331046102023000136170ustar 00000000000000use fips203::ml_kem_512; use fips203::traits::{KeyGen, SerDes}; use rand_chacha::rand_core::SeedableRng; use rand_core::RngCore; // Highlights potential validation opportunities #[test] fn fails_512() { let mut rng = rand_chacha::ChaCha8Rng::seed_from_u64(123); for _i in 0..100 { let mut bad_ek_bytes = [0u8; ml_kem_512::EK_LEN]; rng.fill_bytes(&mut bad_ek_bytes); let bad_ek = ml_kem_512::EncapsKey::try_from_bytes(bad_ek_bytes); assert!(bad_ek.is_err()); let mut bad_ct_bytes = [0u8; ml_kem_512::CT_LEN]; rng.fill_bytes(&mut bad_ct_bytes); let _bad_ct = ml_kem_512::CipherText::try_from_bytes(bad_ct_bytes); // Note: FIPS 203 validation per page 31 only puts size constraints on the ciphertext. // A Result is used to allow for future expansion of validation... // assert!(bad_ct.is_err()); let mut bad_dk_bytes = [0u8; ml_kem_512::DK_LEN]; rng.fill_bytes(&mut bad_dk_bytes); let bad_dk = ml_kem_512::DecapsKey::try_from_bytes(bad_dk_bytes); // Note: FIPS 203 validation per page 31 only puts size constraints on the decaps key. // A Result is used to allow for future expansion of validation... assert!(bad_dk.is_err()); // We can validate the non-correspondence of these serialized keypair assert!(!ml_kem_512::KG::validate_keypair_vartime(&bad_ek_bytes, &bad_dk_bytes)); // let bad_ssk_bytes = bad_dk.unwrap().try_decaps(&bad_ct.unwrap()); // assert!(bad_ssk_bytes.is_err()); } } fips203-0.2.1/tests/integration.rs000064400000000000000000000132151046102023000150470ustar 00000000000000use fips203::traits::{Decaps, Encaps, KeyGen, SerDes}; use fips203::{ml_kem_1024, ml_kem_512, ml_kem_768}; use rand_chacha::rand_core::SeedableRng; #[test] fn test_expected_flow_512() { let mut rng = rand_chacha::ChaCha8Rng::seed_from_u64(123); for _i in 0..100 { // Alice runs KeyGen, and serializes ek for Bob (to bytes) let (alice_ek, alice_dk) = ml_kem_512::KG::try_keygen_with_rng(&mut rng).unwrap(); let alice_ek_bytes = alice_ek.into_bytes(); // Alice sends ek bytes to Bob let bob_ek_bytes = alice_ek_bytes; // Bob deserializes ek bytes, runs Encaps, to get ssk and serializes ct for Alice (to bytes) let bob_ek = ml_kem_512::EncapsKey::try_from_bytes(bob_ek_bytes).unwrap(); let (bob_ssk_bytes, bob_ct) = bob_ek.try_encaps_with_rng(&mut rng).unwrap(); let bob_ct_bytes = bob_ct.into_bytes(); // Bob sends ct bytes to Alice let alice_ct_bytes = bob_ct_bytes; // Alice deserializes runs Decaps let alice_ct = ml_kem_512::CipherText::try_from_bytes(alice_ct_bytes).unwrap(); let alice_ssk_bytes = alice_dk.try_decaps(&alice_ct).unwrap(); // Alice and Bob now have the same shared secret key assert_eq!(bob_ssk_bytes, alice_ssk_bytes); // Double check the correspondence of the serialized keypair (we already have alice_ek) let alice_dk_bytes = alice_dk.into_bytes(); assert!(ml_kem_512::KG::validate_keypair_vartime(&alice_ek_bytes, &alice_dk_bytes)); } } #[test] fn test_expected_flow_768() { let mut rng = rand_chacha::ChaCha8Rng::seed_from_u64(456); for _i in 0..100 { // Alice runs KeyGen, and serializes ek for Bob (to bytes) let (alice_ek, alice_dk) = ml_kem_768::KG::try_keygen_with_rng(&mut rng).unwrap(); let alice_ek_bytes = alice_ek.into_bytes(); // Alice sends ek bytes to Bob let bob_ek_bytes = alice_ek_bytes; // Bob deserializes ek bytes, runs Encaps, to get ssk and serializes ct for Alice (to bytes) let bob_ek = ml_kem_768::EncapsKey::try_from_bytes(bob_ek_bytes).unwrap(); let (bob_ssk_bytes, bob_ct) = bob_ek.try_encaps_with_rng(&mut rng).unwrap(); let bob_ct_bytes = bob_ct.into_bytes(); // Bob sends ct bytes to Alice let alice_ct_bytes = bob_ct_bytes; // Alice deserializes runs Decaps let alice_ct = ml_kem_768::CipherText::try_from_bytes(alice_ct_bytes).unwrap(); let alice_ssk_bytes = alice_dk.try_decaps(&alice_ct).unwrap(); // Alice and Bob now have the same shared secret key assert_eq!(bob_ssk_bytes, alice_ssk_bytes); // Double check the correspondence of the serialized keypair (we already have alice_ek) let alice_dk_bytes = alice_dk.into_bytes(); assert!(ml_kem_768::KG::validate_keypair_vartime(&alice_ek_bytes, &alice_dk_bytes)); } } #[test] fn test_expected_flow_1024() { let mut rng = rand_chacha::ChaCha8Rng::seed_from_u64(789); for _i in 0..100 { // Alice runs KeyGen, and serializes ek for Bob (to bytes) let (alice_ek, alice_dk) = ml_kem_1024::KG::try_keygen_with_rng(&mut rng).unwrap(); let alice_ek_bytes = alice_ek.into_bytes(); // Alice sends ek bytes to Bob let bob_ek_bytes = alice_ek_bytes; // Bob deserializes ek bytes, runs Encaps, to get ssk and serializes ct for Alice (to bytes) let bob_ek = ml_kem_1024::EncapsKey::try_from_bytes(bob_ek_bytes).unwrap(); let (bob_ssk_bytes, bob_ct) = bob_ek.try_encaps_with_rng(&mut rng).unwrap(); let bob_ct_bytes = bob_ct.into_bytes(); // Bob sends ct bytes to Alice let alice_ct_bytes = bob_ct_bytes; // Alice deserializes runs Decaps let alice_ct = ml_kem_1024::CipherText::try_from_bytes(alice_ct_bytes).unwrap(); let alice_ssk_bytes = alice_dk.try_decaps(&alice_ct).unwrap(); // Alice and Bob now have the same shared secret key assert_eq!(bob_ssk_bytes, alice_ssk_bytes); // Double check the correspondence of the serialized keypair (we already have alice_ek) let alice_dk_bytes = alice_dk.into_bytes(); assert!(ml_kem_1024::KG::validate_keypair_vartime(&alice_ek_bytes, &alice_dk_bytes)); } } // $ cargo test -- --ignored #[ignore] #[test] fn test_forever() { let mut rng = rand_chacha::ChaCha8Rng::seed_from_u64(123); for i in 0..u64::MAX { // Alice runs KeyGen, and serializes ek for Bob (to bytes) let (alice_ek, alice_dk) = ml_kem_512::KG::try_keygen_with_rng(&mut rng).unwrap(); let alice_ek_bytes = alice_ek.into_bytes(); // Alice sends ek bytes to Bob let bob_ek_bytes = alice_ek_bytes; // Bob deserializes ek bytes, runs Encaps, to get ssk and serializes ct for Alice (to bytes) let bob_ek = ml_kem_512::EncapsKey::try_from_bytes(bob_ek_bytes).unwrap(); let (bob_ssk_bytes, bob_ct) = bob_ek.try_encaps_with_rng(&mut rng).unwrap(); let bob_ct_bytes = bob_ct.into_bytes(); // Bob sends ct bytes to Alice let alice_ct_bytes = bob_ct_bytes; // Alice deserializes runs Decaps let alice_ct = ml_kem_512::CipherText::try_from_bytes(alice_ct_bytes).unwrap(); let alice_ssk_bytes = alice_dk.try_decaps(&alice_ct).unwrap(); // Alice and Bob now have the same shared secret key assert_eq!(bob_ssk_bytes, alice_ssk_bytes, "shared secret failed on iteration {}", i); // Double check the correspondence of the serialized keypair (we already have alice_ek) let alice_dk_bytes = alice_dk.into_bytes(); assert!(ml_kem_512::KG::validate_keypair_vartime(&alice_ek_bytes, &alice_dk_bytes)); } } fips203-0.2.1/tests/native.rs000064400000000000000000000200211046102023000140030ustar 00000000000000use fips203::ml_kem_512; use fips203::traits::{Decaps, Encaps, KeyGen, SerDes}; use hex_literal::hex; use rand_core::SeedableRng; #[test] fn wasm_match() { let seed = 123; // Note: this should match the value giving in the web form let mut rng = rand_chacha::ChaCha8Rng::seed_from_u64(seed); // Alice runs KeyGen, and serializes ek for Bob (to bytes) let (alice_ek, alice_dk) = ml_kem_512::KG::try_keygen_with_rng(&mut rng).unwrap(); let alice_ek_bytes = alice_ek.into_bytes(); // Alice sends ek bytes to Bob let bob_ek_bytes = alice_ek_bytes; // Bob deserializes ek bytes, runs Encaps, to get ssk and serializes ct for Alice (to bytes) let bob_ek = ml_kem_512::EncapsKey::try_from_bytes(bob_ek_bytes).unwrap(); let (bob_ssk, bob_ct) = bob_ek.try_encaps_with_rng(&mut rng).unwrap(); let bob_ct_bytes = bob_ct.into_bytes(); // Bob sends ct bytes to Alice let alice_ct_bytes = bob_ct_bytes; // Alice deserializes runs Decaps let alice_ct = ml_kem_512::CipherText::try_from_bytes(alice_ct_bytes).unwrap(); let alice_ssk = alice_dk.try_decaps(&alice_ct).unwrap(); // Alice and Bob now have the same shared secret key assert_eq!(bob_ssk, alice_ssk); // Double check the correspondence of the serialized keypair (we already have alice_ek) let alice_dk_bytes = alice_dk.into_bytes(); assert!(ml_kem_512::KG::validate_keypair_vartime(&alice_ek_bytes, &alice_dk_bytes)); assert_eq!(bob_ek_bytes, hex!("5193763f122ed6da1fec7390b4b838dc1720741247e19a51be568cd6042fa9300f93217e14c0917be1317b8276e1e5ccbf3038c2222384ac7d736010e9051122649a8dfba4808c2a29a73d6db9adc070b35874125a205c5de33a75a271c638a16db850bd98c3e616aa513995f5f864cd792fc7b7929285049643afde6274b0c529e82a606789513ed98400ec2635a8bfa4507d4faa9d6dc169c3815a6951b9a7796e74c2ca0d0450dc3094ced76a70b8c3011c77cfa20d9d563622884aee656929f9280a77acbc70258aca1d3132c026043d60ea85dff44477c81e5c5689412236f7c87f76a7b656081e4f0c3cdbca5204152a00fb2508bac5e3f3aba9529f97c882d21283808977846b1b4cb6ae431589ac061a21316a88bb3889039ff434c3ca2887f299814d549d6e7007019a2924e692875489cf69a3a4817bf2157549053f2b284324860ef04bbc1faa7645358465c8019a38a87c91147e76bb7697653850392bb77c662071f5b80170f267de59b3a488bf41176f17b43f1943b81df45e8e377329da01a12c36d0c48a06b18606f9cdd2c25fb9ba68b506a19ca913535ac1c2733d42615ce37217daf865aaec1a4d6a8fc5918ac799acaa2b7a4e0ba50d18935a5ccae362a47afc74ce0b39a9d66a5773018c52a0aeda6e3f82bec470551d1ac0abd7124900631e8ba44232b4176219e386cd57f3b9a2278c9886155d11c9c6055a40a91366e26ab747180b76a230eb65e32ca5dec3c198366b8a06204be6b5357a78c8347123000b89701af98082d2823ac8177c3cb1acc64bc4ba0065f136ce8b92663e202c58085931b88323d41a5e6590bd67c1f3390a2bc460b005a04f85541928c5f7b2482c522c610b9a12646660c8c795b55284c0ae4aeb266af8691e6a360112967d1b5f4bfa24612831c15cadfcdc0b97138a80fa1f9361ab0774853276a9701732949b829264584d3aa2b1fb4f00219f1d0b8c3a3347a8a5015a93aac9586c937a287f3a8235dc27861a94aea8beded8cf6cd418865bac2e0a86b0475cac5382a245cb976271db74aba65425b5d31b1d7645e00a790f5a7d9baa91c518e85bfb04c6ff8a102d6a4afb159777b7f3ce754861b693f6998cb1"), "ek does not match"); assert_eq!(bob_ct_bytes, hex!("92455fbb204e41647129e71c35e9a7dd72e8e4138d6f2e4285a8652ae33fc653f0bfafb27440968af24134a586dc15b516d0dfe2aea14db6df01218f6eb5672e39503506f4b2916cf87c55edb1536b6b7646cf0bd69651cdcb643cb220bde16d9ab37a2b2295a295f306ac4e79403dbf394c56278f77fbf27e3ff00a02753e64d3cc1fe3c0f2dc2454f79475dc167a14764c84c121180708cf034a1dac4cf3da3f55c363cd8025f26c51e85531d8da08fdb578837892391e7b027126f1e2eff9a937043bf387f01f4a4b70a9ace6f45f3c794925df503a3119b19db1bd372b2954edec2ff4eee81f189dd9424c2d867b4186e586e960f597e178ec5e006f53d54aa10841ee4911f1e2acd4c88cbc3d42f0ccf36d07c689d3f3df0a5c649b74d74b035862aae8176756919ba8c3eee699c2942d1af5820733a433ecb3ea094123881b9b819fa4f9f0eadd86b10c2635d9725fab4038e4eef835f78b37f8ecc55475296a3413189265a108b8c99c8f5ce8d7af3c6f06bd4f1b6ff3b6ace389f9c5961c446f32424eca4d214cdea2bcfdcb53e81be8f3b2f12326652dbfbbad073e5acb75702f717e6420b354de539dca9f86decd6d86bf79f05ee68c2edd363668391fd9e6d526cf400f7e89d4e0fa150f8258d21508876795f855788f3ee02e775003a225fedcf940bba8f0bd8cb41e0141f208cb601be981b8abed26f1ff9b5db9a30271fd8f64d0ede4044d23fba9163ed05ee4e8ce2010067037cbde67e9c58e4b6f48e2b4c3da274092a05c0850405e15b6a2f40ca7b6f52780c3e61d4eebc16ff82d5c1ab0f166e62bf0860688550458878bda1efbdcf76d492dd45cc189e89c17d82a8b2bd8510ba45c3e41e609d39c79e6bb3766069987d8cb7b61556abadb1a33805a6d2be7fab7f6023fb5c9d62870bb6dcf7067899f47ce91ebd06b5f51c2dcdda6dd765b2ed8d8d0f0941a0025dd8b0b1bf2a7ec902d010dc00d2e0429ef24b98cb109182a0b5e7ad140448ed8413820bdfd684f08ba8d7c61b1e13c5381f2e4d654c106d91ea5adb2c0e850ac19e055ff472abfcfd0d71a0ac827"), "ct does not match"); assert_eq!(alice_dk_bytes, hex!("a9c8cb9349bf9197157f1c6013c6cede329b97960de4ca295d4c747ccc0814caa47bd17b153ab349409b5f22a695d0c1593a22f0a019ed144e1d07aa1f9a9f00d04582190baf92ca78f32d7d30a9fe6bbc39f50025b697979252141a06892a3da5fb33370bacc58b4ca1475dbe8c40275557f615b970d4274e751df9e88eba20208958b758a1b8329a2d264b38f0fa18ce6ab2e50ab2f97532e709624d5b507d1a96c46435b8a4cfab674580563a57d682bfa42cff866d91075cb8799852d8c631046b34584e44e859f643c345ea7bd580179f164429943f89746d9113295a6c924e0bb973f43ad891aad7448fb329b212b2ccb1551b49922d8e883f7c3b364aa211cc595e0ebcad3cba0e82200579d4aec914bb866c6b0eccbb8f1533118291686697cb7060d11ab34a87709840acf56054863c7917abc81318ba83ca2d9bb10fe4ba69ff8a1604772918f4b0aa420cb5d074f42215b57458b9bb50b5988e72870495145399684dcb064bae6587bc4089d62a728a2904ddd4746ca6991c70587100aba3512e3e119c0721b9b10c8f1f750ba064cb8d931f5c3397f78aa5c9ac8f2cd0105db1678d535b77d5554c29c3a075bd08590c2b879b82c260b92341423a0523a012eb223ed6950cea6960a2dc8bac19b726c55492781c3ce12f331899533c50d0926020567163cbcbcf4b0956896e38041acd75baa55916df5cc73788b02f0832369ac271c2b0a0aa6adde3b141f6557ba51bfea018a1833766eb51f96b7a835852f27762f778b1c6f19d4122529bb63ed7c354b915398b93231fc75544f4169813853d9aa33dc46f3fa47139b232423a25b57557f4650e287c659e835d3dbc153ae19acee246861b4c01b2bfc4e61c31db8d2ef721e5b7aa3fb9466e3bb0e18995902ca023ab1fa87283bea92c07a3b5ed2c15f63a4986c4972716be26b2944c945cc4a17282a592f6bb3a683825b4b37ca4f12855383a6cc8bc2f8b01b84ca9a9509ee5113a13eba649da6db74510e1389d1009d0c1c9ada6da875adc6e58a187d01027880a2032839d8b82171b1b660ac129d6c24983dcab9f7b9c5193763f122ed6da1fec7390b4b838dc1720741247e19a51be568cd6042fa9300f93217e14c0917be1317b8276e1e5ccbf3038c2222384ac7d736010e9051122649a8dfba4808c2a29a73d6db9adc070b35874125a205c5de33a75a271c638a16db850bd98c3e616aa513995f5f864cd792fc7b7929285049643afde6274b0c529e82a606789513ed98400ec2635a8bfa4507d4faa9d6dc169c3815a6951b9a7796e74c2ca0d0450dc3094ced76a70b8c3011c77cfa20d9d563622884aee656929f9280a77acbc70258aca1d3132c026043d60ea85dff44477c81e5c5689412236f7c87f76a7b656081e4f0c3cdbca5204152a00fb2508bac5e3f3aba9529f97c882d21283808977846b1b4cb6ae431589ac061a21316a88bb3889039ff434c3ca2887f299814d549d6e7007019a2924e692875489cf69a3a4817bf2157549053f2b284324860ef04bbc1faa7645358465c8019a38a87c91147e76bb7697653850392bb77c662071f5b80170f267de59b3a488bf41176f17b43f1943b81df45e8e377329da01a12c36d0c48a06b18606f9cdd2c25fb9ba68b506a19ca913535ac1c2733d42615ce37217daf865aaec1a4d6a8fc5918ac799acaa2b7a4e0ba50d18935a5ccae362a47afc74ce0b39a9d66a5773018c52a0aeda6e3f82bec470551d1ac0abd7124900631e8ba44232b4176219e386cd57f3b9a2278c9886155d11c9c6055a40a91366e26ab747180b76a230eb65e32ca5dec3c198366b8a06204be6b5357a78c8347123000b89701af98082d2823ac8177c3cb1acc64bc4ba0065f136ce8b92663e202c58085931b88323d41a5e6590bd67c1f3390a2bc460b005a04f85541928c5f7b2482c522c610b9a12646660c8c795b55284c0ae4aeb266af8691e6a360112967d1b5f4bfa24612831c15cadfcdc0b97138a80fa1f9361ab0774853276a9701732949b829264584d3aa2b1fb4f00219f1d0b8c3a3347a8a5015a93aac9586c937a287f3a8235dc27861a94aea8beded8cf6cd418865bac2e0a86b0475cac5382a245cb976271db74aba65425b5d31b1d7645e00a790f5a7d9baa91c518e85bfb04c6ff8a102d6a4afb159777b7f3ce754861b693f6998cb1a3db817ead911696225814c0cd4aaf1fec38a56f7ff848d6522ab6f02f9e747f932b30e756257dda01d47dd4a1b0e62abb8fa01f222ad8554ed821a89f82cbbb"), "dk does not match"); assert_eq!( alice_ssk.into_bytes(), hex!("ae36ee54c1a7362316d47e8d7b867d1adf25470064034b8410b4ac4c2ab01de0"), "ssk does not match" ); } fips203-0.2.1/tests/nist_vectors/Decapsulation -- ML-KEM-1024.txt000064400000000000000000003160361046102023000217240ustar 00000000000000Decapsulation -- ML-KEM-1024 dk: 0FEA26C4A544A514444A971B5C5A825827C09D42469E59344CF2AC06A28D33E9A012CAA3717B2C3B290A0715821109C4CCEAC49F341DADD377D42A37261916AC7BB9E41C096CA8181CF58350573F605684A1BCA53D88257453C535165C4ED72A9FF05645712901F66C10D04F5EB4A2EC3772E9498E9DC44BBDAB71BBDBBCFC85B801363089EA60EFE586E1E2180C38B2E7B4A63ED607490BC5BA7A58AC3B1C0E43967200C7980290EBF411828439EE8C8E6129B258E13D127CB15A00CB7B468D4023B5097B9B2E509B50E890B63B4707487961A29E18656DD2D09E6A3B8843E2843CB4854F18116E717DDB0355A75135B2026A752C8E7FF18E0F4A391CA37F5B2BCC88C999B4E47750C46547EC076AC21530722CFAF9679961C98688C3562B17CC808146A12572C9B5FF151AAB54410901840E26423987C5E0D28EF2EA53EAE5951E62AC7BD518B9830A4DBCCE6A936591EA8EF275078A0973852A4D130495D00B3F21851599901CFDF9368344C810422FFEA08AEDCB1A7FD3625F26B034812FA307AB2C20945465546D31A341A4013D8189B4F50FE860A668DAC7B103441E961FCEB0C5B1F34DF2E598C6D8CF60B864150C703D2BBEAC9B001AA2108147AE6B8AAE2C7791DBE956C1F9B2047A1576094387064C3A801B0D89C996A5CFA3B012C14438B9F3530C0C5FA9389F10FB3EF1E2013338415F7B1DB411ADF91C73B6456B68AB7CFC7BC929E44E58EB34CA10AE31F03B2C3BA6CCA27EB35CB1379A130AAC87E3B875CFE253AF03C4BD783F18C5A2F8492BBF7C56875598B1B63FE6CB0694D0480CA1C8F8867C11B8BF33A32C20B79F9CA486858610B19783BEF784BF6B0F858C1A791130DA6957F212234EC98679814BE839BF110B45C1C883ECDC3DB3F822A4F7C125566ED1663568C8413CD01C22467AD5201A0ADC763435A2CB05CDC47072A94370F5B434F75C078B415993E854DDE17BBF86C0C6C9A3248532D9C2139EF3C75A9BC693781060DCAE2FFA58D9CC548F19C1CE5364880C7FB50CC7BE405312D6CC94037618F388C490AF8F61B9B4044CF75A5CD71A15853B5FD6224C6B9590E58501D2814200C919F283CC2B49AD8BFA5BAAA2977F03823F609EFB2426F936C30287097BD6B7BDC67862858883DB5954080429B9CD02CA96BC1CCBDB5121DFF805B0824AEE999E2BBB2D82353E6D3A300792781058C56EF7098AB3584EA0621E20337D3A975D93CF32586D6A71A2C4BBB202B853FF09C407B43B1C19B1C4CCB821482DDD27378177AA7F6178497C3FBA797153848C5D0B1F40B54E9D5193904A303F725F0CCC66C6CCB158850605346DB42B877DD9CEA5F69C12B221C7EC5100F76587B9834BC0C641538F83E85BB3090DBAFBCB0B7118FF7C97E95263157041F8AC4052D0403500CC4F689455974CEB5B076790A050E0B3F6772A7767541FF6B67B2A1D5407820647688F360A2B01473767712909B227658BE6457848C440757168061888589CB05A999E55496791B11AF2066BB8CA746051C4680A0BC07382412AB8B8A319DBC794DDC694BFDB813F80B58B72218DD64DFCDBA1AB48A94F7A8DCA9266CD15A42D9BA5FB6767A955526C050DE2598B112A2B103AA2D1F0606FE68A55191EF53B302F7C1922C301CEEA989A62134090A86076776FA44627B7316386576A678175B218E6F482B52BC6027BBEB34698B9802FD67634C1A94DD4C5CD49EC6E2D665F727781D1EC10AAF66AD8279B9BF24C99E875EC94352D9605FA30CB3D8B2686B03971A760B3053B34346D0D71B44D8B7D2EA61A5C10A933D38BA48336711174546147D44B2914F85689D9C1BF0037C7F7377CD930CFF60F84B0A2005D3EFE55C7311B1B6132768B5290D836B82BC443C32B4FEC960219DB2132F7990AD684A3729F3D1A2CEA3A1FE4B12675C489EF33198F01A106806EFCE8921DC46E971C0A0A564AF9E56CA727A7641C568C95AA5956910B288429F80EE7226E9DC4067E34944F06926D44B2CF8764F713593B4429F82B8FCC607798916B815B9098330EC334290DB8C04B083DF3CA10CE3575073028E994A25BE72878492FE1B696BA5CB1A773193A3B28A4F440AE582DC7C24FE7451D6676232BB961C5040C9E5201AAF3CD4DE40AD5A9578AF52810B593E9815E23F63F564061A48407213AA1B0908F4B174F86D573FA04386498BE68398E8D720D278111D8B17303602A96E35F56FB25173C4F4A03CA2AC9BF79DCAB764BCE4410401E1013E6528CCC5113358577DA8375E02343108C2924D2551E5CC5A1B04DEF88324D854FC92C4ADF7C2301337E4520BFC365566F66092E367AE60612744653C1EB47F0820951A2A14C425909340D8727188EAA08E48678984876D0008DAE99015B3663FDCB725741530BC3895B11620CE3B417A320E18813B99C235AC06F55600F983882BFF00236107B5042545B6B775868AEFB79B595596902C69B9ECA3D358C61FEE036D218AC43BA3F52C06A8F881A7ED70386142CBAC5CC04FCC31E16277651CE2DCC5014F6BA5A915C1338834EF474B6715913BC7A4E593C688766ADD70698B37E06E53915F385388C25C4265E1CB44FE3D019D121AE4C32434F37B0A4CB69C7CC95707350C3493D0FB11CD4D09F29DC56C07BC8EB0BD0082B41442145663C21AB433467B95EC2478423C18BF2EC703EFBA28CDABD42B7B833150D6DA25EB00A8328902E2D089B55D69AAD9A94D818264C54B04D614D147A30ABFC03D9929D96BA7F81865DA353C454BA7AA7881AB974C1B8F0831E79C4418664E953A54DE93213697281341D37F508E8CBAE3D8185054567DEFC8E3BBCAA4247907C483B8F1B84B324C1A7CA8442DB6B7B128C8313BE1FE25791209B864A3E1A618D56D710D6F3BF559510167C464C6B9B8BC490B8E03925D03D0EEB5D78179428BB80D3FB148840709C41147A686FC9BCBDCDF7C7EA7C30FB640FF05B7539ABAB70892908E93CC9C347F8AC889E56468A135B99754738E15F4E677DF375BF1B43606A2C47380B10A0C14C28583C83311A2854B2A9931FD66086C10749F334577FD70B51B95060075199319B3F7CB5B237302C370A23175E4E013C56281BAFE2BE9F825A3066AB8BBA5793E21E7A48978CF60C091B1F80C0C23814A30F7760601ACEABB1215200940FFA152272096D458D00DD039F236B2727B588C62204E79C451681DFE410EEC42B74945AEC0313A391942AE1B122174DBE59AB1E390CD64941436C75A9323C69A641880870FBB280B3B37B3BD982B82955620B0783B82E8961A4043BC7F66C0EF25A5ED15326F8816E5EA4167EE8BF6666451D315B2C751441172C278300268261C78C6F0C46562779B3A1196F87835F79FCB7E0CBA15336CC83E156C5022887A80986B49C1B576594A23142624ABF524822418C6101905262806572494D3753C06281E7F17E0D796CD7767FDCE901FE1712A00A3D36EB423E29868846932A9431B8CA660FC1975E23A75B4A51DE1069D3A59F6EEB2A5CE72A8916B5E863476E6AC572929F2C29BC5627BA994163CED35AB7031C00490724555ACDE613AEB4C3E99981C62B5DC6A9B35BA79220243689E0594996857C045D67193D9E411B4FF39D0F8C3C0A70ADB72A7021E36D64FB294D932B24E1A2BC0BC41C4AA3B5EC3CF0E672DE140F484733FD82BF082934B540A635C44898E8AB8E0645705AA581718B4132C427927FAE75BF9616A5424C2020EBC5CFC1BC0ED1653AE5005A1754181620B7F06D716313033BB72A40647ADB2E667370F2C74FDB94420DA48DD1379DBA59AA22F857E231C5C083290066C548761BDF385F2F85817B212066D39F03B77F8EF41219E4BFB9C12E4FC98800571D223AA92A32C7A3C2A7CF9C995AE0A7B59391FE9A4F0D633BFB798C34B72BBA6A9F16C4132E88B570758BD551C91BD2ADEB53A72AC6AA03689DD64B035709A8AF468543CB1736DBC9C72B529E70596D18B19CA68E617A147C189D283A77688CAF94DA5A0E9B63181A40BBE7BD4168A24D274319A993BCEA8ABF505FE862129692B5BDE849F36AC92F7171E53859313604EAC10BE2786FF385B9C718154818772FA7B899C04EFD18A8019A79B6F64D5B9A2C55E784CB47CA294856689AA6A70CC27B6C20D4D1C729C409D0B925C40C30C0777815077749488B8DF0390695ABDB048C7CE1853602A54D153CF2A51617847B11E63C4C761966D5AD93350DBADA4A15C124BD808871993FC775B6E410C386590F730A8EC9475EEE915039E91B6FE425B90668C6AC5258B7AF103B9F5E230B719BBB09871DC1621517BA2A839C96AAA6440A875EAC90B298D61BD3F3AC89B405DB394232686A2BE0F3C75F15E64E61F070791EB4BB97B7019825F117C7D73A12FD3DCC22D581B0E41B786374A461EA0D88DAA89B659F0DC82443423515B633B005C958EC26561B6DB818F4B8CB2E28990E748417587FEC38A1284BBB4FF9E478 c: 61FF1A8B6117EF118328E88B3227993014DCD075B8A1A7F9801893EEE6405BB960B6B7F6A1A27518A3409139A48B859681CC758F2BCC3EEFB04394A375A5CD71316490938ABFD194B20BCD31B3980261C9ED69BF9B1D7D7659A8040DB1E25D2BA6F703486624B73CACDCA27DB0F7E2408C9448E38873280F5E9950D7CCE252A647580C19904FAD62AEC300BC8E38F05948B63BAD5CE7C90E40C4BC65117761F5F8868F8025D6CEB2C5DF60DE38C3232922087EFCF2CD95DE5E87B6888B88C86CC78315585B2CC688A71B477BFA388DC2334DFA8AA95503D5397E2AE0352903EA6A0AE8B649A914B3525FE58F564BF19CC09F54E105D19BD81054E57001F70BBDD7719449687E9A53B16CA5366A19105A8BA08589AD08DF1300EF4F923BA9E762A82FB09B76E125F2F274D617BF30EAB465ECF24D3707AD300D9AFC1CF1DC40EE7D4EEA6D150E6F0A31DB9F8F92BA8EEEB35D7445589B046BA79EFE231106CF0A75712AB392724C53EFF9F5733BEE0D6A44D0B6F515D0F5E40B1B1E17E67AED3C81D00AC468A28F8453D4B0DA809E57D823F28D61ED0B59A08C622972D99179DA8636C45F1CE8F6252AC86D91B5E92997014E3F5089E68BC52CED5DAE6D5B175FE2D61928465059724C835902D7612CDB69CDAC664FC1C9CB11203A8C7B71486E97B7D1BC6A98F493DCBEC8E629558ED361091293D1B5D2096CEB9FC7AFEE71DB7CCFE482B68A196429FF04D15903E7A75C7BB5F622C36971694559FF07DFAA79E41C362B22643CD39BD9E1D3D6C2A306B5F1102C266EEE67DCDACF36697A836F203838EC110308C90A3D01570CB3668ABA50340E40F54CFA6A9E8862532F5F19848AA11FD34FC86B7FCB1637F4E5A1D03AFCE44124E4E460B84C63496ADED55801DF2517A90AB061C8E63AB6B14BE1694D6F389DD85F5639C5783AFCA0146E6A1EB0C40563C137010DB60BBC3D6374D6F3A892DEBC064701C64BECCB8E2C33B740CC7ED49D108A8C4656818DF5F7D91EAAA446AC6CCDE30C6D3D1BF66E4E3B7B6B81E3CB17227F80DB0096E6BE7D859C09713749FCA21530FE1A716EBE325504319BD0EA2A7D7713607CB679B0A0B2268D493B67C0481872177FFD2593F3ACF691CEE99A36ECA722579EFAA59ACC59EF8CEA9108E620B06056C19D3C1EB91E8634DE4957706DFA8F9D0A9E0CD4094F6B95A83F118A513EBFE5E99AEB88A268E0097FCC3C7AE250B681933BBC2A8F5381F94D156434A87E9EE37E78C27A0CDAEEA9814BCB43DF538DBE628C802C1A94E0CDDCD0CD5A0F8220DA97C2383936A33919FCDC11D70ED4437DD2D7C73CD0C3BB90CA7070228FE8D64A1C9D56E6B34830EF300B5AA6EC6C78A5425AE6F7AD0EFDD527CF0AF8E09B56E495BE66F665C64B0A42C5C4B24680480AD2E5C11D991F7E3DA759AEC802F176DDF11EF71469DC13B3A3E03699519858AC6FC65C27FA4CEFDA09C82E8F958E018DD5255CA2F628E0DA7391ABED6D37705528AB22EC71DC8836D7FD4645944703A51CC74D297092FCE139E8976F8BE9C5F86390B74D401A8C8153112201133D0C517C6CE7A38C086069CE3971F1AD28F3E5D01B56A480B417A016AEA46394CDF764812918D8AB0501D5D18CE13FBD3DE91F504215CCD0E2D17B7E963C867F6F132114E36459FC5AF7CEE99B789673E524131F7DC71360951A997A9CE50DD5FAFC4521144441C06BB41C79E8ED53285D137D54F325A6C2F2EF74E34C0F877A614CE45DC0AEDDF95A0E2E4EDAE29AF411C9CC2AF95C9EA9A94A7961C8246E654FA28F3D568D5FEE93352C2E0D60CCAF5B00090AB6E7A53AA06A8CD3737EBF1B65D625BCF220F74DE22D9871EFC376BF082D4B872A303C32427A0C98BECF58959C9F9E2E887DBC42AAB1656AD15637A6A8F4BF9634095491F8C99242913891437E6C5B50A213DDE80D2196BE12C3937FE3239BF6759ABB8C1C9466F42FBD53894AE52FB533321429FCE4FEC1DB352C49583A7D817EAF62000888ECB0EBFFEF69FF8E590CFA25BEAB21605B635ABC2CA23680789725CF700F553C88352F31616154873D18B6C6EB519FC639B070FD67F86AAB62349DBFFA89F93051A7C7B7BD161FCD73672CEEF59A9BB7F571EABE2570C5BF31ECAA1F9CA7A9C6D31EA5FB7C979CDD2613897E7D1503FB0C19ADDCFB3A63E2185FC4101838DA66CCE2D3D9FFB47746C2003EDD86C2F8C3 dk_pke: 0FEA26C4A544A514444A971B5C5A825827C09D42469E59344CF2AC06A28D33E9A012CAA3717B2C3B290A0715821109C4CCEAC49F341DADD377D42A37261916AC7BB9E41C096CA8181CF58350573F605684A1BCA53D88257453C535165C4ED72A9FF05645712901F66C10D04F5EB4A2EC3772E9498E9DC44BBDAB71BBDBBCFC85B801363089EA60EFE586E1E2180C38B2E7B4A63ED607490BC5BA7A58AC3B1C0E43967200C7980290EBF411828439EE8C8E6129B258E13D127CB15A00CB7B468D4023B5097B9B2E509B50E890B63B4707487961A29E18656DD2D09E6A3B8843E2843CB4854F18116E717DDB0355A75135B2026A752C8E7FF18E0F4A391CA37F5B2BCC88C999B4E47750C46547EC076AC21530722CFAF9679961C98688C3562B17CC808146A12572C9B5FF151AAB54410901840E26423987C5E0D28EF2EA53EAE5951E62AC7BD518B9830A4DBCCE6A936591EA8EF275078A0973852A4D130495D00B3F21851599901CFDF9368344C810422FFEA08AEDCB1A7FD3625F26B034812FA307AB2C20945465546D31A341A4013D8189B4F50FE860A668DAC7B103441E961FCEB0C5B1F34DF2E598C6D8CF60B864150C703D2BBEAC9B001AA2108147AE6B8AAE2C7791DBE956C1F9B2047A1576094387064C3A801B0D89C996A5CFA3B012C14438B9F3530C0C5FA9389F10FB3EF1E2013338415F7B1DB411ADF91C73B6456B68AB7CFC7BC929E44E58EB34CA10AE31F03B2C3BA6CCA27EB35CB1379A130AAC87E3B875CFE253AF03C4BD783F18C5A2F8492BBF7C56875598B1B63FE6CB0694D0480CA1C8F8867C11B8BF33A32C20B79F9CA486858610B19783BEF784BF6B0F858C1A791130DA6957F212234EC98679814BE839BF110B45C1C883ECDC3DB3F822A4F7C125566ED1663568C8413CD01C22467AD5201A0ADC763435A2CB05CDC47072A94370F5B434F75C078B415993E854DDE17BBF86C0C6C9A3248532D9C2139EF3C75A9BC693781060DCAE2FFA58D9CC548F19C1CE5364880C7FB50CC7BE405312D6CC94037618F388C490AF8F61B9B4044CF75A5CD71A15853B5FD6224C6B9590E58501D2814200C919F283CC2B49AD8BFA5BAAA2977F03823F609EFB2426F936C30287097BD6B7BDC67862858883DB5954080429B9CD02CA96BC1CCBDB5121DFF805B0824AEE999E2BBB2D82353E6D3A300792781058C56EF7098AB3584EA0621E20337D3A975D93CF32586D6A71A2C4BBB202B853FF09C407B43B1C19B1C4CCB821482DDD27378177AA7F6178497C3FBA797153848C5D0B1F40B54E9D5193904A303F725F0CCC66C6CCB158850605346DB42B877DD9CEA5F69C12B221C7EC5100F76587B9834BC0C641538F83E85BB3090DBAFBCB0B7118FF7C97E95263157041F8AC4052D0403500CC4F689455974CEB5B076790A050E0B3F6772A7767541FF6B67B2A1D5407820647688F360A2B01473767712909B227658BE6457848C440757168061888589CB05A999E55496791B11AF2066BB8CA746051C4680A0BC07382412AB8B8A319DBC794DDC694BFDB813F80B58B72218DD64DFCDBA1AB48A94F7A8DCA9266CD15A42D9BA5FB6767A955526C050DE2598B112A2B103AA2D1F0606FE68A55191EF53B302F7C1922C301CEEA989A62134090A86076776FA44627B7316386576A678175B218E6F482B52BC6027BBEB34698B9802FD67634C1A94DD4C5CD49EC6E2D665F727781D1EC10AAF66AD8279B9BF24C99E875EC94352D9605FA30CB3D8B2686B03971A760B3053B34346D0D71B44D8B7D2EA61A5C10A933D38BA48336711174546147D44B2914F85689D9C1BF0037C7F7377CD930CFF60F84B0A2005D3EFE55C7311B1B6132768B5290D836B82BC443C32B4FEC960219DB2132F7990AD684A3729F3D1A2CEA3A1FE4B12675C489EF33198F01A106806EFCE8921DC46E971C0A0A564AF9E56CA727A7641C568C95AA5956910B288429F80EE7226E9DC4067E34944F06926D44B2CF8764F713593B4429F82B8FCC607798916B815B9098330EC334290DB8C04B083DF3CA10CE3575073028E994A25BE72878492FE1B696BA5CB1A773193A3B28A4F440AE582DC7C24FE7451D6676232BB961C5040C9E5201AAF3CD4DE40AD5A9578AF52810B593E9815E23F63F564061 ek_pke: A48407213AA1B0908F4B174F86D573FA04386498BE68398E8D720D278111D8B17303602A96E35F56FB25173C4F4A03CA2AC9BF79DCAB764BCE4410401E1013E6528CCC5113358577DA8375E02343108C2924D2551E5CC5A1B04DEF88324D854FC92C4ADF7C2301337E4520BFC365566F66092E367AE60612744653C1EB47F0820951A2A14C425909340D8727188EAA08E48678984876D0008DAE99015B3663FDCB725741530BC3895B11620CE3B417A320E18813B99C235AC06F55600F983882BFF00236107B5042545B6B775868AEFB79B595596902C69B9ECA3D358C61FEE036D218AC43BA3F52C06A8F881A7ED70386142CBAC5CC04FCC31E16277651CE2DCC5014F6BA5A915C1338834EF474B6715913BC7A4E593C688766ADD70698B37E06E53915F385388C25C4265E1CB44FE3D019D121AE4C32434F37B0A4CB69C7CC95707350C3493D0FB11CD4D09F29DC56C07BC8EB0BD0082B41442145663C21AB433467B95EC2478423C18BF2EC703EFBA28CDABD42B7B833150D6DA25EB00A8328902E2D089B55D69AAD9A94D818264C54B04D614D147A30ABFC03D9929D96BA7F81865DA353C454BA7AA7881AB974C1B8F0831E79C4418664E953A54DE93213697281341D37F508E8CBAE3D8185054567DEFC8E3BBCAA4247907C483B8F1B84B324C1A7CA8442DB6B7B128C8313BE1FE25791209B864A3E1A618D56D710D6F3BF559510167C464C6B9B8BC490B8E03925D03D0EEB5D78179428BB80D3FB148840709C41147A686FC9BCBDCDF7C7EA7C30FB640FF05B7539ABAB70892908E93CC9C347F8AC889E56468A135B99754738E15F4E677DF375BF1B43606A2C47380B10A0C14C28583C83311A2854B2A9931FD66086C10749F334577FD70B51B95060075199319B3F7CB5B237302C370A23175E4E013C56281BAFE2BE9F825A3066AB8BBA5793E21E7A48978CF60C091B1F80C0C23814A30F7760601ACEABB1215200940FFA152272096D458D00DD039F236B2727B588C62204E79C451681DFE410EEC42B74945AEC0313A391942AE1B122174DBE59AB1E390CD64941436C75A9323C69A641880870FBB280B3B37B3BD982B82955620B0783B82E8961A4043BC7F66C0EF25A5ED15326F8816E5EA4167EE8BF6666451D315B2C751441172C278300268261C78C6F0C46562779B3A1196F87835F79FCB7E0CBA15336CC83E156C5022887A80986B49C1B576594A23142624ABF524822418C6101905262806572494D3753C06281E7F17E0D796CD7767FDCE901FE1712A00A3D36EB423E29868846932A9431B8CA660FC1975E23A75B4A51DE1069D3A59F6EEB2A5CE72A8916B5E863476E6AC572929F2C29BC5627BA994163CED35AB7031C00490724555ACDE613AEB4C3E99981C62B5DC6A9B35BA79220243689E0594996857C045D67193D9E411B4FF39D0F8C3C0A70ADB72A7021E36D64FB294D932B24E1A2BC0BC41C4AA3B5EC3CF0E672DE140F484733FD82BF082934B540A635C44898E8AB8E0645705AA581718B4132C427927FAE75BF9616A5424C2020EBC5CFC1BC0ED1653AE5005A1754181620B7F06D716313033BB72A40647ADB2E667370F2C74FDB94420DA48DD1379DBA59AA22F857E231C5C083290066C548761BDF385F2F85817B212066D39F03B77F8EF41219E4BFB9C12E4FC98800571D223AA92A32C7A3C2A7CF9C995AE0A7B59391FE9A4F0D633BFB798C34B72BBA6A9F16C4132E88B570758BD551C91BD2ADEB53A72AC6AA03689DD64B035709A8AF468543CB1736DBC9C72B529E70596D18B19CA68E617A147C189D283A77688CAF94DA5A0E9B63181A40BBE7BD4168A24D274319A993BCEA8ABF505FE862129692B5BDE849F36AC92F7171E53859313604EAC10BE2786FF385B9C718154818772FA7B899C04EFD18A8019A79B6F64D5B9A2C55E784CB47CA294856689AA6A70CC27B6C20D4D1C729C409D0B925C40C30C0777815077749488B8DF0390695ABDB048C7CE1853602A54D153CF2A51617847B11E63C4C761966D5AD93350DBADA4A15C124BD808871993FC775B6E410C386590F730A8EC9475EEE915039E91B6FE425B90668C6AC5258B7AF103B9F5E230B719BBB09871DC1621517BA2A839C96AAA6440A875EAC90B298D61BD3F3AC89B405DB394232686A2BE0F3C75F15E64E61F070791EB4BB97B7019825F117C7D73A12 h: FD3DCC22D581B0E41B786374A461EA0D88DAA89B659F0DC82443423515B633B0 z: 05C958EC26561B6DB818F4B8CB2E28990E748417587FEC38A1284BBB4FF9E478 c1: 61FF1A8B6117EF118328E88B3227993014DCD075B8A1A7F9801893EEE6405BB960B6B7F6A1A27518A3409139A48B859681CC758F2BCC3EEFB04394A375A5CD71316490938ABFD194B20BCD31B3980261C9ED69BF9B1D7D7659A8040DB1E25D2BA6F703486624B73CACDCA27DB0F7E2408C9448E38873280F5E9950D7CCE252A647580C19904FAD62AEC300BC8E38F05948B63BAD5CE7C90E40C4BC65117761F5F8868F8025D6CEB2C5DF60DE38C3232922087EFCF2CD95DE5E87B6888B88C86CC78315585B2CC688A71B477BFA388DC2334DFA8AA95503D5397E2AE0352903EA6A0AE8B649A914B3525FE58F564BF19CC09F54E105D19BD81054E57001F70BBDD7719449687E9A53B16CA5366A19105A8BA08589AD08DF1300EF4F923BA9E762A82FB09B76E125F2F274D617BF30EAB465ECF24D3707AD300D9AFC1CF1DC40EE7D4EEA6D150E6F0A31DB9F8F92BA8EEEB35D7445589B046BA79EFE231106CF0A75712AB392724C53EFF9F5733BEE0D6A44D0B6F515D0F5E40B1B1E17E67AED3C81D00AC468A28F8453D4B0DA809E57D823F28D61ED0B59A08C622972D99179DA8636C45F1CE8F6252AC86D91B5E92997014E3F5089E68BC52CED5DAE6D5B175FE2D61928465059724C835902D7612CDB69CDAC664FC1C9CB11203A8C7B71486E97B7D1BC6A98F493DCBEC8E629558ED361091293D1B5D2096CEB9FC7AFEE71DB7CCFE482B68A196429FF04D15903E7A75C7BB5F622C36971694559FF07DFAA79E41C362B22643CD39BD9E1D3D6C2A306B5F1102C266EEE67DCDACF36697A836F203838EC110308C90A3D01570CB3668ABA50340E40F54CFA6A9E8862532F5F19848AA11FD34FC86B7FCB1637F4E5A1D03AFCE44124E4E460B84C63496ADED55801DF2517A90AB061C8E63AB6B14BE1694D6F389DD85F5639C5783AFCA0146E6A1EB0C40563C137010DB60BBC3D6374D6F3A892DEBC064701C64BECCB8E2C33B740CC7ED49D108A8C4656818DF5F7D91EAAA446AC6CCDE30C6D3D1BF66E4E3B7B6B81E3CB17227F80DB0096E6BE7D859C09713749FCA21530FE1A716EBE325504319BD0EA2A7D7713607CB679B0A0B2268D493B67C0481872177FFD2593F3ACF691CEE99A36ECA722579EFAA59ACC59EF8CEA9108E620B06056C19D3C1EB91E8634DE4957706DFA8F9D0A9E0CD4094F6B95A83F118A513EBFE5E99AEB88A268E0097FCC3C7AE250B681933BBC2A8F5381F94D156434A87E9EE37E78C27A0CDAEEA9814BCB43DF538DBE628C802C1A94E0CDDCD0CD5A0F8220DA97C2383936A33919FCDC11D70ED4437DD2D7C73CD0C3BB90CA7070228FE8D64A1C9D56E6B34830EF300B5AA6EC6C78A5425AE6F7AD0EFDD527CF0AF8E09B56E495BE66F665C64B0A42C5C4B24680480AD2E5C11D991F7E3DA759AEC802F176DDF11EF71469DC13B3A3E03699519858AC6FC65C27FA4CEFDA09C82E8F958E018DD5255CA2F628E0DA7391ABED6D37705528AB22EC71DC8836D7FD4645944703A51CC74D297092FCE139E8976F8BE9C5F86390B74D401A8C8153112201133D0C517C6CE7A38C086069CE3971F1AD28F3E5D01B56A480B417A016AEA46394CDF764812918D8AB0501D5D18CE13FBD3DE91F504215CCD0E2D17B7E963C867F6F132114E36459FC5AF7CEE99B789673E524131F7DC71360951A997A9CE50DD5FAFC4521144441C06BB41C79E8ED53285D137D54F325A6C2F2EF74E34C0F877A614CE45DC0AEDDF95A0E2E4EDAE29AF411C9CC2AF95C9EA9A94A7961C8246E654FA28F3D568D5FEE93352C2E0D60CCAF5B00090AB6E7A53AA06A8CD3737EBF1B65D625BCF220F74DE22D9871EFC376BF082D4B872A303C32427A0C98BECF58959C9F9E2E887DBC42AAB1656AD15637A6A8F4BF9634095491F8C99242913891437E6C5B50A213DDE80D2196BE12C3937FE3239BF6759ABB8C1C9466F42FBD53894AE52FB533321429FCE4 c2: FEC1DB352C49583A7D817EAF62000888ECB0EBFFEF69FF8E590CFA25BEAB21605B635ABC2CA23680789725CF700F553C88352F31616154873D18B6C6EB519FC639B070FD67F86AAB62349DBFFA89F93051A7C7B7BD161FCD73672CEEF59A9BB7F571EABE2570C5BF31ECAA1F9CA7A9C6D31EA5FB7C979CDD2613897E7D1503FB0C19ADDCFB3A63E2185FC4101838DA66CCE2D3D9FFB47746C2003EDD86C2F8C3 u: [[3071, 1403, 2568, 1534, 2888, 2554, 884, 3019, 1058, 2038, 995, 871, 2394, 1510, 2544, 2102, 688, 50, 1824, 3032, 2676, 2706, 2637, 1257, 3209, 2845, 1052, 1172, 636, 530, 1795, 748, 1515, 288, 2643, 2601, 3062, 2962, 1265, 816, 388, 192, 2628, 1172, 974, 1500, 1814, 1302, 1482, 549, 2910, 1001, 1315, 870, 1851, 2329, 1079, 1717, 2973, 2064, 1648, 1338, 3028, 1539, 145, 242, 1749, 559, 2441, 1804, 2459, 50, 2614, 1892, 1190, 2546, 2409, 1361, 1715, 3220, 367, 637, 966, 683, 231, 375, 1577, 1222, 249, 1213, 1331, 600, 996, 232, 1284, 325, 3147, 2355, 640, 766, 20, 2276, 2554, 3123, 145, 2823, 2051, 2637, 2687, 2320, 5, 2552, 2386, 904, 2438, 1118, 3145, 2934, 57, 488, 2845, 2641, 2949, 180, 2454, 2680, 390, 535, 55, 3227, 1640, 2901, 566, 2388, 766, 2373, 1469, 444, 1304, 1544, 98, 70, 2845, 575, 322, 2056, 1843, 2346, 3184, 1016, 265, 673, 957, 571, 2767, 692, 2211, 1851, 1091, 2915, 502, 164, 1521, 2167, 2705, 1426, 966, 268, 1123, 1629, 3155, 1364, 1959, 783, 63, 2077, 553, 306, 3023, 1790, 437, 1105, 1757, 18, 1650, 3175, 3066, 923, 1913, 2003, 2755, 1086, 1952, 1946, 354, 1959, 418, 2789, 55, 1738, 2303, 450, 3114, 15, 2887, 1923, 2867, 2199, 1208, 2100, 309, 2432, 3084, 1564, 1887, 3158, 2685, 1239, 1242, 2120, 1375, 330, 1968, 1013, 3002, 2341, 1980, 2090, 3240, 925, 3010, 842, 2467, 753, 3188, 1128, 366, 2025, 1772, 2849, 3171, 964, 1213, 3028, 1349, 304, 567, 1148, 1916, 2237, 1087, 3041, 935, 1720, 1562, 140], [606, 2207, 1164, 535, 1988, 2767, 2697, 3197, 1435, 2404, 89, 918, 2087, 1426, 2284, 2705, 2063, 618, 176, 1481, 2654, 1230, 3009, 1679, 1170, 210, 681, 3253, 117, 271, 1751, 2843, 2705, 1227, 3071, 444, 362, 1149, 1240, 1157, 1925, 1796, 268, 1965, 463, 2059, 712, 709, 3231, 1474, 1508, 1240, 1096, 1482, 1812, 2360, 795, 1204, 10, 3184, 2086, 2110, 1237, 2568, 2152, 1556, 2797, 2376, 606, 1973, 2380, 335, 2562, 845, 580, 2589, 85, 1955, 2393, 1271, 1320, 2177, 1335, 1388, 2064, 1460, 1226, 231, 884, 636, 2467, 1756, 2867, 2988, 1842, 2454, 172, 2736, 961, 3092, 1890, 1582, 2201, 1850, 759, 488, 1782, 327, 1400, 1517, 1252, 3061, 3171, 2484, 3215, 2380, 3246, 673, 301, 2373, 640, 1877, 1933, 1039, 2107, 2788, 728, 2183, 1398, 2781, 1603, 652, 2750, 1200, 562, 1161, 3327, 1612, 2775, 930, 751, 2672, 224, 1302, 1346, 1447, 3079, 806, 2258, 3129, 689, 2354, 392, 2292, 247, 3002, 2702, 2380, 1648, 712, 1003, 180, 725, 1691, 1461, 1599, 319, 104, 1159, 3175, 1671, 2567, 1326, 1998, 2760, 1048, 2581, 2, 1595, 2142, 2781, 514, 263, 1084, 2989, 1318, 858, 320, 822, 3183, 863, 1401, 1455, 1185, 358, 1239, 881, 2342, 2936, 2976, 1770, 1879, 1487, 1743, 1994, 1154, 1070, 2892, 346, 70, 3114, 1486, 1068, 34, 176, 2606, 1206, 2820, 2819, 268, 2754, 2747, 2541, 2043, 3264, 1162, 2037, 1824, 1520, 819, 2146, 1430, 2669, 2502, 2942, 627, 1700, 1013, 1352, 2367, 1682, 3210, 644, 1343, 3012, 2212, 3179, 2454, 2923, 65, 2952, 2557, 1973, 463, 1994, 2381], [1769, 3266, 3045, 127, 262, 2121, 2316, 1681, 2310, 2910, 1416, 2105, 953, 229, 1318, 2671, 2033, 2342, 2063, 1270, 2885, 2750, 2832, 1396, 1458, 618, 154, 3149, 11, 714, 2289, 2997, 2389, 284, 2682, 215, 1442, 237, 310, 281, 2575, 1403, 735, 3002, 1318, 276, 1770, 2017, 1170, 2232, 2477, 720, 2498, 2068, 2674, 2294, 1092, 2012, 2581, 2347, 2684, 624, 2526, 1482, 2950, 3197, 1910, 743, 1169, 1634, 1515, 3040, 2747, 2298, 1091, 1484, 788, 1647, 2771, 2659, 3058, 671, 3189, 1782, 2653, 106, 72, 1123, 2394, 3152, 1860, 3062, 158, 1835, 1026, 1135, 2263, 3038, 2599, 2207, 780, 41, 1022, 1027, 2255, 2110, 2077, 2094, 2120, 2698, 597, 3041, 1499, 463, 1057, 85, 257, 413, 2996, 1588, 367, 2825, 2507, 2407, 1565, 2635, 2033, 1681, 2485, 1107, 650, 1707, 3293, 3010, 3212, 1565, 1148, 649, 1417, 2066, 42, 2742, 393, 2903, 2216, 3253, 640, 114, 1157, 85, 60, 2677, 358, 718, 2255, 428, 845, 3205, 268, 738, 2589, 1830, 2038, 2516, 2417, 2554, 1543, 2757, 2190, 961, 3067, 2658, 2086, 3132, 1739, 2633, 182, 1791, 930, 1437, 1946, 923, 2352, 2994, 291, 2511, 1554, 2328, 2341, 540, 1344, 1565, 1100, 1365, 3162, 2905, 380, 1655, 814, 2693, 16, 1715, 1013, 902, 569, 2284, 2329, 1325, 1570, 535, 2094, 992, 1320, 229, 884, 133, 2422, 98, 1858, 3244, 3279, 2695, 2667, 2266, 1157, 2549, 2437, 387, 805, 803, 944, 2866, 1279, 1856, 1460, 1916, 2121, 494, 1284, 1452, 1986, 2046, 1625, 3183, 2363, 31, 1538, 1861, 2739, 80, 2581, 1213, 2396, 2191, 931, 2915], [1603, 907, 2780, 2897, 1440, 1196, 866, 2225, 1720, 2596, 1432, 1359, 2268, 2489, 548, 1928, 1364, 1925, 1850, 2866, 1073, 2029, 2971, 2937, 93, 1243, 2389, 1985, 1817, 3305, 1704, 2386, 125, 1365, 2575, 728, 450, 943, 1977, 793, 436, 3137, 2368, 811, 328, 28, 975, 2684, 509, 2572, 1130, 657, 2651, 3175, 2298, 2136, 1873, 1232, 1040, 2931, 953, 323, 1413, 3222, 579, 2159, 156, 2464, 146, 836, 1855, 1830, 3279, 3184, 2064, 3309, 2082, 1047, 1257, 2715, 783, 3111, 821, 2619, 161, 2911, 2020, 429, 1281, 1918, 580, 2285, 3103, 1504, 2903, 1567, 1492, 1947, 1903, 3136, 3253, 3144, 7, 1942, 458, 3048, 2680, 2890, 2211, 814, 623, 432, 1697, 65, 2915, 918, 746, 393, 1447, 1091, 2146, 1006, 813, 692, 987, 2204, 1951, 3119, 1437, 670, 1764, 2190, 2534, 247, 3110, 2500, 2363, 3009, 590, 2924, 2032, 2373, 2796, 3179, 444, 665, 1942, 2698, 788, 1383, 1109, 1577, 158, 1913, 2380, 3202, 891, 1299, 2313, 1837, 2651, 1035, 348, 2949, 341, 312, 1643, 1191, 416, 522, 2848, 1227, 1525, 2185, 1291, 2750, 2684, 3301, 1843, 1330, 983, 2276, 98, 3214, 957, 2386, 2653, 3212, 1765, 2882, 909, 585, 3035, 2211, 312, 465, 1721, 397, 2502, 2477, 336, 1110, 2682, 3041, 1211, 1274, 2963, 866, 692, 1960, 2355, 1417, 1439, 540, 2149, 2495, 1908, 478, 2211, 1782, 1923, 2141, 1795, 735, 1484, 3238, 2368, 73, 892, 896, 922, 180, 2550, 3254, 1785, 782, 3318, 3235, 2822, 3205, 1022, 3100, 914, 855, 2667, 3290, 3035, 1087, 1055, 1939, 1975, 770, 1305, 897, 2929, 2976]] v: [3121, 1560, 1665, 2393, 3017, 2705, 1665, 520, 936, 208, 2289, 2081, 1977, 3121, 520, 1665, 3121, 2809, 1144, 520, 624, 0, 0, 104, 832, 416, 2809, 104, 2809, 2185, 3225, 3225, 1560, 1560, 2705, 3121, 1560, 728, 624, 1144, 1248, 1665, 3121, 1144, 208, 3225, 1456, 2185, 104, 104, 2497, 2289, 2185, 1769, 936, 1144, 2913, 520, 1144, 416, 1040, 2809, 0, 1665, 2497, 2809, 520, 1144, 1873, 728, 312, 1456, 1560, 832, 2185, 2497, 312, 416, 2289, 624, 1560, 936, 1248, 208, 2289, 1665, 1769, 1040, 728, 1248, 1560, 1665, 104, 2809, 2705, 2497, 1144, 1560, 2081, 3121, 936, 312, 728, 728, 1665, 520, 2913, 2705, 3225, 1977, 104, 3225, 1040, 2809, 1040, 520, 624, 2705, 2081, 1977, 3225, 2185, 3121, 1977, 2497, 2913, 312, 624, 1769, 2705, 936, 1560, 2913, 2809, 2289, 2393, 2289, 2497, 728, 2705, 2913, 2601, 3017, 1248, 1248, 1769, 2809, 1144, 1560, 1352, 1456, 1977, 2393, 1352, 3017, 312, 728, 2185, 2809, 2393, 520, 104, 2913, 1040, 2913, 3225, 624, 624, 1248, 2393, 1040, 3225, 104, 1456, 3121, 2081, 936, 2185, 1769, 728, 1352, 1560, 2081, 2081, 2809, 728, 3225, 1456, 936, 1456, 2289, 2809, 624, 2601, 416, 1873, 832, 3225, 2185, 1560, 2185, 2497, 0, 2289, 1560, 624, 416, 312, 1352, 520, 2393, 2393, 1560, 3017, 1248, 1248, 208, 728, 624, 3121, 520, 208, 312, 208, 2497, 0, 1456, 2081, 1352, 1977, 1769, 2601, 208, 3225, 2081, 1977, 3017, 3225, 1977, 2289, 2393, 1977, 1769, 416, 1248, 0, 2497, 728, 3017, 2289, 104, 520, 1248, 2913, 1560, 2497] sHat: [[2575, 622, 1476, 1098, 1189, 1089, 1866, 441, 2652, 2085, 1880, 3074, 669, 1124, 2462, 837, 588, 2767, 518, 2266, 2355, 2574, 2578, 2620, 2929, 711, 2363, 162, 1287, 2081, 2321, 3136, 2764, 3150, 1183, 467, 941, 1917, 2772, 882, 2342, 353, 2988, 2967, 3300, 145, 2156, 394, 1308, 2111, 1872, 1013, 1632, 2117, 3233, 2651, 2109, 600, 884, 3157, 1589, 1473, 1870, 685, 159, 1391, 325, 663, 1537, 1743, 16, 1277, 1118, 2603, 2028, 1827, 2537, 2276, 1181, 1212, 3005, 1818, 3003, 3021, 1532, 2952, 1537, 771, 2697, 1550, 1519, 2158, 737, 398, 2060, 2851, 1255, 2667, 1598, 125, 2889, 3152, 2746, 1415, 2988, 451, 782, 2404, 114, 3184, 664, 2304, 1259, 287, 1154, 920, 3310, 2280, 2401, 2850, 344, 990, 3090, 2839, 90, 3248, 1659, 2260, 832, 2898, 2825, 2487, 46, 2485, 2128, 2318, 2998, 1139, 2055, 1940, 609, 2538, 1304, 1750, 210, 2541, 2922, 2179, 579, 2126, 1084, 2139, 2127, 273, 366, 2007, 987, 1360, 423, 853, 690, 1696, 3189, 2274, 383, 2287, 2575, 916, 796, 2042, 2907, 3266, 2440, 2460, 1204, 1918, 1104, 1628, 3143, 126, 618, 348, 560, 711, 2554, 1663, 409, 3222, 2182, 3128, 2902, 370, 204, 2072, 326, 602, 2418, 2908, 1535, 417, 1195, 1045, 265, 2112, 1550, 1058, 1849, 3160, 736, 2285, 2802, 1342, 1514, 2398, 542, 2758, 1403, 397, 953, 168, 3149, 3307, 874, 1625, 2705, 2286, 1522, 119, 2442, 1840, 2693, 1234, 1043, 2384, 3024, 1008, 1313, 344, 153, 457, 2557, 879, 1155, 3204, 528, 756, 254, 2218, 3053, 428, 895, 1581, 1631, 2818, 308, 760], [1955, 2736, 44, 2370, 1364, 1350, 365, 2611, 1089, 26, 317, 2200, 1460, 255, 232, 2662, 2664, 3197, 945, 1088, 1566, 505, 206, 3163, 945, 1247, 1522, 2446, 2246, 3325, 2144, 1611, 3093, 1792, 2877, 3042, 2988, 9, 538, 266, 1921, 2788, 2667, 2792, 1836, 2327, 2523, 1390, 2497, 2863, 2564, 343, 2422, 1072, 1671, 1216, 58, 440, 2317, 3224, 1430, 3322, 163, 299, 1217, 900, 953, 1343, 3084, 1520, 2217, 2547, 2832, 1007, 753, 30, 2099, 1043, 2911, 471, 436, 2769, 3321, 1841, 1462, 1716, 2920, 1994, 3068, 3223, 1065, 1262, 2904, 846, 202, 2785, 49, 959, 2860, 2659, 716, 2026, 3251, 2837, 2615, 313, 3082, 2170, 2275, 1883, 719, 1342, 943, 3136, 2237, 1015, 1304, 2604, 2552, 692, 3263, 1383, 1415, 2437, 1713, 1019, 3046, 108, 148, 1165, 268, 3210, 1784, 1992, 2065, 3067, 819, 714, 1824, 2555, 1180, 2154, 1669, 264, 1969, 2105, 1982, 2127, 3007, 246, 3205, 424, 377, 769, 2522, 1398, 754, 561, 2382, 2156, 377, 1208, 2536, 3059, 2833, 1104, 2241, 2108, 3308, 989, 2227, 559, 1956, 3103, 1573, 1765, 1745, 854, 2152, 1052, 60, 461, 1570, 1956, 213, 418, 3082, 1901, 1332, 2595, 1483, 3280, 196, 1831, 937, 1796, 1269, 843, 3319, 117, 395, 1428, 2195, 1358, 477, 1982, 1727, 3080, 2502, 2620, 1316, 808, 729, 316, 926, 3199, 2906, 3177, 2195, 263, 3168, 2797, 2607, 1423, 3289, 1356, 2447, 3089, 974, 1605, 3208, 2032, 3253, 3184, 190, 1332, 1554, 3277, 916, 1888, 792, 2191, 196, 2809, 399, 2966, 1204, 1216, 2807, 1477, 2775, 337, 2949, 1523, 726, 1218], [1387, 2313, 1509, 24, 466, 1064, 2304, 412, 1010, 3272, 2347, 2772, 2699, 1471, 682, 2426, 895, 2080, 63, 2534, 1275, 610, 1785, 3123, 1794, 152, 1659, 2941, 1725, 1932, 1378, 2184, 2947, 1437, 2132, 64, 2345, 3291, 2562, 2412, 3260, 3249, 475, 533, 2271, 95, 688, 1192, 2542, 2537, 2859, 731, 1410, 995, 2669, 771, 519, 1929, 2064, 3157, 1902, 159, 906, 1419, 78, 1578, 30, 818, 2685, 2419, 861, 3321, 2098, 1749, 362, 2599, 3012, 2859, 2050, 1339, 2559, 3136, 1031, 955, 2332, 2833, 3268, 2956, 2081, 724, 2013, 882, 1921, 2727, 383, 1926, 3145, 1015, 2490, 1815, 1107, 2248, 2909, 496, 1344, 1259, 413, 2357, 2704, 772, 575, 1527, 3084, 1644, 3270, 2844, 1368, 104, 1029, 1747, 2996, 2162, 2429, 3309, 1701, 2511, 530, 539, 3271, 1310, 1792, 1631, 2439, 2107, 75, 3180, 833, 2293, 2179, 1470, 2483, 208, 3002, 3263, 267, 391, 3327, 2423, 745, 1589, 21, 1047, 3320, 1034, 82, 1037, 53, 3264, 2127, 2374, 1877, 1225, 3051, 117, 103, 2569, 80, 2878, 2038, 679, 1911, 1350, 1567, 2927, 2683, 466, 1876, 2080, 1798, 1668, 1679, 163, 299, 1136, 1847, 1814, 2345, 2848, 1319, 2230, 1510, 1924, 1096, 1036, 373, 1671, 2054, 2177, 3160, 2825, 2394, 2537, 2389, 1652, 401, 427, 1778, 1712, 2744, 1868, 352, 3141, 2664, 176, 960, 2087, 2625, 2946, 952, 410, 2011, 2380, 1757, 2380, 3007, 2077, 63, 2904, 651, 535, 1677, 1245, 3068, 2589, 2219, 2708, 2639, 2263, 714, 1641, 1485, 2625, 2861, 2649, 2043, 1654, 1449, 1317, 1388, 208, 2530, 2229, 2577, 690, 2576, 2595], [209, 1551, 1647, 2222, 2389, 481, 3061, 771, 3119, 407, 802, 28, 2766, 2446, 666, 310, 64, 2697, 1632, 1911, 1135, 1130, 1831, 795, 1635, 1400, 1898, 2070, 629, 395, 1254, 2095, 2997, 3170, 2818, 3047, 1715, 2436, 185, 760, 1750, 839, 2497, 1242, 1492, 3292, 3145, 1774, 1581, 1526, 1906, 2071, 3281, 270, 1706, 1711, 2008, 2482, 667, 1231, 2201, 1886, 1260, 857, 1581, 89, 250, 3251, 2877, 616, 134, 923, 1905, 1546, 1459, 944, 1076, 1747, 269, 2887, 2893, 2008, 1582, 426, 92, 2705, 819, 2237, 932, 872, 369, 1857, 340, 1142, 3028, 660, 2068, 1391, 2441, 3101, 191, 880, 1991, 895, 2428, 781, 1743, 255, 132, 2603, 3328, 997, 1534, 3189, 2865, 433, 609, 1891, 651, 2309, 1752, 2947, 1067, 1084, 3011, 1266, 1772, 41, 2841, 541, 1842, 2463, 1546, 2125, 675, 2551, 2621, 705, 2794, 499, 484, 619, 1141, 2204, 1007, 403, 399, 2576, 6, 1768, 2300, 2350, 1053, 1772, 3223, 161, 1546, 1189, 1529, 1742, 1959, 2674, 3172, 1377, 1420, 2729, 1625, 2325, 2059, 2114, 2089, 239, 743, 1762, 1181, 108, 1150, 2371, 1615, 2336, 1133, 2852, 1999, 1608, 1015, 1425, 1083, 660, 3064, 2290, 204, 1910, 408, 1721, 2945, 2309, 920, 227, 1219, 659, 2061, 3083, 2123, 976, 2803, 268, 1486, 1875, 7, 643, 1257, 2601, 1883, 654, 2424, 756, 1761, 2411, 3258, 2837, 935, 407, 2874, 643, 1188, 1039, 2222, 725, 711, 1276, 1511, 468, 1638, 567, 2347, 1563, 1221, 192, 670, 21, 938, 3295, 1101, 174, 2517, 1402, 1418, 655, 1296, 2363, 489, 1512, 1571, 1023, 86, 1556]] w: [1740, 3246, 1647, 44, 19, 3261, 2, 20, 1595, 3296, 110, 1684, 48, 81, 1566, 1653, 30, 3215, 137, 1688, 1685, 3285, 1601, 3240, 3245, 4, 1683, 1611, 3292, 1659, 1736, 1630, 135, 1607, 1654, 51, 65, 1611, 47, 3, 3293, 1747, 1678, 2, 1817, 3266, 1618, 3283, 1701, 1574, 3287, 1667, 1758, 8, 14, 49, 1692, 3185, 1628, 1648, 3315, 1749, 1745, 26, 5, 3249, 3217, 1781, 1620, 1588, 48, 1654, 70, 33, 3304, 1692, 1762, 3292, 58, 3241, 76, 23, 1609, 14, 1617, 1629, 1721, 1696, 3260, 9, 3322, 1663, 1684, 1668, 3326, 1641, 1729, 1599, 75, 1573, 3275, 26, 1652, 1550, 3256, 1567, 1647, 1724, 3226, 1704, 3294, 3296, 85, 54, 3263, 1654, 3293, 1685, 3318, 3296, 1758, 3222, 3227, 1648, 1724, 3314, 39, 1734, 3270, 1729, 1655, 1702, 8, 3273, 3233, 35, 52, 3304, 1681, 43, 1637, 1701, 1738, 3257, 99, 3305, 1574, 3220, 3281, 3290, 80, 1631, 1657, 1674, 1692, 190, 1683, 3291, 25, 3289, 3248, 54, 3313, 1695, 1613, 3290, 1604, 3296, 1576, 1635, 1737, 1575, 1781, 1685, 1636, 142, 3237, 25, 1565, 1683, 3132, 1612, 1598, 1580, 51, 6, 3253, 1693, 1610, 1580, 3257, 134, 1643, 3205, 51, 21, 115, 1593, 3326, 1714, 42, 83, 3293, 1620, 23, 1648, 73, 3327, 1630, 1665, 56, 1717, 3286, 3198, 1563, 140, 1569, 1761, 3299, 1660, 1652, 1661, 82, 1654, 1770, 1606, 1676, 1541, 3272, 107, 1671, 3284, 1622, 18, 3324, 1639, 1723, 1613, 1653, 1725, 3297, 15, 1673, 3253, 3306, 1647, 1668, 1595, 3305, 47, 0, 1574, 1587, 1692, 1761, 3278] mPrime: 05C958EC26561B6DB818F4B8CB2E28990E748417587FEC38A1284BBB4FF9E478 KPrime: C61F73D2BFB18594E1BA5D3B58B4C934206D3A6F8EC91395AB7779C61FA1DD6F rPrime: 6DC410C18448882046E2162045D93FE36D6F9C6B27F2A04E04050E9985617B1D tHat: [[1188, 120, 2593, 2579, 176, 2297, 1867, 1265, 1414, 1853, 1274, 896, 2148, 3049, 2408, 2275, 653, 215, 295, 280, 472, 1851, 3, 678, 918, 1534, 2902, 607, 3095, 1267, 842, 3232, 2346, 3068, 3193, 2749, 2934, 3300, 68, 1025, 30, 305, 742, 2245, 460, 309, 1333, 1912, 986, 1880, 992, 1074, 3088, 664, 548, 1373, 3102, 3157, 161, 1243, 2287, 808, 1357, 1272, 3273, 1186, 3295, 567, 769, 2019, 69, 3058, 1475, 1382, 1647, 150, 1582, 1955, 1766, 288, 1652, 1332, 3009, 1150, 752, 152, 593, 2586, 588, 1428, 1033, 211, 1927, 386, 2702, 138, 1764, 1928, 2200, 1892, 208, 2256, 2478, 25, 1627, 1587, 3069, 1836, 343, 1332, 779, 2204, 347, 1569, 780, 2894, 791, 522, 2273, 312, 3257, 569, 90, 1788, 85, 246, 2200, 2083, 191, 47, 54, 1969, 592, 1348, 2907, 1910, 2136, 2790, 2555, 2903, 2453, 1685, 1538, 2492, 2718, 988, 3125, 1560, 254, 878, 2258, 2753, 2627, 1019, 82, 1708, 2191, 424, 1918, 61, 1158, 705, 1466, 3276, 3076, 3135, 1566, 625, 374, 3301, 3117, 1292, 1556, 2991, 346, 1481, 2067, 2099, 1102, 1871, 438, 1431, 3091, 1963, 2382, 965, 1896, 1640, 1965, 109, 920, 2027, 1286, 926, 789, 2143, 3128, 600, 1732, 1506, 1052, 1275, 227, 413, 465, 2786, 588, 1075, 1871, 2819, 2980, 1692, 3271, 2396, 880, 1287, 2499, 980, 271, 459, 212, 2557, 3113, 1389, 3008, 3207, 3051, 3328, 2824, 1042, 324, 1106, 3174, 531, 939, 836, 2407, 1515, 1986, 2116, 291, 2236, 3314, 1806, 2878, 2607, 2700, 3037, 1858, 2955, 1331, 209, 621, 1514, 2736, 2096], [40, 745, 2093, 2480, 1621, 2477, 2733, 2377, 2264, 609, 1100, 2821, 333, 1238, 2580, 775, 3243, 63, 729, 2521, 2710, 2043, 1665, 1496, 931, 3141, 2644, 1963, 2215, 424, 1209, 3095, 184, 2111, 2334, 3143, 1601, 1608, 1001, 2645, 2381, 814, 2323, 1830, 1153, 467, 1335, 143, 3048, 2796, 317, 2136, 1285, 1652, 3294, 2287, 3131, 2731, 1858, 2308, 2172, 948, 2959, 2113, 1203, 3090, 2727, 2124, 2882, 1725, 635, 2241, 899, 3041, 543, 1406, 145, 2482, 2694, 996, 282, 2262, 1878, 269, 982, 3071, 1365, 265, 3094, 1127, 2892, 2486, 1163, 2316, 184, 926, 37, 989, 2830, 1502, 1912, 2369, 2856, 2059, 3027, 335, 136, 1796, 412, 324, 2170, 1782, 3273, 3035, 1997, 3199, 3306, 775, 1275, 246, 3056, 1877, 2873, 2746, 2416, 664, 2312, 974, 969, 1148, 3320, 2186, 1694, 1125, 906, 1457, 1433, 1143, 312, 1534, 1870, 2006, 1523, 3063, 795, 1540, 3178, 1138, 2872, 256, 416, 1228, 2088, 965, 387, 419, 1064, 2853, 937, 505, 214, 2150, 1985, 1168, 1267, 1395, 1919, 189, 2385, 1291, 1888, 1296, 409, 2483, 3135, 2903, 1970, 771, 1836, 163, 1827, 1505, 334, 960, 2134, 434, 687, 3054, 671, 1448, 1584, 2742, 2699, 1403, 659, 494, 2170, 2420, 1676, 207, 2825, 497, 128, 3116, 1080, 2609, 1807, 1543, 2656, 3297, 427, 539, 82, 2368, 2575, 351, 546, 151, 1389, 2260, 3328, 61, 927, 1714, 1831, 2898, 1672, 556, 1796, 2510, 1605, 2065, 1247, 270, 1262, 700, 1140, 1449, 1004, 304, 419, 2377, 298, 2846, 1826, 1233, 2494, 2741, 2334, 195, 2518, 1044, 3139, 1878, 681, 963], [1641, 1050, 2184, 1792, 763, 2059, 947, 1979, 2363, 2093, 2488, 1362, 2914, 112, 2179, 747, 393, 2630, 2820, 3187, 3318, 230, 2802, 1509, 977, 613, 504, 1768, 1118, 362, 2174, 3070, 1638, 1110, 285, 1459, 1324, 327, 1857, 705, 807, 8, 550, 1560, 3271, 1784, 1548, 1380, 2343, 2871, 2465, 1777, 903, 1528, 3193, 2943, 3040, 2588, 1619, 3267, 387, 1390, 709, 640, 2183, 154, 1158, 2507, 1819, 1621, 660, 794, 578, 1190, 703, 1157, 290, 2244, 353, 2304, 594, 2054, 613, 1175, 1869, 1331, 704, 2070, 487, 2031, 2317, 1735, 1751, 2039, 2524, 30, 2046, 289, 2720, 976, 2870, 1070, 2366, 2146, 1672, 2356, 1066, 793, 2744, 1644, 271, 2428, 862, 2674, 2651, 1300, 222, 1681, 1491, 2554, 2926, 686, 1884, 686, 1673, 2897, 1000, 1142, 2670, 3158, 626, 2553, 2348, 3010, 1878, 2978, 409, 1588, 974, 1453, 951, 448, 2304, 116, 1316, 1445, 1741, 318, 1198, 3131, 2537, 2073, 3014, 1490, 2502, 2874, 1883, 2346, 1056, 866, 137, 1438, 1609, 2137, 1148, 1488, 2407, 977, 414, 436, 847, 2527, 3087, 968, 10, 2775, 2743, 1794, 801, 1758, 2916, 671, 845, 697, 292, 2606, 3004, 3136, 2588, 2612, 3253, 974, 1776, 1838, 1246, 241, 1864, 820, 765, 3064, 2312, 834, 181, 2660, 1077, 1164, 2200, 2750, 1678, 1104, 2672, 2645, 385, 2231, 577, 3139, 551, 2041, 1454, 3063, 1686, 2641, 3138, 516, 2848, 3166, 463, 3020, 270, 1629, 1338, 14, 1882, 1345, 1560, 513, 183, 1759, 881, 310, 2819, 2931, 42, 1604, 2938, 749, 870, 1799, 2034, 1276, 1243, 1065, 1037, 2266, 2001, 2515], [2490, 2725, 2082, 1407, 482, 3155, 960, 664, 1536, 3158, 1608, 439, 2271, 1523, 1327, 2072, 379, 514, 870, 2557, 1795, 2043, 1166, 303, 1049, 3070, 441, 748, 2383, 2188, 1792, 469, 2594, 2707, 554, 3187, 675, 2684, 3279, 2457, 90, 2686, 949, 2329, 2814, 1273, 781, 950, 2555, 2247, 1844, 699, 2746, 2550, 1046, 316, 2094, 2904, 1392, 2231, 469, 3221, 539, 2781, 1003, 2677, 1578, 2732, 2051, 2518, 3030, 52, 2391, 2688, 1711, 2132, 2883, 380, 2870, 3229, 3015, 1314, 158, 1431, 2157, 2833, 1692, 2282, 2657, 327, 2172, 2513, 2600, 1907, 3176, 2808, 2708, 1453, 2830, 1593, 2584, 1025, 1979, 3038, 2113, 2598, 1869, 1074, 2329, 2362, 2748, 2222, 191, 1525, 744, 294, 662, 2905, 2237, 1182, 2803, 3222, 303, 1815, 2277, 1427, 1585, 67, 490, 188, 2274, 1783, 1523, 2968, 2247, 337, 2120, 1905, 1839, 2954, 153, 1260, 2301, 2689, 2561, 1945, 1718, 1247, 2651, 713, 1877, 2126, 1995, 3236, 2089, 1380, 2664, 2665, 3239, 3104, 3195, 518, 468, 3197, 1065, 156, 2512, 603, 3268, 768, 1984, 1927, 1813, 1904, 2121, 2228, 141, 927, 1286, 2745, 1243, 2240, 380, 2142, 566, 2640, 1357, 961, 1522, 362, 1047, 1976, 1553, 974, 1612, 407, 1382, 2781, 1427, 211, 2746, 1197, 277, 588, 189, 2184, 2417, 1017, 1479, 2919, 228, 3121, 2438, 245, 2675, 2272, 1993, 1508, 494, 1289, 2361, 446, 1135, 606, 1721, 1664, 3270, 1322, 1880, 2811, 2832, 2547, 862, 178, 2929, 3001, 1801, 472, 705, 342, 2583, 683, 3203, 2409, 1706, 1098, 1802, 1512, 172, 2857, 1688, 445, 979, 2767, 1161, 91]] bHat = aHat^T: [[[2624, 568, 2343, 2233, 2805, 2899, 2873, 862, 1680, 1122, 2223, 1232, 675, 223, 877, 554, 3109, 1566, 1221, 2974, 631, 3155, 353, 85, 3205, 916, 3125, 2800, 13, 2810, 1568, 429, 563, 1252, 1415, 2283, 2688, 1290, 3302, 649, 589, 1319, 2435, 655, 549, 2025, 2435, 1070, 995, 3155, 1026, 2083, 974, 2385, 93, 1256, 2492, 2678, 3138, 1863, 1159, 1109, 2613, 662, 2632, 1104, 1563, 1378, 2425, 1369, 611, 236, 2763, 2290, 3078, 2556, 386, 1806, 735, 831, 2924, 2003, 2871, 2522, 2509, 914, 1083, 1197, 1758, 2568, 1334, 2933, 543, 2137, 3112, 434, 776, 1395, 2779, 2681, 439, 1404, 2186, 2413, 3163, 34, 1561, 2114, 2889, 2952, 1819, 2707, 2234, 2185, 2329, 1552, 2269, 1453, 3081, 2519, 2289, 539, 806, 1893, 3036, 2448, 283, 2499, 117, 677, 994, 1962, 461, 2927, 2741, 331, 2486, 2447, 1930, 2426, 2701, 2778, 224, 772, 2444, 97, 0, 12, 626, 2491, 3044, 655, 2045, 738, 1645, 1426, 1334, 936, 2424, 192, 3313, 334, 1788, 1179, 149, 2674, 2776, 3000, 3129, 606, 732, 1811, 636, 355, 702, 3041, 2996, 1356, 1668, 2856, 3297, 2606, 2095, 973, 488, 2087, 532, 662, 2483, 528, 1732, 1731, 2227, 307, 1570, 2730, 2661, 512, 2669, 1085, 376, 2425, 1357, 2493, 1542, 2905, 27, 2645, 1219, 3235, 964, 825, 1505, 1674, 2035, 2117, 883, 961, 338, 1483, 1964, 2875, 731, 817, 164, 1113, 2260, 1775, 3152, 2447, 2146, 322, 1161, 3061, 1272, 2586, 46, 1580, 2792, 1404, 2247, 479, 1185, 268, 2075, 1355, 2787, 159, 3022, 14, 2382, 15, 2529, 815, 3234, 2762], [2629, 1997, 2999, 1097, 137, 1577, 1900, 1104, 1001, 1440, 2424, 609, 2363, 1592, 130, 3142, 2673, 3040, 1280, 3295, 1901, 2413, 3046, 2832, 201, 439, 1201, 2413, 1883, 622, 92, 13, 1687, 2757, 1880, 1234, 2632, 560, 251, 396, 1783, 2916, 1138, 2990, 361, 2641, 27, 2237, 2272, 2193, 3129, 886, 1795, 1779, 2149, 2804, 2857, 1854, 1378, 3054, 394, 1916, 845, 2223, 158, 30, 3243, 277, 2010, 2276, 2939, 2488, 1972, 1670, 950, 1919, 1914, 2179, 2793, 782, 1729, 765, 2667, 364, 373, 2127, 2856, 291, 1981, 1220, 3128, 1221, 1286, 642, 2538, 2719, 2928, 1831, 26, 215, 3185, 2281, 518, 306, 1696, 1186, 2416, 3172, 1707, 761, 1563, 2160, 64, 2901, 1932, 2750, 2014, 3232, 1255, 2255, 60, 155, 2295, 1060, 279, 761, 1916, 835, 1373, 582, 1286, 2901, 1228, 2238, 611, 299, 1915, 22, 2933, 337, 2796, 2308, 2280, 1388, 2764, 1312, 1073, 3084, 2467, 2918, 1874, 3254, 3078, 2895, 2580, 2327, 1351, 1919, 1337, 409, 3067, 1023, 2327, 413, 1829, 2534, 2638, 1918, 3215, 35, 3248, 3325, 1764, 1766, 1393, 745, 82, 1052, 1128, 3070, 1811, 802, 679, 241, 2434, 1471, 1158, 1994, 3075, 2179, 2694, 579, 16, 2918, 2980, 1404, 168, 1251, 3011, 2492, 1835, 2206, 1910, 1589, 1495, 2248, 699, 522, 1341, 1561, 2988, 3196, 1256, 1345, 508, 252, 211, 1764, 203, 1641, 1042, 396, 1582, 1581, 3321, 1317, 1307, 3201, 2143, 3186, 1067, 2674, 1455, 2192, 1017, 2701, 2103, 513, 1084, 2345, 1712, 2798, 2048, 880, 851, 2992, 2355, 48, 4, 1212, 2558, 2978, 715, 2217, 2388, 2088], [2987, 273, 1770, 1102, 1971, 3319, 510, 2205, 3078, 1835, 191, 851, 89, 2463, 3156, 2065, 3103, 872, 3160, 1639, 2774, 945, 875, 2723, 2952, 3094, 2384, 837, 1586, 2229, 1725, 2179, 3081, 2650, 2181, 1175, 1049, 1294, 90, 1765, 555, 3164, 2556, 1274, 796, 2802, 1471, 1642, 2526, 1128, 3287, 976, 671, 2519, 1954, 1740, 1026, 1812, 2252, 845, 1144, 1595, 648, 2181, 1608, 1664, 830, 695, 3260, 1279, 2937, 2090, 1488, 1583, 930, 1576, 1832, 1167, 564, 1811, 1975, 2946, 1567, 1744, 416, 624, 2742, 275, 2330, 261, 2551, 1218, 275, 1296, 3056, 2183, 245, 1847, 1705, 874, 914, 565, 1927, 501, 2152, 2471, 3211, 2397, 2891, 1258, 2064, 1753, 999, 1006, 3315, 2414, 1949, 1231, 2831, 3146, 1703, 2372, 2345, 156, 3078, 343, 2771, 1873, 1709, 2947, 1945, 1644, 1648, 547, 1193, 1949, 2797, 827, 3136, 310, 636, 2212, 71, 2744, 1694, 3218, 1367, 2236, 2096, 2133, 2509, 1490, 2800, 2296, 3096, 3200, 2041, 813, 2231, 3255, 2686, 3180, 995, 2066, 748, 3059, 1857, 1182, 2027, 708, 1658, 2201, 647, 2114, 2442, 629, 3146, 1167, 2999, 3254, 2345, 740, 3109, 716, 1227, 740, 3188, 220, 443, 2741, 1181, 634, 2402, 2461, 804, 1544, 224, 345, 449, 2810, 688, 1900, 172, 941, 667, 1613, 1424, 764, 26, 1666, 974, 2352, 2772, 397, 3037, 1452, 1423, 927, 2881, 2724, 3182, 2090, 784, 1973, 780, 794, 1469, 2338, 3118, 826, 2391, 2938, 172, 2039, 1162, 1330, 138, 3133, 1518, 2500, 1571, 2412, 3111, 2600, 1767, 1177, 935, 1238, 1054, 2788, 3015, 52, 1839, 1319, 1638, 3304], [2564, 46, 3039, 1265, 664, 3080, 3046, 737, 1933, 895, 2587, 227, 480, 254, 1794, 3059, 1222, 477, 833, 387, 1745, 3025, 1713, 2893, 1063, 11, 3121, 724, 404, 3122, 1214, 1049, 496, 1828, 1278, 960, 3093, 639, 2967, 2987, 1777, 1251, 193, 1933, 319, 2372, 2975, 2140, 584, 454, 3118, 1832, 2460, 1921, 571, 981, 1009, 1318, 2167, 851, 1839, 3154, 2923, 2121, 3192, 2486, 3268, 1020, 449, 1355, 1720, 2757, 616, 3262, 3237, 585, 2873, 1484, 2566, 1664, 2767, 2250, 1187, 3278, 1661, 329, 634, 606, 2877, 2035, 975, 433, 445, 14, 1683, 157, 25, 3075, 1176, 2831, 945, 1947, 744, 1907, 2585, 2300, 2869, 2347, 113, 281, 429, 694, 1261, 3221, 2524, 2928, 2528, 474, 2659, 2178, 2044, 2418, 2623, 1366, 1110, 2711, 1449, 453, 1862, 3086, 1665, 1522, 45, 900, 2857, 3286, 1714, 2597, 109, 2432, 2006, 562, 3247, 2119, 1769, 422, 1348, 2281, 898, 755, 2120, 359, 2189, 2682, 589, 442, 1435, 2438, 3315, 241, 142, 2907, 25, 1337, 724, 2767, 2929, 492, 1136, 533, 1590, 321, 575, 1052, 2051, 902, 3208, 626, 2637, 1349, 945, 1624, 1225, 928, 968, 438, 1202, 1447, 1819, 499, 1134, 1702, 141, 1522, 1259, 3188, 2952, 2275, 1974, 2385, 1084, 2399, 3150, 403, 1802, 615, 2440, 1036, 3114, 2179, 1054, 2675, 232, 1358, 673, 1759, 1779, 53, 1113, 862, 1907, 2112, 1388, 752, 1247, 3067, 2591, 2477, 440, 323, 1086, 1599, 3174, 3179, 2493, 375, 365, 2496, 2012, 3239, 624, 3187, 490, 2254, 1256, 2758, 2170, 317, 1619, 2913, 3150, 2862, 1356, 259, 249, 192]], [[381, 2010, 2217, 1935, 3124, 1918, 3067, 2709, 2398, 1950, 949, 3173, 1987, 2300, 3321, 3290, 2006, 3170, 2635, 3264, 2064, 1442, 1427, 197, 2613, 988, 2821, 2533, 2379, 3066, 1247, 2768, 2704, 3307, 3222, 2868, 46, 14, 177, 3281, 3083, 2638, 1200, 1130, 1336, 2347, 2636, 2717, 1414, 1911, 3073, 2977, 2154, 700, 2743, 2137, 865, 1748, 2420, 3187, 2830, 429, 2817, 995, 3232, 2409, 366, 571, 597, 2748, 999, 1717, 3245, 1510, 520, 1472, 1571, 1308, 2647, 2104, 2201, 3127, 2504, 3313, 1963, 3236, 3132, 1973, 1926, 2273, 1464, 433, 990, 1395, 1439, 1944, 118, 245, 1968, 73, 2213, 2863, 1629, 1291, 2108, 919, 2326, 1607, 1124, 2463, 1063, 1909, 548, 990, 843, 1599, 2128, 1820, 1629, 580, 729, 1649, 1041, 1857, 2661, 1263, 117, 1986, 2337, 1459, 3305, 3041, 88, 3314, 685, 1898, 3303, 662, 845, 2607, 894, 3200, 1403, 2958, 999, 1700, 2838, 781, 1807, 2331, 2205, 2672, 2411, 856, 185, 1136, 228, 3177, 2475, 932, 3264, 1968, 1843, 2819, 1970, 245, 464, 1845, 2761, 1190, 1102, 1581, 1915, 621, 1083, 452, 3092, 1567, 1436, 2040, 953, 155, 2788, 314, 1167, 1017, 422, 917, 3286, 1063, 1086, 208, 460, 2537, 93, 2322, 2852, 1876, 2207, 2289, 2385, 2937, 2935, 1774, 411, 1893, 897, 2465, 1228, 204, 1036, 299, 3140, 1190, 2309, 3125, 143, 188, 569, 2166, 1952, 1963, 2791, 2692, 1003, 1272, 671, 212, 3204, 1518, 1627, 2391, 2481, 1162, 891, 234, 3160, 33, 1095, 1921, 1902, 586, 1479, 256, 3005, 14, 1312, 2855, 1017, 2588, 1662, 2974, 2668, 2186, 1232, 2454], [2762, 243, 107, 2437, 1701, 3113, 1491, 1412, 59, 1936, 1069, 143, 1822, 3004, 1307, 2896, 591, 2456, 3104, 3228, 2832, 1517, 1186, 801, 1049, 1786, 293, 2898, 2994, 2183, 1966, 2133, 1823, 1015, 2101, 854, 1381, 11, 1377, 2887, 1587, 270, 1719, 2804, 2076, 595, 3158, 1782, 2244, 1967, 1156, 2483, 2271, 2011, 2829, 2783, 933, 1300, 3312, 66, 594, 1992, 2471, 792, 3224, 240, 2242, 1235, 305, 1374, 130, 1248, 3130, 1380, 3075, 3224, 1643, 269, 560, 2250, 3156, 1084, 3316, 1254, 2705, 1011, 852, 1665, 2469, 51, 2986, 1126, 3080, 322, 3263, 306, 284, 69, 432, 3307, 1563, 2270, 2650, 118, 2398, 1171, 3073, 377, 2549, 1390, 1255, 2624, 1885, 2614, 289, 1373, 2201, 875, 490, 3300, 1697, 2130, 2387, 230, 3106, 964, 1618, 1786, 2565, 717, 2280, 2892, 2662, 355, 478, 2333, 37, 2236, 83, 862, 2302, 1349, 3050, 1944, 1096, 86, 3182, 2964, 2045, 2845, 2654, 3261, 1209, 706, 1881, 665, 2871, 939, 993, 1598, 1160, 2792, 3021, 398, 2892, 938, 2505, 2795, 2316, 2641, 2867, 2979, 677, 1050, 3313, 2851, 120, 1476, 615, 1299, 3185, 1919, 528, 590, 1317, 2059, 572, 1579, 3018, 1104, 1557, 706, 3294, 154, 1592, 1195, 1587, 1498, 2034, 1586, 1425, 2087, 1068, 2078, 1673, 1391, 1534, 1126, 2936, 2390, 334, 1332, 1738, 2686, 1195, 564, 1864, 1712, 2155, 740, 1529, 494, 3117, 3118, 2098, 503, 440, 977, 1407, 2450, 2408, 1645, 2068, 160, 1809, 2710, 606, 776, 680, 918, 1485, 2401, 163, 488, 856, 1283, 445, 2185, 1773, 3004, 975, 1157, 234, 800, 3266, 2201], [2117, 656, 1637, 514, 414, 3033, 3278, 927, 1965, 2351, 2372, 2572, 2285, 1624, 1529, 2780, 2665, 3015, 1022, 303, 1509, 2229, 897, 368, 52, 337, 1722, 2719, 1336, 2374, 2388, 1094, 318, 481, 3276, 2700, 39, 3112, 2367, 3010, 3220, 1094, 3203, 61, 3264, 1979, 2048, 292, 1475, 1328, 1112, 2813, 375, 1839, 1986, 2295, 1697, 2070, 112, 674, 921, 1719, 1195, 1767, 1483, 924, 703, 1606, 1365, 694, 3098, 3120, 2285, 1212, 2531, 401, 1093, 2550, 676, 2945, 465, 1061, 3053, 750, 2714, 2615, 2047, 2270, 3069, 1945, 1286, 2207, 2170, 2816, 1972, 299, 1068, 1767, 1968, 1078, 2544, 2320, 236, 3019, 1531, 2493, 1717, 1885, 2289, 2477, 2462, 1624, 2352, 2360, 2580, 2544, 3134, 902, 2502, 3233, 1789, 252, 197, 1803, 372, 1343, 922, 856, 633, 130, 2445, 1149, 1796, 381, 16, 2159, 2764, 3185, 2271, 2513, 1133, 1126, 1096, 272, 30, 1062, 3126, 676, 3236, 2500, 1695, 95, 2682, 2890, 3286, 3301, 2070, 1087, 1976, 2259, 692, 1612, 1169, 1045, 3022, 1192, 1469, 2662, 1868, 2545, 1135, 3258, 5, 2323, 1039, 2021, 1337, 931, 1029, 557, 2597, 2287, 955, 1463, 2298, 685, 2263, 310, 708, 2283, 3234, 1586, 20, 357, 2502, 2507, 1812, 2436, 271, 736, 1490, 2144, 718, 367, 2901, 1572, 1384, 2268, 875, 1557, 745, 2024, 1149, 2133, 1916, 2525, 469, 1764, 470, 1399, 386, 2296, 1765, 3046, 976, 1578, 1532, 1111, 3047, 690, 2033, 2307, 1834, 1736, 630, 2184, 1893, 1516, 658, 2016, 2476, 361, 2781, 62, 789, 677, 758, 1460, 891, 2299, 2601, 1327, 1484, 1102, 13, 1328], [227, 2881, 2934, 1877, 1445, 1035, 841, 1422, 2771, 2429, 439, 32, 3042, 2410, 2433, 3047, 342, 159, 2687, 164, 2746, 514, 1542, 185, 815, 3173, 417, 2081, 1736, 2824, 3188, 166, 1176, 227, 499, 834, 829, 2850, 872, 109, 1051, 3219, 1974, 2581, 246, 2085, 276, 784, 2832, 2893, 1818, 1162, 3156, 2671, 1458, 1269, 516, 1650, 1956, 152, 81, 650, 405, 1885, 1425, 2756, 1080, 1575, 1526, 1370, 1159, 2365, 2244, 3219, 1231, 391, 2300, 836, 2430, 2808, 2017, 2430, 2782, 1098, 721, 2547, 223, 2068, 2136, 303, 1057, 830, 446, 1691, 2516, 953, 2930, 2537, 2846, 1274, 1762, 982, 945, 1742, 376, 1052, 1974, 2328, 354, 474, 1604, 2917, 1202, 1867, 1998, 2692, 3228, 2207, 3013, 3192, 1731, 2191, 2099, 1237, 2132, 767, 2776, 650, 2881, 2442, 561, 1370, 143, 2114, 312, 1124, 2301, 1839, 3214, 1812, 697, 534, 3285, 346, 698, 103, 1895, 1926, 1233, 2431, 2814, 1204, 2568, 538, 1855, 2019, 1934, 3319, 2912, 2543, 1651, 2416, 2303, 416, 2725, 1484, 611, 727, 1756, 2115, 1847, 647, 3133, 2504, 158, 832, 1346, 2857, 350, 1722, 1583, 936, 1232, 3297, 1156, 1933, 1842, 439, 728, 2141, 612, 325, 731, 2358, 1969, 1649, 1438, 886, 691, 2115, 1323, 552, 421, 2834, 1097, 625, 2630, 814, 265, 1019, 3063, 208, 1734, 2395, 1264, 2214, 2112, 1205, 159, 2197, 2168, 2655, 764, 3128, 603, 241, 973, 2703, 1961, 1396, 2123, 264, 2771, 440, 2114, 288, 1235, 108, 2591, 341, 2753, 851, 879, 0, 2593, 1439, 368, 2797, 1415, 2834, 2179, 1599, 2494, 3285, 2028, 3323]], [[3236, 336, 469, 393, 681, 1084, 2197, 49, 1351, 3173, 375, 300, 2754, 1981, 2260, 1105, 3152, 1208, 2983, 499, 1136, 3164, 2357, 657, 605, 1497, 2533, 1348, 2158, 806, 694, 1567, 1923, 3087, 473, 2114, 2185, 908, 3164, 2866, 3141, 3277, 3216, 854, 1591, 729, 1452, 961, 161, 355, 443, 2223, 3317, 1304, 1652, 1442, 2772, 1720, 951, 1645, 130, 3033, 2055, 670, 832, 2254, 220, 1226, 2317, 1560, 349, 945, 771, 1444, 1982, 144, 2894, 1534, 1865, 828, 856, 1426, 1475, 2268, 3175, 546, 3296, 2563, 3319, 423, 704, 1344, 2872, 129, 164, 986, 2004, 1171, 3029, 133, 1575, 1335, 1751, 2557, 1109, 453, 3193, 271, 2591, 216, 600, 2636, 1672, 283, 27, 1953, 812, 755, 968, 2653, 2349, 2087, 1150, 1463, 3035, 1365, 2749, 1326, 2790, 2920, 2242, 1955, 847, 1397, 15, 1378, 944, 3321, 1966, 1229, 720, 318, 728, 928, 257, 3173, 1205, 2681, 1333, 3228, 1533, 320, 2894, 1949, 1272, 1989, 1736, 811, 496, 782, 1947, 644, 606, 1791, 1273, 71, 3315, 592, 518, 1533, 1808, 2655, 2309, 665, 1545, 1743, 2915, 1705, 2116, 505, 2412, 1350, 1864, 317, 3213, 10, 1706, 3272, 1106, 2320, 1374, 3164, 314, 314, 1038, 1136, 611, 2173, 2909, 2481, 738, 103, 451, 438, 2576, 2561, 1511, 2263, 2636, 1168, 2942, 191, 603, 860, 2554, 1244, 139, 2014, 2121, 2244, 2104, 1900, 329, 1029, 1442, 1570, 3179, 2639, 1979, 2676, 2442, 3151, 141, 1884, 2742, 291, 2484, 2689, 394, 2867, 2908, 2791, 1525, 2209, 2755, 191, 1586, 2448, 972, 2742, 252, 1519, 1568, 546, 623, 2252], [832, 1602, 2989, 2379, 2113, 3210, 609, 473, 1515, 2815, 2191, 945, 160, 937, 499, 2405, 3261, 651, 2491, 3309, 3122, 1898, 2484, 3252, 961, 1596, 837, 222, 1565, 488, 2795, 2389, 2828, 2079, 2018, 742, 1034, 1403, 343, 290, 2825, 3298, 2511, 568, 2218, 1521, 2638, 1424, 3058, 704, 370, 3135, 620, 2591, 319, 1525, 755, 2292, 2693, 331, 426, 2079, 993, 3254, 1230, 191, 145, 408, 1872, 20, 1920, 769, 2126, 1916, 3021, 1857, 2011, 420, 1694, 2362, 1954, 395, 720, 1531, 2266, 2108, 413, 1245, 2026, 3217, 1376, 119, 2314, 625, 2097, 1104, 2393, 2683, 2226, 2676, 2280, 3312, 1804, 1114, 1523, 1992, 392, 1907, 285, 568, 513, 708, 657, 1423, 3133, 3307, 1207, 8, 2310, 2378, 2873, 2270, 2854, 1284, 2285, 641, 816, 454, 1325, 468, 2772, 190, 1505, 3255, 1251, 2992, 2894, 116, 2457, 1064, 2312, 973, 3258, 935, 3064, 173, 2050, 3168, 1692, 1068, 2453, 2082, 548, 3262, 2125, 440, 2306, 1938, 2384, 1955, 233, 280, 118, 1222, 274, 2085, 1908, 2087, 2212, 448, 2353, 252, 391, 3048, 777, 1508, 424, 2206, 1898, 2551, 2808, 477, 1657, 3179, 1966, 54, 1419, 2285, 2237, 188, 270, 280, 2891, 968, 905, 962, 96, 2227, 1891, 1156, 1500, 355, 2003, 2275, 2870, 3184, 3323, 1906, 1972, 190, 568, 660, 2809, 2041, 1645, 1081, 3094, 409, 2276, 2356, 1609, 1728, 828, 955, 2498, 1505, 3211, 2375, 2869, 488, 2156, 52, 653, 729, 2382, 718, 1951, 2230, 2240, 1783, 2121, 2923, 3155, 979, 242, 2043, 1017, 133, 2810, 2374, 1782, 2345, 2054, 1872, 815, 1463], [1532, 932, 1476, 3209, 1469, 237, 1495, 518, 809, 1710, 792, 2096, 907, 458, 1013, 1682, 1325, 399, 315, 3121, 1584, 2286, 1284, 325, 682, 1028, 2536, 1911, 736, 3288, 2873, 1554, 3216, 2288, 42, 175, 3233, 913, 1911, 2404, 1242, 1113, 1228, 379, 2127, 1083, 39, 193, 2582, 1882, 1649, 1818, 2640, 2071, 1623, 235, 2732, 1679, 2441, 535, 420, 1138, 1195, 302, 1432, 308, 2467, 656, 1366, 3041, 1086, 1934, 1208, 1024, 3308, 2488, 1767, 1120, 2926, 1963, 2864, 2933, 80, 2866, 3030, 1695, 2909, 67, 65, 1636, 1089, 738, 2700, 3084, 2695, 1058, 1656, 3319, 224, 1451, 41, 1593, 1178, 1662, 840, 552, 3181, 2575, 2166, 1850, 2973, 2995, 634, 2451, 1441, 2762, 1771, 1929, 2412, 1112, 3004, 1852, 716, 2652, 959, 2800, 1101, 496, 3037, 2905, 2802, 202, 1202, 571, 512, 585, 2866, 850, 743, 486, 2687, 1888, 1106, 573, 78, 1063, 2228, 1641, 245, 919, 697, 2634, 1610, 780, 936, 1039, 1543, 1284, 1462, 1004, 354, 1155, 1687, 1840, 859, 2896, 3315, 1318, 130, 989, 1124, 2040, 2413, 2674, 710, 338, 1893, 1198, 2660, 1998, 2285, 1665, 2538, 1650, 475, 3049, 2349, 309, 758, 2224, 2565, 3254, 3207, 684, 1966, 1513, 1737, 2758, 2642, 644, 1096, 2784, 1586, 460, 1021, 758, 2654, 305, 880, 325, 2425, 1223, 1939, 215, 3120, 1573, 291, 2409, 995, 510, 1129, 291, 2608, 98, 2270, 2947, 2485, 2283, 1842, 1011, 2585, 1730, 317, 3132, 3157, 1118, 3262, 951, 2089, 1881, 1864, 2404, 2086, 1387, 1269, 1862, 975, 1230, 557, 2111, 1776, 966, 1184, 951, 3275, 2089], [672, 2087, 876, 1898, 2630, 2142, 1294, 333, 2333, 1969, 1052, 2146, 1713, 600, 1682, 1838, 1185, 3287, 8, 1757, 600, 1574, 2145, 130, 165, 1300, 2361, 782, 968, 124, 2840, 2632, 3301, 2035, 944, 2758, 2208, 2858, 896, 1722, 3067, 2068, 2749, 823, 934, 3185, 2817, 1438, 1056, 1542, 2048, 3004, 1705, 1925, 956, 639, 2097, 3047, 1673, 911, 11, 2913, 1860, 1988, 735, 2807, 953, 739, 835, 2894, 453, 1245, 1892, 1397, 2048, 2611, 895, 2964, 2164, 2358, 286, 3100, 3160, 1177, 475, 1861, 2092, 1461, 551, 521, 2237, 406, 2330, 3247, 1019, 1857, 2175, 2319, 3028, 2994, 3148, 927, 3292, 121, 334, 1440, 2360, 2535, 2291, 1598, 2794, 2630, 2406, 1884, 451, 3040, 3277, 2540, 3198, 2417, 1351, 2159, 2963, 2971, 257, 113, 3206, 1765, 1616, 1436, 2958, 1010, 1102, 96, 879, 725, 1885, 1827, 943, 255, 1519, 950, 372, 1401, 224, 1102, 1767, 2568, 352, 794, 2799, 147, 1226, 129, 2321, 1896, 957, 2396, 1043, 3202, 3159, 2915, 2073, 2125, 1919, 1750, 725, 79, 3244, 151, 2732, 1865, 1394, 314, 764, 315, 402, 2059, 353, 2167, 1815, 1438, 1038, 269, 2779, 2334, 1444, 2011, 1586, 1529, 2333, 463, 3234, 1181, 1051, 407, 751, 2725, 1613, 1009, 2313, 1004, 2877, 2238, 80, 2864, 538, 2178, 1243, 3061, 1563, 868, 2781, 2727, 461, 3117, 455, 2223, 2366, 2862, 725, 2922, 924, 1900, 1060, 2, 692, 472, 2799, 3034, 1025, 2992, 1863, 3261, 3099, 1175, 1786, 1076, 1511, 693, 1215, 359, 807, 1408, 1766, 183, 324, 819, 259, 2641, 3319, 1578, 348, 349, 2057, 608]], [[1206, 1314, 1500, 1288, 2199, 664, 813, 1904, 2451, 461, 2466, 2183, 2431, 776, 2967, 3088, 3049, 1792, 933, 1003, 2293, 1341, 1359, 3259, 2973, 1400, 612, 1613, 952, 2484, 1818, 404, 2014, 647, 1432, 2797, 1457, 1290, 2649, 1943, 718, 900, 790, 1446, 389, 889, 781, 462, 977, 1974, 2606, 2918, 2488, 237, 2308, 3095, 1012, 2124, 2726, 1336, 1792, 3305, 3093, 2377, 1547, 2182, 2880, 2633, 848, 1158, 300, 3027, 2569, 2545, 1263, 1963, 2641, 1932, 3147, 2821, 2944, 3076, 686, 1868, 1204, 1014, 1952, 1683, 1059, 3135, 268, 1244, 1507, 3095, 1571, 2442, 1178, 1159, 1042, 879, 144, 1099, 2983, 3234, 725, 381, 426, 1419, 1041, 128, 832, 3274, 124, 3283, 1727, 1904, 313, 1167, 2242, 1296, 2870, 1383, 2064, 501, 1913, 2534, 2438, 672, 2274, 1915, 1455, 2594, 1279, 159, 3243, 3280, 2797, 259, 445, 2811, 142, 2013, 783, 696, 1631, 558, 345, 1168, 1955, 1078, 1947, 2936, 2788, 1081, 2559, 462, 1620, 2475, 1728, 377, 1544, 1050, 3024, 2876, 1432, 1121, 699, 1533, 2260, 1408, 1831, 930, 2100, 71, 1666, 3261, 1884, 2231, 1354, 3024, 2044, 2449, 538, 1509, 618, 1669, 2663, 1719, 3081, 2214, 239, 2467, 1059, 3227, 1923, 1552, 1728, 1338, 2181, 2189, 2258, 2682, 1700, 2020, 625, 2116, 1856, 2870, 477, 978, 1114, 1294, 1468, 2735, 1811, 1152, 1660, 1107, 184, 1583, 2037, 2539, 1350, 1879, 534, 705, 275, 305, 203, 2815, 1902, 3067, 2206, 1811, 3204, 3132, 852, 1501, 47, 1, 661, 104, 2152, 2150, 1737, 740, 551, 1825, 1997, 1544, 2819, 712, 44, 1701, 261, 3035], [619, 3204, 369, 1810, 1593, 84, 1721, 875, 3204, 56, 1919, 604, 3290, 2766, 2033, 2417, 2425, 313, 2004, 746, 1985, 2051, 1234, 1054, 1320, 1098, 1955, 262, 1348, 39, 527, 417, 2256, 3202, 2238, 499, 3139, 144, 3139, 2389, 2404, 1092, 699, 1025, 2972, 3318, 2298, 2652, 223, 1688, 3268, 2887, 2294, 557, 23, 155, 285, 414, 2557, 2945, 2210, 156, 2850, 141, 2659, 2339, 1480, 883, 2049, 1994, 1178, 1484, 3275, 1799, 3166, 1711, 2050, 872, 1574, 932, 3071, 177, 1168, 883, 472, 2145, 1423, 1457, 1918, 2797, 2903, 1729, 341, 3128, 2575, 1996, 2388, 1188, 1157, 301, 1138, 2038, 907, 2812, 1922, 1428, 1018, 2401, 3232, 3317, 2160, 974, 1329, 3191, 676, 972, 2908, 1875, 2224, 1555, 694, 760, 997, 502, 1563, 594, 889, 2186, 1065, 577, 2396, 335, 1544, 975, 599, 564, 910, 2978, 2913, 1944, 2351, 3219, 134, 2920, 1204, 69, 2971, 72, 2134, 463, 1935, 3206, 2809, 2857, 923, 2603, 1448, 800, 3001, 458, 1507, 2955, 765, 1677, 567, 2614, 1233, 1110, 2627, 5, 2068, 3101, 2636, 1418, 2125, 1039, 2024, 3150, 842, 1494, 311, 2810, 2003, 1067, 2904, 774, 1501, 1649, 564, 343, 946, 1037, 2142, 1504, 2264, 1407, 1013, 1114, 1872, 2516, 1986, 124, 2125, 1631, 2711, 1541, 3135, 2558, 1044, 35, 546, 3296, 1710, 705, 1986, 570, 306, 136, 2041, 3159, 1077, 965, 2006, 1172, 3097, 2706, 1766, 1822, 1975, 2586, 2887, 2441, 694, 3029, 2763, 3325, 646, 2618, 1128, 795, 2460, 913, 38, 466, 1841, 740, 2563, 1556, 1531, 425, 2553, 2570, 2341, 3193, 862, 1921], [3248, 2199, 1872, 1800, 252, 2561, 1433, 1415, 610, 3292, 2771, 2753, 2871, 1735, 2797, 131, 1348, 2221, 1271, 2042, 1041, 2476, 1145, 1854, 3229, 1441, 2327, 2990, 2265, 998, 2400, 841, 248, 138, 231, 2486, 1360, 1079, 2207, 2606, 1258, 2862, 2262, 1495, 2776, 1520, 291, 2184, 1988, 947, 926, 2727, 1929, 971, 934, 962, 2360, 1037, 758, 2801, 2759, 2321, 2593, 986, 1858, 1963, 791, 1722, 957, 1547, 879, 2237, 1133, 738, 1404, 2684, 458, 2263, 2855, 2170, 963, 1821, 1563, 1524, 1223, 1441, 1606, 737, 158, 1859, 2721, 1756, 2168, 368, 1219, 828, 2155, 479, 1680, 1180, 2964, 811, 1681, 126, 1166, 1691, 694, 2515, 1890, 963, 1987, 2789, 79, 424, 1082, 365, 3216, 781, 1788, 3091, 2053, 2677, 593, 2000, 3020, 1884, 2396, 284, 2489, 3223, 1520, 2460, 2438, 2583, 2285, 663, 2540, 1668, 2208, 3087, 1751, 30, 1930, 1544, 1688, 3052, 3326, 452, 3232, 1905, 1960, 2547, 909, 1030, 774, 357, 3114, 1973, 1607, 2624, 236, 2273, 308, 507, 1123, 616, 1083, 127, 1848, 1701, 808, 220, 1735, 3153, 1223, 2654, 1719, 2409, 2233, 1793, 420, 3238, 1927, 460, 2615, 27, 1242, 2823, 2504, 1706, 2352, 1916, 1257, 2408, 1232, 3174, 1401, 1517, 518, 1072, 2849, 728, 293, 1397, 1844, 1830, 2559, 75, 492, 2869, 2848, 1265, 2524, 1421, 358, 3202, 1837, 2925, 932, 2859, 389, 1295, 1920, 488, 2459, 1364, 2853, 1247, 289, 2486, 2806, 807, 1535, 2870, 29, 2879, 3195, 1054, 2148, 422, 2057, 585, 88, 1290, 1579, 2426, 1553, 976, 517, 1857, 2045, 475, 3117, 2334, 1878, 2771], [1351, 279, 2141, 1097, 1906, 3306, 776, 1713, 3070, 2649, 1632, 996, 469, 552, 952, 714, 2772, 1663, 2450, 233, 939, 3077, 2355, 879, 1038, 1875, 2196, 1381, 3011, 3159, 1812, 2979, 2788, 1530, 2606, 2497, 433, 2491, 2733, 263, 2487, 194, 1191, 770, 2073, 1575, 3291, 1698, 2815, 2684, 2822, 1770, 2092, 42, 2484, 2177, 2609, 2743, 3036, 2211, 1958, 2673, 1232, 1046, 1748, 3250, 3243, 2517, 1274, 3124, 2877, 2737, 3012, 2560, 1170, 2219, 2189, 2855, 585, 2168, 992, 3051, 1151, 2110, 2031, 658, 781, 3158, 906, 349, 140, 1103, 38, 388, 1605, 1860, 1049, 229, 1512, 476, 2634, 33, 2385, 1801, 665, 2179, 2441, 1095, 1406, 214, 1005, 1809, 1883, 1220, 1491, 2155, 2349, 3199, 62, 748, 580, 2035, 1474, 365, 1455, 967, 1337, 2746, 2766, 3124, 1666, 3308, 2553, 2952, 3309, 1779, 2683, 2204, 2239, 664, 2049, 3317, 3129, 786, 1448, 2343, 3312, 1591, 2325, 2021, 1646, 164, 822, 419, 1237, 1989, 2556, 1951, 3134, 1162, 206, 1566, 1846, 2440, 663, 1801, 2154, 835, 1901, 2141, 410, 1820, 1170, 967, 2540, 630, 205, 1623, 209, 2169, 3196, 2962, 1241, 2218, 1372, 179, 1672, 1089, 282, 552, 38, 2889, 1454, 331, 1075, 2603, 1851, 1004, 1580, 837, 2250, 1390, 2129, 69, 1183, 2592, 2701, 2512, 2779, 1930, 167, 1678, 687, 2626, 3029, 518, 1729, 1466, 2969, 1638, 3243, 509, 1912, 2760, 722, 2714, 1012, 1370, 1733, 3288, 1646, 2526, 1406, 1304, 1442, 1755, 549, 1627, 1479, 2781, 2842, 525, 973, 499, 888, 413, 3097, 2384, 173, 520, 1527, 2000, 2653, 318, 1623, 386]]] r: [[0, 3328, 0, 0, 3328, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 3328, 0, 0, 1, 0, 1, 2, 0, 2, 3328, 0, 3328, 1, 1, 0, 3328, 0, 3327, 1, 0, 1, 3327, 1, 3328, 0, 0, 1, 3328, 3328, 0, 3327, 0, 0, 0, 1, 3328, 3328, 1, 0, 1, 0, 0, 3328, 0, 2, 2, 0, 3328, 3327, 1, 1, 0, 0, 3327, 2, 0, 3327, 1, 3328, 1, 0, 3328, 1, 1, 0, 0, 2, 3327, 0, 0, 0, 3327, 3328, 1, 0, 3328, 3327, 0, 0, 0, 0, 3328, 3328, 0, 3328, 2, 1, 1, 0, 1, 0, 3328, 1, 1, 0, 1, 0, 1, 1, 0, 1, 0, 3328, 3328, 2, 0, 0, 3327, 1, 3328, 0, 0, 3328, 3328, 3328, 0, 1, 3328, 3328, 3328, 0, 0, 0, 1, 0, 3328, 3328, 1, 0, 0, 0, 1, 1, 2, 1, 1, 3328, 1, 3328, 1, 1, 3327, 3328, 1, 0, 2, 3328, 1, 0, 0, 3328, 3328, 1, 3328, 3328, 3328, 0, 2, 1, 0, 3327, 1, 0, 1, 1, 2, 2, 0, 3327, 1, 3327, 0, 0, 1, 0, 3328, 3328, 1, 0, 0, 1, 3328, 2, 1, 0, 0, 2, 1, 3328, 3328, 0, 1, 0, 0, 0, 3328, 1, 3328, 0, 3328, 0, 3328, 0, 0, 1, 3328, 3328, 1, 0, 3328, 0, 1, 0, 3328, 3327, 1, 3327, 3328, 1, 3327, 0, 1, 0, 0, 3328, 0, 1, 3328, 3328, 0, 1, 0, 3328, 0, 0, 1, 0, 1, 3328, 3328], [1, 1, 2, 1, 1, 1, 0, 0, 1, 1, 1, 3328, 3328, 0, 3328, 3328, 3328, 1, 1, 0, 3328, 0, 3328, 0, 1, 3328, 3328, 0, 1, 1, 3328, 1, 3328, 2, 0, 3328, 0, 3328, 1, 0, 3328, 0, 0, 1, 0, 1, 1, 0, 3327, 3328, 3328, 3327, 3328, 1, 0, 3328, 3328, 3328, 1, 0, 1, 3327, 3328, 3328, 3327, 3328, 3328, 0, 0, 0, 3327, 0, 0, 1, 0, 1, 0, 0, 3328, 3328, 0, 1, 0, 3328, 0, 1, 0, 1, 3328, 2, 0, 0, 3328, 3328, 3328, 3328, 0, 3328, 0, 0, 3328, 0, 3328, 3328, 2, 3327, 3328, 3327, 2, 1, 2, 0, 0, 3328, 3328, 0, 3327, 0, 1, 3327, 1, 0, 3328, 1, 0, 3327, 0, 0, 3328, 0, 3328, 3327, 1, 3327, 0, 1, 0, 3328, 0, 0, 1, 0, 0, 1, 0, 1, 0, 3328, 1, 1, 1, 0, 0, 1, 3328, 3327, 1, 0, 1, 3328, 0, 1, 0, 1, 0, 3328, 3327, 0, 3327, 3328, 1, 3328, 1, 3328, 1, 0, 0, 3328, 0, 3328, 3328, 0, 0, 0, 3327, 0, 0, 2, 0, 1, 3328, 2, 1, 0, 3328, 0, 0, 0, 1, 3327, 0, 0, 3327, 0, 1, 0, 0, 2, 0, 3328, 1, 1, 3328, 3328, 1, 0, 3327, 1, 0, 3327, 0, 0, 0, 3328, 0, 1, 1, 0, 0, 3328, 0, 0, 3328, 1, 2, 3327, 1, 1, 2, 1, 0, 1, 3328, 3328, 0, 1, 1, 1, 1, 1, 3328, 0, 2, 3327, 2, 1], [3328, 0, 0, 1, 0, 3328, 1, 1, 1, 1, 3328, 0, 1, 0, 0, 0, 3328, 3328, 3328, 1, 0, 1, 0, 0, 3328, 0, 3328, 1, 0, 1, 3328, 3328, 3327, 1, 0, 0, 0, 3328, 3328, 2, 0, 1, 1, 1, 3328, 0, 1, 0, 1, 0, 3328, 1, 3328, 3328, 0, 1, 3328, 3328, 3328, 1, 2, 0, 3328, 1, 3327, 0, 1, 0, 1, 3327, 0, 3328, 3328, 0, 0, 3328, 3328, 3328, 0, 3328, 3327, 0, 0, 1, 3328, 0, 0, 0, 1, 0, 0, 3328, 0, 1, 0, 3328, 0, 1, 3328, 3328, 3328, 0, 0, 1, 1, 3327, 3327, 1, 1, 1, 0, 0, 3328, 0, 0, 3328, 3328, 3328, 3327, 3328, 1, 2, 0, 0, 1, 0, 3327, 0, 0, 0, 0, 0, 3327, 3328, 3328, 3328, 0, 0, 1, 2, 3327, 1, 0, 2, 1, 0, 3327, 0, 0, 3328, 1, 3328, 3328, 0, 0, 0, 1, 0, 1, 3328, 3328, 3328, 0, 3327, 3328, 1, 3328, 2, 1, 1, 1, 0, 3327, 3327, 3328, 3328, 0, 1, 3328, 0, 3327, 3327, 1, 1, 3327, 1, 1, 1, 3328, 0, 0, 3327, 3327, 1, 3328, 3328, 3328, 3327, 0, 0, 0, 3328, 3328, 1, 3327, 1, 0, 1, 3328, 0, 0, 0, 3327, 3328, 2, 0, 3328, 1, 2, 0, 3328, 0, 2, 1, 0, 2, 0, 3328, 1, 3328, 0, 3328, 1, 0, 3328, 3328, 1, 3328, 3328, 0, 3327, 1, 0, 3328, 0, 3328, 0, 1, 1, 3327, 0, 3327, 1, 3328, 2, 0], [1, 3328, 0, 1, 3327, 1, 1, 1, 2, 0, 0, 0, 1, 0, 0, 3328, 0, 1, 2, 0, 0, 0, 0, 0, 0, 3328, 1, 1, 0, 1, 3328, 0, 3328, 0, 0, 2, 3328, 3328, 0, 3328, 3328, 0, 1, 0, 3328, 3327, 1, 3328, 1, 2, 3328, 1, 0, 0, 3328, 3328, 0, 0, 1, 0, 3328, 3328, 3328, 0, 2, 1, 2, 3328, 0, 3328, 0, 0, 1, 2, 1, 0, 2, 3328, 3328, 0, 0, 3328, 0, 0, 0, 2, 3328, 3328, 2, 3327, 2, 0, 0, 1, 0, 3328, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 3328, 3328, 3327, 0, 1, 0, 1, 2, 1, 0, 0, 0, 3328, 1, 3328, 3328, 0, 1, 3328, 3328, 1, 0, 3328, 2, 1, 3327, 1, 3328, 1, 2, 1, 0, 0, 2, 3328, 3328, 1, 2, 3328, 1, 3328, 0, 0, 1, 1, 0, 0, 3328, 0, 1, 0, 3328, 0, 1, 3328, 1, 2, 2, 2, 1, 1, 3328, 0, 1, 3328, 0, 0, 0, 1, 3328, 1, 1, 3327, 3328, 0, 1, 3328, 0, 0, 3327, 0, 0, 2, 0, 0, 3327, 1, 0, 2, 0, 0, 1, 0, 0, 0, 0, 0, 0, 3328, 1, 0, 2, 2, 3328, 0, 1, 1, 3327, 1, 1, 0, 3328, 3328, 0, 0, 3328, 3328, 3328, 1, 3328, 3328, 0, 1, 0, 2, 3328, 3328, 1, 1, 0, 0, 1, 0, 1, 1, 0, 0, 3328, 3328, 1, 3327, 3327, 1, 0, 0, 3328, 1, 0]] e1: [[0, 3328, 3328, 3328, 3328, 3327, 0, 3328, 2, 3327, 3328, 3328, 0, 0, 2, 3328, 3328, 0, 1, 3328, 1, 0, 1, 0, 1, 3328, 1, 3328, 3328, 0, 0, 2, 2, 1, 1, 0, 0, 0, 0, 3327, 1, 3327, 0, 3328, 1, 3327, 3328, 3328, 1, 1, 0, 1, 0, 0, 3328, 0, 3328, 3328, 2, 0, 3328, 0, 3328, 3327, 0, 3328, 0, 0, 0, 3328, 3328, 2, 3327, 2, 0, 3327, 0, 1, 3327, 3328, 3328, 3327, 1, 1, 3328, 0, 3328, 0, 0, 1, 3328, 0, 3328, 3328, 3328, 1, 2, 0, 3328, 3328, 0, 0, 1, 3328, 3328, 1, 1, 1, 0, 0, 3328, 0, 1, 1, 0, 1, 0, 3328, 3328, 2, 3328, 0, 0, 0, 0, 3328, 0, 1, 0, 0, 3328, 0, 3328, 1, 0, 3328, 1, 1, 0, 1, 1, 0, 1, 3327, 3328, 1, 3328, 0, 0, 0, 0, 1, 0, 1, 1, 0, 0, 2, 3328, 0, 0, 0, 0, 0, 3328, 1, 3328, 3327, 3328, 0, 3327, 1, 0, 0, 0, 3328, 1, 0, 1, 3328, 0, 0, 0, 1, 0, 3328, 0, 0, 2, 3328, 1, 1, 1, 0, 0, 1, 3328, 2, 0, 1, 3328, 1, 1, 0, 3328, 3327, 1, 1, 1, 3328, 3328, 3328, 2, 0, 0, 0, 3328, 0, 3328, 0, 0, 0, 0, 0, 0, 3327, 1, 3327, 1, 0, 0, 1, 3328, 3328, 3328, 0, 0, 2, 2, 0, 1, 0, 0, 3328, 3328, 0, 3328, 3327, 1, 3327, 1, 1, 0, 0, 0, 1], [0, 2, 3328, 0, 1, 3328, 0, 0, 0, 3328, 1, 0, 0, 0, 3328, 0, 2, 3327, 3328, 0, 1, 0, 1, 0, 3328, 1, 3328, 3328, 3328, 0, 0, 0, 3328, 3328, 3328, 1, 3328, 1, 0, 3327, 1, 3328, 2, 3328, 0, 1, 0, 3327, 0, 3328, 0, 0, 3328, 3328, 3327, 0, 3327, 0, 3328, 1, 0, 0, 3328, 3328, 1, 2, 1, 3328, 0, 3328, 3328, 1, 3328, 3328, 0, 1, 0, 3328, 0, 1, 1, 1, 0, 0, 3327, 1, 1, 0, 1, 3328, 2, 3328, 3328, 3328, 3327, 2, 3328, 1, 0, 3328, 3328, 0, 3327, 0, 3328, 1, 1, 2, 0, 1, 3328, 0, 0, 0, 1, 3328, 1, 0, 0, 0, 3328, 0, 0, 3328, 1, 1, 0, 1, 3328, 0, 3328, 1, 3327, 1, 0, 1, 0, 0, 1, 1, 1, 3328, 1, 3327, 2, 0, 1, 3328, 3327, 1, 3328, 2, 2, 1, 0, 1, 3327, 0, 0, 0, 3328, 3328, 0, 1, 1, 1, 3328, 3328, 1, 1, 1, 3328, 3328, 0, 1, 1, 3328, 0, 0, 0, 2, 0, 0, 2, 0, 3328, 1, 0, 3328, 2, 0, 3327, 0, 2, 3328, 0, 0, 0, 1, 3328, 2, 1, 1, 3328, 3328, 3327, 3328, 0, 3328, 1, 2, 0, 0, 0, 1, 3327, 3328, 0, 3328, 2, 0, 1, 3327, 3328, 1, 3328, 0, 1, 0, 3328, 3328, 3328, 3327, 2, 0, 3327, 3328, 0, 0, 3328, 3328, 0, 2, 3328, 3327, 1, 0, 3328, 1, 0, 3328, 3328, 0, 1, 0, 1], [3328, 0, 1, 3328, 1, 3328, 3328, 2, 3327, 1, 1, 3328, 0, 3328, 0, 3327, 0, 3328, 1, 3328, 1, 2, 1, 0, 0, 3328, 3328, 2, 3327, 1, 3328, 1, 0, 0, 2, 0, 0, 1, 0, 1, 3328, 0, 0, 1, 3328, 3327, 1, 0, 0, 3328, 3328, 1, 3328, 3328, 0, 1, 0, 0, 0, 1, 3327, 0, 3328, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3327, 3328, 3328, 0, 2, 0, 3328, 0, 0, 0, 0, 1, 1, 1, 0, 1, 1, 1, 0, 3328, 0, 3328, 2, 1, 0, 3328, 0, 0, 0, 0, 3328, 3328, 0, 3328, 1, 1, 0, 1, 3327, 3327, 2, 1, 1, 0, 1, 3328, 3328, 1, 1, 3328, 1, 0, 3328, 2, 3328, 3328, 0, 3328, 3328, 3328, 3327, 0, 3328, 1, 0, 0, 0, 3327, 0, 1, 3327, 2, 0, 1, 1, 0, 3328, 1, 3328, 0, 0, 3328, 1, 0, 1, 3328, 3328, 1, 1, 0, 0, 0, 3328, 3328, 3327, 0, 3328, 3328, 3328, 0, 0, 2, 1, 0, 0, 0, 0, 1, 2, 3327, 0, 2, 2, 1, 0, 3328, 1, 3328, 0, 1, 1, 3328, 0, 0, 0, 0, 0, 0, 1, 0, 1, 3328, 3328, 3328, 0, 3328, 0, 0, 1, 0, 3327, 1, 0, 3328, 3328, 3328, 0, 0, 3327, 0, 1, 1, 2, 3328, 2, 1, 1, 1, 0, 3328, 1, 3327, 3328, 0, 3327, 2, 1, 1, 3328, 0, 1, 0, 3328, 0, 3328, 2, 3327, 3328, 3328, 3328, 0], [3328, 0, 0, 1, 0, 1, 1, 3328, 0, 0, 1, 3328, 1, 1, 0, 3328, 3327, 2, 1, 0, 2, 0, 0, 0, 1, 0, 0, 0, 1, 1, 3328, 0, 1, 1, 3328, 1, 0, 3328, 2, 0, 0, 3328, 3328, 0, 3328, 0, 3328, 0, 0, 0, 0, 0, 0, 0, 3328, 3327, 3328, 1, 2, 0, 3328, 3328, 1, 1, 1, 2, 3328, 2, 3328, 0, 0, 3328, 2, 3327, 0, 0, 1, 1, 1, 3328, 0, 0, 0, 0, 0, 1, 1, 2, 1, 0, 3328, 3328, 3328, 3328, 1, 1, 1, 0, 2, 1, 0, 1, 3328, 1, 1, 2, 0, 2, 0, 3328, 3328, 0, 3328, 1, 0, 2, 2, 0, 3328, 1, 1, 0, 3328, 1, 3328, 3328, 0, 3328, 3328, 3328, 3327, 1, 1, 1, 0, 3328, 1, 1, 0, 1, 0, 2, 0, 1, 1, 0, 0, 3327, 2, 0, 1, 1, 1, 0, 0, 0, 0, 0, 1, 3328, 2, 1, 3328, 0, 3328, 3328, 3327, 1, 1, 0, 3327, 0, 0, 2, 3328, 3327, 0, 1, 1, 3327, 3328, 0, 0, 0, 1, 3328, 3328, 0, 2, 3327, 1, 1, 3328, 0, 3327, 0, 3328, 3328, 1, 0, 0, 1, 3328, 3328, 1, 3328, 0, 3328, 1, 2, 3328, 3327, 1, 3327, 0, 3328, 1, 1, 0, 0, 0, 3328, 1, 0, 3327, 1, 0, 1, 0, 2, 0, 1, 1, 3328, 0, 1, 1, 0, 1, 1, 3327, 3327, 0, 3328, 1, 0, 0, 0, 2, 3327, 2, 1, 3328, 2, 0, 1]] e2: [0, 3327, 1, 3328, 1, 2, 0, 1, 0, 0, 0, 3327, 0, 1, 0, 3328, 1, 2, 0, 0, 0, 1, 0, 2, 1, 2, 0, 3327, 2, 3328, 3327, 2, 1, 1, 0, 0, 0, 3328, 0, 1, 3328, 0, 3327, 1, 1, 1, 3328, 3328, 0, 1, 3327, 3328, 3328, 3327, 0, 0, 0, 0, 0, 3328, 0, 3328, 3327, 1, 3328, 0, 2, 1, 3328, 0, 0, 2, 0, 1, 0, 0, 1, 1, 0, 1, 0, 1, 1, 0, 2, 3328, 0, 0, 3328, 0, 2, 3328, 3328, 0, 0, 0, 0, 0, 1, 2, 0, 0, 1, 3327, 1, 1, 0, 1, 3328, 1, 0, 0, 0, 0, 3327, 1, 1, 0, 0, 0, 0, 3328, 0, 3328, 0, 0, 0, 0, 1, 0, 1, 3328, 3327, 1, 0, 2, 3328, 1, 1, 0, 1, 0, 3328, 1, 3328, 1, 0, 3328, 1, 1, 2, 3328, 1, 0, 1, 3328, 1, 3328, 0, 1, 3328, 1, 1, 0, 1, 3328, 0, 0, 0, 0, 1, 3328, 1, 3328, 1, 3328, 3328, 3328, 0, 0, 3328, 1, 3328, 3328, 1, 0, 3328, 2, 0, 2, 3328, 0, 0, 0, 3327, 2, 3328, 3328, 3327, 0, 0, 0, 3328, 0, 3328, 3328, 0, 1, 3328, 3328, 0, 3327, 0, 3328, 3328, 3328, 0, 3328, 1, 0, 1, 3328, 0, 3328, 3328, 1, 0, 3328, 0, 3327, 3328, 3328, 3328, 3328, 3328, 0, 0, 0, 1, 0, 2, 1, 0, 0, 0, 1, 0, 1, 3327, 3328, 1, 1, 3328, 3327, 1, 0] rHat: [[2961, 3151, 3250, 2522, 466, 1490, 1030, 1206, 2334, 2137, 1753, 2041, 2417, 1536, 2849, 2167, 2109, 919, 3056, 1731, 1659, 1875, 2419, 2016, 2710, 1881, 2237, 2309, 2798, 1029, 2844, 3148, 2249, 2078, 1804, 1091, 3190, 1373, 3122, 2914, 1641, 358, 2751, 1763, 206, 424, 2254, 2358, 1224, 3280, 2695, 2390, 2284, 274, 1151, 2264, 172, 2380, 1036, 2592, 2833, 2022, 1622, 491, 1655, 2741, 3282, 290, 206, 175, 2374, 1809, 908, 779, 1458, 305, 2308, 2476, 3075, 811, 2695, 2671, 1230, 782, 1376, 1540, 2642, 928, 1982, 864, 1397, 2176, 138, 1232, 898, 340, 2206, 2730, 1402, 2119, 2834, 1508, 2641, 1930, 288, 1599, 2775, 490, 1978, 1969, 3010, 2127, 1484, 2233, 3010, 1764, 690, 2285, 779, 1092, 859, 1627, 566, 502, 314, 1790, 2788, 771, 1950, 2163, 250, 718, 756, 239, 1797, 508, 2590, 2409, 2409, 3069, 1069, 219, 606, 618, 2155, 2175, 1603, 2041, 1765, 3072, 1492, 2660, 1511, 982, 2442, 2669, 735, 685, 1153, 1729, 2108, 2742, 1146, 1168, 2604, 2012, 796, 766, 1232, 2440, 2645, 1584, 2624, 892, 402, 1440, 1987, 2819, 457, 3142, 1976, 2606, 345, 3267, 465, 3282, 472, 882, 1081, 409, 614, 1273, 1904, 1507, 344, 496, 2426, 1611, 1595, 191, 2808, 2900, 1971, 269, 2413, 1656, 1031, 3323, 3094, 1094, 710, 1983, 1669, 1443, 19, 2852, 168, 3199, 1599, 393, 1722, 2438, 914, 2791, 1879, 1726, 889, 2821, 1074, 2815, 1281, 2225, 1240, 1544, 3134, 768, 3268, 1102, 2173, 133, 1603, 3152, 2293, 2947, 2342, 2474, 314, 157, 2066, 2186, 749, 967, 1908, 2, 1503, 747], [1189, 2551, 2100, 2299, 2054, 2162, 3251, 1612, 2462, 3169, 915, 103, 2714, 3276, 2159, 3154, 3152, 2348, 559, 1071, 2421, 2154, 1575, 2261, 2653, 468, 1337, 662, 907, 2087, 527, 541, 549, 1961, 1239, 2163, 727, 490, 393, 2693, 1601, 757, 487, 990, 555, 1418, 298, 354, 1450, 1595, 1914, 1794, 1274, 1825, 1624, 1290, 3162, 1400, 1705, 1487, 3041, 2435, 1288, 1391, 3147, 825, 842, 1775, 1484, 2047, 500, 1973, 878, 1261, 60, 2102, 236, 558, 2754, 2788, 682, 434, 1646, 1171, 2657, 2727, 2339, 2040, 2008, 1623, 1963, 2666, 934, 1717, 39, 778, 1289, 960, 1094, 2293, 614, 3234, 1820, 1398, 575, 1580, 1041, 2844, 2708, 3137, 1537, 2148, 408, 2415, 1547, 2957, 2357, 409, 1685, 491, 3119, 129, 2576, 183, 487, 2265, 2827, 3032, 2544, 2631, 3182, 474, 2093, 2298, 1329, 2063, 296, 1911, 3148, 133, 1214, 1762, 3081, 1864, 2522, 1331, 1523, 1694, 1563, 1370, 1183, 38, 638, 1960, 2711, 2801, 2339, 2802, 535, 1774, 2869, 1522, 2765, 2201, 3262, 410, 1833, 588, 421, 2501, 3156, 494, 1935, 106, 970, 1266, 1488, 3260, 2111, 2712, 3199, 1525, 2672, 3109, 732, 2472, 861, 1811, 1910, 1641, 499, 2052, 1771, 787, 1658, 231, 124, 1770, 2701, 645, 3203, 3029, 1169, 2875, 1435, 2968, 2212, 308, 232, 3289, 2018, 1813, 1815, 3203, 61, 822, 2652, 250, 990, 2565, 175, 1404, 2600, 3175, 100, 2623, 1234, 1411, 1116, 1753, 767, 3180, 2619, 829, 1328, 2731, 1207, 2624, 872, 497, 2731, 2358, 3038, 3214, 2936, 2091, 1250, 1210, 3167, 3138, 246, 1191, 1091, 239, 1618, 451], [125, 1510, 2110, 3009, 1778, 1285, 938, 1419, 68, 809, 2600, 491, 492, 1897, 978, 2401, 2711, 779, 348, 752, 2074, 3128, 1260, 1871, 1244, 1799, 735, 1223, 2239, 1419, 791, 1997, 2045, 3275, 2715, 3147, 250, 3157, 878, 1816, 1889, 3318, 1364, 1787, 2863, 1533, 1639, 1559, 2493, 1826, 2511, 1427, 844, 2177, 428, 1155, 1057, 3018, 207, 43, 2134, 602, 3327, 3013, 179, 1926, 838, 3004, 3158, 90, 2275, 534, 3006, 2862, 2681, 1791, 3046, 2263, 3065, 985, 2779, 732, 2646, 2516, 2047, 79, 1034, 2434, 1120, 1250, 2537, 609, 2270, 3287, 786, 2528, 344, 2972, 1448, 1516, 275, 128, 2558, 1660, 1027, 2989, 3241, 2639, 2732, 227, 362, 1615, 591, 2044, 1780, 1745, 550, 536, 2711, 628, 1441, 1748, 1709, 1869, 2078, 687, 3015, 1322, 1432, 2658, 3140, 2281, 2191, 323, 138, 654, 1176, 850, 2368, 2482, 12, 3080, 1749, 1813, 3322, 3027, 65, 298, 2844, 1375, 3116, 728, 1257, 1884, 890, 2929, 1469, 3037, 2862, 2379, 672, 1024, 2695, 1775, 1282, 542, 2094, 531, 1913, 3001, 2015, 1040, 2433, 2971, 140, 2241, 1209, 636, 836, 2245, 592, 823, 3328, 1526, 459, 1862, 3120, 2843, 1484, 3174, 1490, 3225, 1991, 740, 415, 2169, 1873, 3322, 795, 2649, 3272, 418, 1002, 2662, 2162, 1275, 2861, 2247, 2890, 134, 2181, 1308, 2549, 976, 574, 2913, 1394, 2749, 3158, 2666, 2592, 1712, 725, 1962, 171, 1324, 2697, 718, 1202, 1190, 3133, 3115, 2979, 221, 433, 1932, 801, 1204, 1392, 46, 1184, 3102, 1601, 1880, 3110, 2858, 3208, 461, 1577, 3170, 1715, 2465, 3150, 2297, 542, 1373], [129, 3281, 1891, 987, 608, 1105, 536, 193, 517, 1519, 230, 2266, 1852, 1290, 1686, 1876, 1797, 2312, 2503, 556, 420, 1266, 2259, 2616, 230, 1176, 2515, 291, 3169, 1769, 1159, 3237, 2988, 934, 2904, 1271, 570, 2276, 2989, 2393, 1965, 695, 2379, 1903, 971, 165, 210, 2288, 1241, 243, 1719, 551, 1060, 1233, 1384, 2422, 2036, 3001, 425, 2274, 307, 1758, 2723, 2651, 1423, 1577, 395, 610, 1573, 2921, 2026, 584, 1903, 2244, 3222, 520, 1770, 811, 1289, 1722, 786, 2263, 2679, 2071, 2698, 1651, 1006, 2944, 1272, 726, 2615, 1124, 440, 2276, 2512, 574, 2680, 1050, 1004, 45, 2342, 1647, 2928, 1933, 2311, 148, 1034, 2048, 1445, 1002, 15, 136, 2344, 1942, 109, 291, 656, 2244, 2034, 305, 2914, 1130, 1918, 305, 587, 932, 1431, 1574, 47, 2833, 3201, 2256, 1489, 961, 2810, 2670, 2188, 1434, 2185, 1288, 2792, 3142, 2263, 2399, 2350, 115, 2424, 2344, 2261, 1936, 1724, 2299, 446, 2972, 1929, 780, 1832, 835, 1574, 1361, 2763, 2881, 313, 3294, 1868, 2936, 1533, 1264, 553, 2251, 1071, 2463, 3150, 2330, 826, 3275, 1284, 1996, 2776, 925, 847, 1197, 3217, 2821, 2864, 1138, 915, 2495, 14, 1451, 3150, 927, 1371, 1069, 1247, 121, 1147, 1844, 1608, 1240, 1748, 1637, 3270, 1827, 3217, 837, 2605, 1693, 2588, 2886, 901, 1535, 459, 428, 154, 2854, 1067, 2096, 2589, 55, 396, 1053, 46, 154, 1228, 3036, 328, 128, 72, 204, 2303, 3104, 112, 489, 377, 1990, 145, 2473, 2994, 859, 1758, 1730, 291, 517, 2892, 3093, 1430, 2643, 1636, 837, 59, 1968, 460, 1939, 3307, 185]] BHat * rHat: [[3177, 2307, 2045, 211, 502, 2182, 280, 2061, 1553, 1500, 2903, 1612, 1218, 2202, 3131, 26, 1881, 1487, 3171, 1176, 1953, 232, 887, 2834, 2475, 1504, 1778, 1293, 194, 1958, 1224, 1530, 1718, 1679, 1414, 390, 1106, 1685, 416, 399, 1732, 1013, 2278, 1386, 3112, 1003, 516, 1180, 2108, 962, 633, 2541, 2704, 2031, 2667, 203, 3160, 2046, 477, 887, 448, 1666, 742, 2912, 2329, 56, 1688, 2262, 1513, 1327, 709, 2954, 395, 630, 661, 941, 2012, 1957, 1816, 1923, 918, 1565, 1838, 859, 1923, 2054, 58, 1737, 2812, 1887, 2569, 108, 2063, 971, 1718, 2233, 1898, 344, 517, 2919, 955, 16, 1172, 2114, 620, 382, 1751, 3232, 3138, 2853, 2268, 615, 3031, 188, 2982, 1177, 494, 14, 2450, 3270, 2362, 2313, 1171, 2530, 3105, 2013, 726, 507, 626, 2708, 405, 3037, 2565, 43, 2351, 858, 1215, 1800, 268, 2370, 2945, 1237, 2408, 125, 156, 651, 2315, 2590, 3107, 2172, 2577, 2998, 2058, 1320, 282, 1180, 2891, 3096, 174, 2048, 20, 3163, 1973, 844, 283, 3136, 732, 1697, 409, 906, 2185, 812, 1788, 738, 2249, 1968, 1649, 2209, 2856, 1061, 775, 1351, 746, 556, 1226, 1770, 2504, 2836, 1207, 2312, 2080, 275, 2630, 2516, 1272, 1101, 2973, 1436, 1524, 3035, 454, 2458, 1753, 1931, 1964, 92, 1254, 3250, 2434, 2808, 2506, 1511, 325, 464, 1494, 2469, 207, 1521, 2190, 2403, 239, 3050, 1137, 423, 574, 355, 655, 1042, 2432, 259, 310, 2204, 1840, 2348, 1549, 2843, 1785, 1748, 239, 2160, 1567, 776, 1617, 1229, 2520, 421, 3261, 3065, 1618, 2951, 654, 2350, 867, 386, 1073, 366], [1396, 3277, 3123, 1246, 892, 1821, 416, 1095, 2313, 2155, 2538, 2380, 1873, 1203, 2992, 2095, 2261, 1877, 2457, 2468, 495, 1649, 1243, 1662, 2288, 2281, 2418, 1597, 2094, 3288, 1542, 806, 2473, 903, 1672, 90, 2657, 1705, 1626, 1477, 487, 919, 1259, 3171, 1721, 857, 1687, 346, 1801, 1593, 1652, 660, 1968, 97, 2612, 2233, 2873, 2963, 1398, 472, 1926, 1154, 2078, 269, 3280, 1349, 2388, 93, 1133, 165, 1737, 1830, 2177, 1312, 2229, 1327, 488, 2667, 1459, 1308, 1783, 2551, 2327, 1986, 1383, 1908, 107, 2509, 2191, 3272, 3040, 3279, 3275, 1218, 2459, 1888, 87, 1165, 1375, 1875, 2271, 2946, 2299, 1128, 495, 552, 688, 3004, 152, 410, 1706, 632, 2611, 2036, 1790, 2214, 1592, 844, 1472, 2743, 1792, 252, 585, 359, 2170, 1522, 1900, 65, 74, 2510, 2767, 2301, 372, 1756, 549, 1051, 1007, 72, 2808, 1828, 3141, 2584, 200, 563, 3181, 1327, 368, 3293, 257, 774, 221, 26, 308, 2068, 578, 272, 1610, 1013, 468, 1070, 220, 1664, 1234, 601, 1194, 2200, 2547, 2965, 1694, 534, 2042, 1404, 2826, 2958, 1936, 3262, 1578, 1323, 2605, 457, 2837, 669, 2711, 2288, 2007, 773, 1257, 2458, 943, 240, 190, 3281, 3227, 2377, 69, 1314, 1833, 1513, 2404, 2121, 3097, 1291, 2166, 3246, 2954, 1836, 1516, 2412, 72, 833, 101, 2060, 157, 1939, 885, 1336, 3167, 2181, 206, 2808, 334, 1889, 1535, 767, 2805, 732, 2998, 356, 160, 3208, 1443, 1173, 193, 1504, 2434, 3227, 183, 82, 2620, 3273, 3081, 767, 1207, 607, 2747, 1262, 972, 2984, 2697, 203, 1905, 962, 744, 2490, 542, 3117], [36, 2141, 2507, 2722, 695, 674, 2402, 2411, 1481, 2602, 3005, 1950, 2693, 1536, 873, 2707, 1997, 527, 885, 22, 2263, 994, 415, 2981, 386, 1029, 2066, 274, 3196, 441, 273, 3108, 1768, 2146, 2047, 2282, 2835, 1038, 385, 2576, 2918, 208, 255, 2576, 2187, 874, 3139, 835, 2396, 1696, 63, 2747, 3205, 242, 96, 457, 2308, 3260, 1349, 2451, 1719, 2309, 967, 407, 2934, 293, 2298, 3205, 1763, 614, 124, 77, 973, 136, 549, 118, 637, 2582, 169, 1297, 3001, 1396, 1595, 761, 759, 433, 729, 27, 1740, 1629, 1811, 542, 2412, 322, 844, 137, 2249, 2113, 21, 2530, 612, 1769, 249, 2471, 3212, 2598, 2453, 3208, 329, 1930, 937, 2077, 57, 735, 2468, 3244, 3315, 374, 2168, 142, 2230, 475, 1683, 838, 2564, 2306, 102, 3014, 3063, 21, 3024, 2846, 1269, 3079, 224, 2172, 2107, 1115, 3317, 3328, 1378, 923, 401, 1672, 618, 1277, 377, 2658, 513, 1936, 666, 702, 584, 2002, 36, 3017, 207, 2434, 549, 1219, 2350, 2086, 2559, 756, 628, 805, 1905, 3150, 2897, 2029, 2765, 247, 1230, 1896, 2107, 2033, 1011, 915, 1524, 140, 1635, 2194, 2348, 2336, 2280, 2779, 3115, 1641, 1595, 2152, 2749, 1450, 2547, 3306, 2367, 586, 1598, 717, 1996, 779, 764, 2292, 3140, 1476, 2384, 308, 1295, 1623, 1989, 548, 796, 1048, 1658, 2125, 2501, 2980, 530, 1418, 1004, 275, 8, 712, 3316, 1078, 1101, 2937, 616, 2132, 2592, 2561, 2491, 2334, 1656, 1386, 2760, 809, 1606, 1941, 3010, 593, 1688, 1666, 2927, 1582, 2431, 1202, 1691, 2145, 1046, 2138, 1407, 1859, 645, 1954, 198, 527], [1506, 379, 1200, 924, 1096, 407, 3201, 2679, 1175, 2383, 151, 1150, 1101, 3211, 1477, 2148, 1078, 2363, 3224, 2756, 1525, 2512, 583, 785, 328, 2669, 895, 2307, 949, 2127, 1386, 1876, 2459, 1636, 686, 2969, 2242, 2840, 1416, 826, 2899, 885, 2234, 37, 425, 1235, 1578, 1055, 2907, 525, 858, 430, 1908, 15, 3221, 933, 1880, 2226, 2412, 2800, 1729, 959, 820, 2324, 15, 1322, 3226, 1066, 2086, 1501, 2703, 2905, 3003, 1714, 241, 2339, 1210, 1327, 3154, 1245, 1820, 1694, 1151, 1516, 1575, 1272, 1425, 2292, 618, 809, 2588, 988, 2176, 1135, 2106, 2675, 924, 1053, 1126, 2056, 2818, 1862, 1974, 818, 379, 2933, 2314, 1803, 862, 2891, 934, 2381, 842, 446, 3241, 142, 2881, 550, 2934, 3284, 989, 1467, 2565, 2278, 1305, 245, 708, 2434, 1235, 1982, 1056, 2099, 459, 2260, 2464, 2604, 2231, 2657, 2326, 842, 1833, 3224, 395, 72, 1997, 3071, 1006, 2584, 685, 1198, 1230, 939, 909, 2634, 1056, 2503, 2068, 3074, 3163, 2885, 1216, 2512, 1366, 1287, 497, 3168, 1704, 1239, 2795, 829, 1926, 1073, 1499, 1657, 3278, 1090, 1274, 809, 535, 1055, 2486, 3073, 2668, 2030, 2353, 1250, 3195, 696, 493, 1422, 2327, 971, 464, 1228, 115, 827, 2712, 631, 1340, 69, 2131, 505, 503, 879, 1769, 3048, 1737, 937, 2082, 2227, 183, 2823, 20, 2032, 559, 157, 2032, 2079, 2871, 1940, 1468, 2682, 2785, 2394, 2195, 3067, 2872, 2930, 2607, 3300, 1986, 3165, 3308, 282, 397, 2735, 1390, 2599, 1483, 315, 2720, 1197, 2965, 2466, 1095, 1057, 1383, 1411, 2811, 247, 2240, 1499, 2765, 2881, 144, 2083]] NTTInverse(BHat * rHat): [[3070, 1403, 2569, 1535, 2889, 2555, 885, 3020, 1056, 2040, 995, 873, 2394, 1510, 2542, 2103, 689, 51, 1822, 3032, 2675, 2707, 2636, 1256, 3207, 2846, 1050, 1173, 636, 530, 1794, 746, 1513, 286, 2642, 2601, 3062, 2961, 1264, 818, 388, 194, 2629, 1173, 973, 1503, 1815, 1303, 1481, 548, 2909, 1001, 1315, 869, 1852, 2329, 1081, 1718, 2971, 2064, 1649, 1337, 3030, 1542, 145, 243, 1749, 559, 2441, 1805, 2460, 49, 2615, 1890, 1190, 2547, 2409, 1359, 1717, 3221, 369, 639, 964, 682, 232, 375, 1578, 1223, 248, 1212, 1333, 599, 998, 234, 1285, 324, 3145, 2356, 642, 766, 19, 2276, 2553, 3123, 146, 2823, 2051, 2636, 2687, 2320, 6, 2552, 2385, 902, 2438, 1118, 3145, 2935, 58, 485, 2846, 2641, 2949, 181, 2455, 2681, 390, 534, 55, 3226, 1641, 2901, 567, 2387, 765, 2375, 1468, 442, 1303, 1543, 97, 70, 2844, 577, 323, 2056, 1844, 2345, 3185, 1016, 265, 672, 958, 570, 2765, 693, 2210, 1849, 1092, 2915, 502, 164, 1522, 2167, 2705, 1425, 967, 271, 1125, 1629, 3157, 1363, 1959, 784, 63, 2079, 551, 305, 3022, 1790, 438, 1106, 1757, 17, 1650, 3176, 3066, 923, 1911, 2003, 2754, 1085, 1952, 1946, 354, 1958, 418, 2788, 56, 1736, 2304, 449, 3114, 14, 2888, 1925, 2867, 2199, 1207, 2101, 310, 2433, 3082, 1564, 1887, 3159, 2687, 1239, 1243, 2119, 1375, 330, 1968, 1013, 3003, 2343, 1979, 2092, 3238, 925, 3011, 841, 2468, 753, 3189, 1128, 366, 2024, 1769, 2850, 3171, 964, 1213, 3029, 1350, 304, 568, 1149, 1915, 2239, 1087, 3040, 935, 1720, 1562, 139], [607, 2205, 1165, 535, 1987, 2768, 2696, 3197, 1435, 2405, 88, 919, 2087, 1426, 2285, 2705, 2061, 620, 176, 1481, 2653, 1231, 3007, 1679, 1172, 209, 682, 3254, 118, 272, 1751, 2843, 2706, 1229, 3072, 442, 364, 1148, 1240, 1159, 1924, 1797, 266, 1967, 464, 2058, 712, 711, 3231, 1476, 1509, 1240, 1097, 1483, 1814, 2360, 797, 1204, 10, 3184, 2085, 2110, 1238, 2570, 2151, 1553, 2796, 2378, 606, 1974, 2380, 334, 2562, 846, 581, 2588, 85, 1957, 2392, 1270, 1319, 2175, 1335, 1388, 2066, 1459, 1225, 231, 883, 636, 2465, 1757, 2869, 2989, 1844, 2453, 174, 2735, 960, 3092, 1892, 1581, 2203, 1849, 760, 486, 1781, 324, 1399, 1515, 1252, 3060, 3171, 2483, 3214, 2381, 3245, 673, 300, 2373, 641, 1877, 1933, 1040, 2106, 2787, 729, 2182, 1399, 2782, 1603, 651, 2753, 1199, 563, 1160, 3327, 1613, 2774, 929, 750, 2673, 224, 1304, 1344, 1447, 3078, 807, 2259, 3128, 690, 2352, 390, 2291, 247, 3002, 2703, 2380, 1648, 712, 1004, 181, 725, 1689, 1460, 1599, 320, 105, 1158, 3174, 1670, 2567, 1327, 1997, 2759, 1048, 2583, 2, 1594, 2143, 2779, 514, 263, 1083, 2990, 1320, 857, 320, 823, 3180, 863, 1403, 1455, 1183, 359, 1238, 881, 2343, 2934, 2977, 1768, 1878, 1486, 1744, 1995, 1156, 1071, 2892, 347, 69, 3113, 1485, 1068, 34, 175, 2608, 1207, 2821, 2819, 266, 2754, 2746, 2543, 2045, 3263, 1163, 2036, 1822, 1520, 821, 2146, 1432, 2671, 2500, 2942, 629, 1701, 1012, 1352, 2367, 1684, 3211, 641, 1344, 3014, 2212, 3179, 2455, 2922, 65, 2953, 2558, 1974, 463, 1995, 2380], [1770, 3266, 3043, 128, 261, 2123, 2318, 1679, 2312, 2908, 1415, 2106, 952, 231, 1318, 2672, 2033, 2343, 2062, 1271, 2885, 2749, 2830, 1397, 1458, 619, 156, 3146, 13, 712, 2290, 2997, 2389, 285, 2680, 215, 1442, 237, 311, 281, 2575, 1402, 734, 3001, 1319, 279, 1769, 2017, 1170, 2232, 2479, 719, 2499, 2068, 2674, 2293, 1093, 2012, 2581, 2347, 2686, 625, 2527, 1482, 2950, 3198, 1910, 743, 1169, 1634, 1515, 3039, 2747, 2298, 1090, 1486, 789, 1648, 2771, 2658, 3058, 673, 3189, 1781, 2653, 106, 71, 1122, 2394, 3152, 1859, 3062, 157, 1835, 1027, 1134, 2264, 3036, 2598, 2207, 781, 40, 1023, 1027, 2254, 2111, 2079, 2093, 2120, 2697, 595, 3042, 1497, 465, 1059, 82, 256, 412, 2995, 1587, 368, 2826, 2505, 2406, 1566, 2634, 2034, 1682, 2483, 1108, 651, 1706, 3294, 3012, 3213, 1568, 1147, 650, 1416, 2066, 43, 2743, 396, 2903, 2214, 3254, 639, 113, 1157, 84, 60, 2678, 357, 720, 2255, 427, 847, 3204, 268, 737, 2590, 1831, 2037, 2516, 2417, 2553, 1542, 2758, 2190, 962, 3068, 2659, 2086, 3133, 1740, 2634, 180, 1791, 930, 1437, 1946, 923, 2351, 2992, 293, 2512, 1552, 2326, 2340, 539, 1345, 1565, 1101, 1365, 3161, 2904, 382, 1654, 814, 2694, 17, 1715, 1013, 901, 569, 2283, 2331, 1325, 1572, 535, 2094, 991, 1320, 228, 884, 135, 2421, 97, 1859, 3246, 3280, 2695, 2668, 2268, 1157, 2547, 2436, 385, 805, 801, 944, 2865, 1279, 1857, 1461, 1916, 2123, 495, 1284, 1453, 1985, 2046, 1624, 3183, 2364, 30, 1537, 1862, 2739, 80, 2579, 1215, 2397, 2192, 932, 2914], [1604, 907, 2780, 2896, 1440, 1196, 865, 2226, 1719, 2596, 1431, 1360, 2267, 2487, 547, 1929, 1366, 1922, 1848, 2866, 1071, 2029, 2971, 2938, 92, 1243, 2389, 1985, 1817, 3303, 1704, 2386, 124, 1364, 2576, 727, 450, 944, 1975, 793, 436, 3138, 2370, 811, 330, 27, 977, 2684, 509, 2572, 1129, 656, 2651, 3175, 2299, 2138, 1874, 1231, 1038, 2930, 954, 324, 1412, 3221, 578, 2157, 157, 2462, 147, 835, 1855, 1831, 3277, 3186, 2064, 3310, 2081, 1046, 1255, 2715, 784, 3111, 821, 2619, 161, 2911, 2020, 427, 1280, 1918, 582, 2287, 3104, 1504, 2902, 1566, 1491, 1947, 1901, 3135, 3252, 3142, 8, 1941, 457, 3045, 2681, 2888, 2211, 816, 624, 432, 1698, 64, 2915, 916, 744, 394, 1448, 1090, 2144, 1006, 813, 692, 987, 2205, 1951, 3121, 1438, 671, 1765, 2188, 2533, 246, 3109, 2501, 2362, 3007, 590, 2924, 2032, 2371, 2796, 3178, 442, 665, 1942, 2701, 787, 1384, 1107, 1575, 157, 1914, 2380, 3203, 890, 1299, 2312, 1837, 2649, 1035, 349, 2949, 342, 313, 1645, 1191, 415, 521, 2850, 1227, 1525, 2183, 1291, 2753, 2684, 3300, 1842, 1332, 984, 2275, 98, 3213, 956, 2387, 2654, 3212, 1764, 2884, 907, 584, 3036, 2211, 314, 465, 1722, 397, 2501, 2477, 337, 1110, 2683, 3042, 1210, 1275, 2964, 867, 692, 1958, 2356, 1419, 1437, 541, 2149, 2496, 1907, 477, 2210, 1782, 1923, 2141, 1793, 734, 1486, 3237, 2369, 72, 892, 893, 922, 179, 2550, 3256, 1785, 781, 3317, 3235, 2821, 3205, 1024, 3101, 913, 856, 2667, 3290, 3034, 1088, 1053, 1942, 1973, 769, 1307, 895, 2929, 2976]] u = NTTInverse(BHat * rHat) + e1: [[3070, 1402, 2568, 1534, 2888, 2553, 885, 3019, 1058, 2038, 994, 872, 2394, 1510, 2544, 2102, 688, 51, 1823, 3031, 2676, 2707, 2637, 1256, 3208, 2845, 1051, 1172, 635, 530, 1794, 748, 1515, 287, 2643, 2601, 3062, 2961, 1264, 816, 389, 192, 2629, 1172, 974, 1501, 1814, 1302, 1482, 549, 2909, 1002, 1315, 869, 1851, 2329, 1080, 1717, 2973, 2064, 1648, 1337, 3029, 1540, 145, 242, 1749, 559, 2441, 1804, 2459, 51, 2613, 1892, 1190, 2545, 2409, 1360, 1715, 3220, 368, 637, 965, 683, 231, 375, 1577, 1223, 248, 1213, 1332, 599, 997, 233, 1284, 325, 3147, 2356, 641, 765, 19, 2276, 2554, 3122, 145, 2824, 2052, 2637, 2687, 2320, 5, 2552, 2386, 903, 2438, 1119, 3145, 2934, 57, 487, 2845, 2641, 2949, 181, 2455, 2680, 390, 535, 55, 3226, 1640, 2901, 566, 2388, 765, 2374, 1469, 443, 1303, 1544, 98, 70, 2845, 575, 322, 2057, 1843, 2345, 3185, 1016, 265, 673, 958, 571, 2766, 693, 2210, 1851, 1091, 2915, 502, 164, 1522, 2167, 2704, 1426, 966, 269, 1124, 1629, 3155, 1364, 1959, 784, 63, 2078, 552, 305, 3023, 1789, 438, 1106, 1757, 18, 1650, 3175, 3066, 923, 1913, 2002, 2755, 1086, 1953, 1946, 354, 1959, 417, 2790, 56, 1737, 2303, 450, 3115, 14, 2887, 1923, 2868, 2200, 1208, 2100, 309, 2432, 3084, 1564, 1887, 3159, 2686, 1239, 1242, 2119, 1375, 330, 1968, 1013, 3003, 2341, 1980, 2090, 3239, 925, 3011, 842, 2467, 752, 3188, 1128, 366, 2026, 1771, 2850, 3172, 964, 1213, 3028, 1349, 304, 567, 1147, 1916, 2237, 1088, 3041, 935, 1720, 1562, 140], [607, 2207, 1164, 535, 1988, 2767, 2696, 3197, 1435, 2404, 89, 919, 2087, 1426, 2284, 2705, 2063, 618, 175, 1481, 2654, 1231, 3008, 1679, 1171, 210, 681, 3253, 117, 272, 1751, 2843, 2705, 1228, 3071, 443, 363, 1149, 1240, 1157, 1925, 1796, 268, 1966, 464, 2059, 712, 709, 3231, 1475, 1509, 1240, 1096, 1482, 1812, 2360, 795, 1204, 9, 3185, 2085, 2110, 1237, 2569, 2152, 1555, 2797, 2377, 606, 1973, 2379, 335, 2561, 845, 581, 2589, 85, 1956, 2392, 1271, 1320, 2176, 1335, 1388, 2064, 1460, 1226, 231, 884, 635, 2467, 1756, 2868, 2988, 1842, 2455, 173, 2736, 960, 3091, 1891, 1581, 2201, 1849, 759, 487, 1782, 326, 1399, 1516, 1251, 3060, 3171, 2483, 3215, 2380, 3246, 673, 300, 2373, 640, 1877, 1933, 1039, 2107, 2788, 729, 2183, 1398, 2782, 1602, 652, 2751, 1200, 563, 1161, 3327, 1613, 2775, 930, 751, 2672, 225, 1302, 1346, 1447, 3079, 806, 2257, 3129, 689, 2354, 392, 2292, 247, 3003, 2701, 2380, 1648, 712, 1003, 180, 725, 1690, 1461, 1600, 319, 104, 1159, 3175, 1671, 2566, 1326, 1997, 2760, 1049, 2582, 2, 1594, 2143, 2781, 514, 263, 1085, 2990, 1319, 858, 320, 822, 3182, 863, 1401, 1455, 1185, 358, 1238, 881, 2343, 2935, 2976, 1770, 1879, 1487, 1743, 1994, 1154, 1070, 2892, 346, 70, 3115, 1485, 1068, 34, 176, 2606, 1206, 2821, 2818, 268, 2754, 2747, 2541, 2044, 3264, 1162, 2036, 1823, 1520, 820, 2145, 1431, 2669, 2502, 2942, 627, 1700, 1012, 1352, 2366, 1683, 3211, 643, 1343, 3012, 2213, 3179, 2454, 2923, 65, 2952, 2557, 1974, 464, 1995, 2381], [1769, 3266, 3044, 127, 262, 2122, 2317, 1681, 2310, 2909, 1416, 2105, 952, 230, 1318, 2670, 2033, 2342, 2063, 1270, 2886, 2751, 2831, 1397, 1458, 618, 155, 3148, 11, 713, 2289, 2998, 2389, 285, 2682, 215, 1442, 238, 311, 282, 2574, 1402, 734, 3002, 1318, 277, 1770, 2017, 1170, 2231, 2478, 720, 2498, 2067, 2674, 2294, 1093, 2012, 2581, 2348, 2684, 625, 2526, 1483, 2950, 3198, 1910, 743, 1169, 1634, 1515, 3039, 2747, 2298, 1090, 1484, 788, 1647, 2771, 2660, 3058, 672, 3189, 1781, 2653, 106, 72, 1123, 2395, 3152, 1860, 3063, 158, 1835, 1026, 1134, 2263, 3038, 2599, 2207, 780, 40, 1023, 1027, 2254, 2110, 2078, 2093, 2119, 2698, 596, 3042, 1498, 463, 1057, 84, 257, 413, 2995, 1588, 367, 2825, 2506, 2407, 1565, 2635, 2034, 1681, 2485, 1107, 650, 1706, 3293, 3011, 3212, 1566, 1147, 649, 1417, 2066, 43, 2743, 394, 2903, 2215, 3252, 641, 113, 1158, 85, 60, 2677, 358, 719, 2255, 427, 846, 3205, 268, 738, 2589, 1830, 2038, 2517, 2417, 2553, 1542, 2757, 2189, 960, 3068, 2658, 2085, 3132, 1740, 2634, 182, 1792, 930, 1437, 1946, 923, 2352, 2994, 291, 2512, 1554, 2328, 2341, 539, 1344, 1566, 1100, 1365, 3162, 2905, 381, 1654, 814, 2694, 17, 1715, 1013, 902, 569, 2284, 2330, 1324, 1571, 535, 2093, 991, 1320, 229, 884, 133, 2422, 97, 1858, 3245, 3279, 2695, 2668, 2266, 1157, 2548, 2437, 387, 804, 803, 945, 2866, 1280, 1857, 1460, 1917, 2121, 494, 1284, 1451, 1987, 2047, 1625, 3182, 2364, 31, 1537, 1861, 2739, 79, 2581, 1213, 2396, 2191, 931, 2914], [1603, 907, 2780, 2897, 1440, 1197, 866, 2225, 1719, 2596, 1432, 1359, 2268, 2488, 547, 1928, 1364, 1924, 1849, 2866, 1073, 2029, 2971, 2938, 93, 1243, 2389, 1985, 1818, 3304, 1703, 2386, 125, 1365, 2575, 728, 450, 943, 1977, 793, 436, 3137, 2369, 811, 329, 27, 976, 2684, 509, 2572, 1129, 656, 2651, 3175, 2298, 2136, 1873, 1232, 1040, 2930, 953, 323, 1413, 3222, 579, 2159, 156, 2464, 146, 835, 1855, 1830, 3279, 3184, 2064, 3310, 2082, 1047, 1256, 2714, 784, 3111, 821, 2619, 161, 2912, 2021, 429, 1281, 1918, 581, 2286, 3103, 1503, 2903, 1567, 1492, 1947, 1903, 3136, 3252, 3143, 7, 1942, 458, 3047, 2681, 2890, 2211, 815, 623, 432, 1697, 65, 2915, 918, 746, 394, 1447, 1091, 2145, 1006, 812, 693, 986, 2204, 1951, 3120, 1437, 670, 1763, 2189, 2534, 247, 3109, 2500, 2363, 3008, 590, 2925, 2032, 2373, 2796, 3179, 443, 665, 1942, 2699, 789, 1384, 1108, 1576, 158, 1914, 2380, 3203, 890, 1299, 2313, 1836, 2651, 1036, 348, 2949, 341, 312, 1643, 1192, 416, 521, 2848, 1227, 1525, 2185, 1290, 2751, 2684, 3301, 1843, 1330, 983, 2275, 98, 3213, 957, 2386, 2653, 3212, 1766, 2882, 908, 585, 3035, 2211, 312, 465, 1721, 396, 2502, 2477, 337, 1111, 2682, 3041, 1211, 1274, 2964, 866, 693, 1960, 2355, 1417, 1438, 539, 2149, 2495, 1908, 478, 2210, 1782, 1923, 2140, 1794, 734, 1484, 3238, 2369, 73, 892, 895, 922, 180, 2551, 3255, 1785, 782, 3318, 3235, 2822, 3206, 1022, 3099, 913, 855, 2668, 3290, 3034, 1088, 1055, 1940, 1975, 770, 1306, 897, 2929, 2977]] mu: [1665, 0, 1665, 0, 0, 0, 0, 0, 1665, 0, 0, 1665, 0, 0, 1665, 1665, 0, 0, 0, 1665, 1665, 0, 1665, 0, 0, 0, 1665, 1665, 0, 1665, 1665, 1665, 0, 1665, 1665, 0, 0, 1665, 0, 0, 0, 1665, 1665, 0, 1665, 0, 1665, 0, 1665, 1665, 0, 1665, 1665, 0, 0, 0, 1665, 0, 1665, 1665, 0, 1665, 1665, 0, 0, 0, 0, 1665, 1665, 1665, 0, 1665, 0, 0, 0, 1665, 1665, 0, 0, 0, 0, 0, 1665, 0, 1665, 1665, 1665, 1665, 0, 0, 0, 1665, 1665, 1665, 0, 1665, 1665, 1665, 0, 1665, 0, 0, 1665, 1665, 0, 1665, 1665, 1665, 0, 1665, 0, 0, 0, 0, 0, 1665, 0, 1665, 0, 0, 1665, 0, 0, 1665, 1665, 0, 0, 1665, 0, 1665, 1665, 1665, 0, 0, 0, 0, 0, 0, 1665, 0, 1665, 1665, 1665, 0, 0, 0, 1665, 0, 0, 0, 0, 1665, 1665, 1665, 1665, 0, 1665, 0, 0, 0, 0, 0, 0, 1665, 1665, 0, 1665, 0, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 0, 0, 0, 1665, 1665, 0, 1665, 1665, 1665, 0, 0, 0, 1665, 1665, 1665, 0, 0, 1665, 0, 0, 0, 0, 1665, 0, 1665, 0, 0, 0, 1665, 0, 1665, 0, 0, 1665, 1665, 0, 1665, 0, 0, 1665, 0, 1665, 1665, 0, 1665, 1665, 1665, 0, 1665, 1665, 1665, 1665, 1665, 0, 0, 1665, 0, 1665, 0, 0, 1665, 1665, 1665, 1665, 1665, 0, 0, 1665, 0, 0, 1665, 1665, 1665, 0, 0, 0, 1665, 1665, 1665, 1665, 0] tHat^T * rHat: [2521, 1369, 68, 1528, 885, 2690, 1603, 1010, 2439, 2475, 3038, 2950, 2802, 515, 997, 2224, 265, 2892, 1640, 1056, 2648, 2894, 761, 3110, 1444, 809, 1776, 153, 1273, 2927, 1206, 474, 1024, 1319, 709, 1223, 372, 1046, 702, 2886, 1740, 1983, 3267, 3286, 2119, 119, 2873, 2020, 2698, 873, 388, 2392, 1860, 1105, 1484, 296, 2039, 103, 2512, 3108, 1212, 476, 1874, 422, 2025, 1328, 59, 2041, 835, 2678, 1733, 2812, 1648, 1426, 420, 1770, 2865, 218, 3125, 3324, 2568, 66, 2746, 1487, 2559, 2516, 2680, 3000, 3225, 1933, 2058, 565, 2699, 2311, 436, 989, 1998, 455, 2658, 3143, 1628, 1347, 400, 1533, 526, 2834, 337, 1605, 2508, 2211, 2642, 727, 600, 2363, 1027, 2666, 1051, 592, 1384, 1563, 1353, 2589, 3316, 2491, 3246, 1824, 487, 1599, 1557, 2240, 2645, 601, 78, 1153, 2842, 2609, 2477, 914, 2910, 1203, 795, 1324, 1369, 1941, 350, 3231, 1514, 2083, 1753, 2156, 2885, 2080, 532, 2189, 1530, 1072, 3173, 1407, 2806, 2507, 3309, 1225, 1431, 728, 1562, 183, 1475, 2509, 3181, 3023, 632, 1610, 630, 2779, 1042, 1494, 698, 2106, 2687, 63, 1288, 1777, 1555, 1383, 2064, 1961, 2394, 689, 3249, 500, 656, 2249, 2442, 331, 2729, 2280, 1736, 111, 1669, 1719, 1198, 1197, 2329, 1953, 1931, 2421, 856, 2272, 2114, 412, 597, 2752, 2077, 1388, 2382, 207, 2363, 3299, 3038, 1663, 2261, 3147, 2806, 2432, 2666, 398, 2874, 1470, 2710, 98, 186, 2820, 1241, 3283, 601, 85, 37, 2846, 627, 1262, 238, 816, 1033, 2485, 602, 816, 1408, 2509, 1723, 511, 2256, 1595, 2550, 654, 1254, 780] NTTInverse(tHat^T * rHat): [1412, 1558, 3294, 2350, 2981, 2714, 1658, 564, 2631, 244, 2252, 431, 1955, 3100, 2202, 38, 3093, 2809, 1095, 2136, 2259, 15, 1706, 78, 857, 458, 1099, 1767, 2837, 522, 1536, 1544, 1508, 3242, 1050, 3077, 1549, 2401, 574, 1124, 1293, 3307, 1429, 1156, 1855, 3243, 3173, 2230, 1721, 1805, 2457, 640, 482, 1742, 937, 1105, 1233, 572, 2803, 2059, 1081, 1098, 1681, 1665, 2498, 2846, 536, 2773, 241, 2365, 300, 3112, 1536, 788, 2196, 831, 1930, 406, 2239, 656, 1550, 929, 2924, 195, 622, 43, 77, 2653, 751, 1284, 1538, 25, 1757, 1150, 2694, 811, 2783, 3181, 2082, 1504, 964, 324, 2392, 2445, 1646, 2211, 1253, 1008, 3252, 301, 128, 3261, 1039, 2807, 1094, 2214, 590, 1086, 2116, 1952, 1537, 2226, 3127, 361, 808, 2908, 268, 2253, 1765, 1000, 2632, 3179, 2911, 2830, 2241, 2390, 2276, 2450, 2395, 2700, 1280, 948, 1321, 1284, 1198, 1808, 1192, 1179, 1561, 1365, 1414, 338, 718, 3056, 1338, 281, 2380, 2232, 2846, 2442, 548, 141, 2880, 2664, 1288, 3179, 2325, 647, 2925, 747, 2703, 1598, 1759, 3080, 1446, 2048, 980, 2228, 79, 2430, 1390, 3251, 451, 422, 2767, 700, 3242, 3123, 2623, 3128, 2298, 2766, 2336, 2637, 380, 1826, 783, 1534, 2157, 3240, 2149, 2461, 3317, 623, 1529, 2295, 368, 326, 3064, 2141, 2387, 775, 1550, 3068, 2961, 1202, 1899, 2383, 652, 1455, 2205, 1921, 322, 1857, 784, 1673, 3138, 465, 1388, 1943, 110, 2634, 1909, 3214, 2062, 276, 1304, 1535, 358, 593, 2391, 1968, 108, 449, 1268, 1701, 833, 2384, 3020, 2241, 69, 2209, 2960, 1240, 3207, 2501] e2 + mu: [1665, 3327, 1666, 3328, 1, 2, 0, 1, 1665, 0, 0, 1663, 0, 1, 1665, 1664, 1, 2, 0, 1665, 1665, 1, 1665, 2, 1, 2, 1665, 1663, 2, 1664, 1663, 1667, 1, 1666, 1665, 0, 0, 1664, 0, 1, 3328, 1665, 1663, 1, 1666, 1, 1664, 3328, 1665, 1666, 3327, 1664, 1664, 3327, 0, 0, 1665, 0, 1665, 1664, 0, 1664, 1663, 1, 3328, 0, 2, 1666, 1664, 1665, 0, 1667, 0, 1, 0, 1665, 1666, 1, 0, 1, 0, 1, 1666, 0, 1667, 1664, 1665, 1665, 3328, 0, 2, 1664, 1664, 1665, 0, 1665, 1665, 1665, 1, 1667, 0, 0, 1666, 1663, 1, 1666, 1665, 1666, 3328, 1666, 0, 0, 0, 0, 3327, 1666, 1, 1665, 0, 0, 1665, 3328, 0, 1664, 1665, 0, 0, 1665, 1, 1665, 1666, 1664, 3327, 1, 0, 2, 3328, 1, 1666, 0, 1666, 1665, 1664, 1, 3328, 1, 1665, 3328, 1, 1, 2, 1664, 1666, 1665, 1666, 3328, 1666, 3328, 0, 1, 3328, 1, 1, 1665, 1666, 3328, 1665, 0, 1665, 1665, 1666, 1664, 1666, 1664, 1666, 3328, 3328, 3328, 1665, 1665, 3328, 1666, 1664, 1664, 1, 0, 3328, 1667, 1665, 1667, 3328, 0, 1665, 0, 3327, 2, 3328, 1664, 3327, 1665, 0, 0, 3328, 1665, 3328, 1664, 0, 1, 1664, 1664, 0, 1663, 0, 3328, 1664, 3328, 1665, 1664, 1, 1665, 1666, 1664, 0, 1664, 1664, 1666, 1665, 1664, 0, 3327, 1664, 3328, 1664, 3328, 3328, 1665, 1665, 1665, 1666, 1665, 2, 1, 1665, 0, 0, 1666, 1665, 1666, 3327, 3328, 1, 1666, 1664, 1663, 1666, 0] v = NTTInverse(tHat^T * rHat) + e2 + mu: [3077, 1556, 1631, 2349, 2982, 2716, 1658, 565, 967, 244, 2252, 2094, 1955, 3101, 538, 1702, 3094, 2811, 1095, 472, 595, 16, 42, 80, 858, 460, 2764, 101, 2839, 2186, 3199, 3211, 1509, 1579, 2715, 3077, 1549, 736, 574, 1125, 1292, 1643, 3092, 1157, 192, 3244, 1508, 2229, 57, 142, 2455, 2304, 2146, 1740, 937, 1105, 2898, 572, 1139, 394, 1081, 2762, 15, 1666, 2497, 2846, 538, 1110, 1905, 701, 300, 1450, 1536, 789, 2196, 2496, 267, 407, 2239, 657, 1550, 930, 1261, 195, 2289, 1707, 1742, 989, 750, 1284, 1540, 1689, 92, 2815, 2694, 2476, 1119, 1517, 2083, 3171, 964, 324, 729, 779, 1647, 548, 2918, 2674, 3251, 1967, 128, 3261, 1039, 2807, 1092, 551, 591, 2751, 2116, 1952, 3202, 2225, 3127, 2025, 2473, 2908, 268, 589, 1766, 2665, 969, 1514, 2909, 2831, 2241, 2392, 2275, 2451, 732, 2700, 2946, 2613, 2985, 1285, 1197, 1809, 2857, 1178, 1562, 1366, 1416, 2002, 2384, 1392, 3004, 280, 717, 2231, 2846, 2443, 547, 142, 2881, 1000, 2954, 3178, 661, 647, 1261, 2412, 1040, 3262, 96, 1415, 3112, 2047, 979, 2227, 1744, 766, 1389, 1588, 2115, 2086, 2768, 700, 3241, 1461, 959, 1466, 2297, 2766, 672, 2637, 378, 1828, 782, 3198, 2155, 1576, 2149, 2461, 3316, 2288, 1528, 630, 368, 327, 1399, 476, 2387, 2438, 1550, 3067, 1296, 1201, 235, 718, 653, 3120, 542, 256, 322, 192, 2448, 10, 1474, 2129, 1388, 1941, 1774, 2633, 244, 3213, 2061, 1941, 2969, 3200, 2024, 2258, 2393, 1969, 1773, 449, 1268, 38, 2498, 721, 3018, 2240, 70, 546, 1295, 2903, 1544, 2501] KBar: 62C86B23A76F753CD161DAE4D4B44E900BAACE3D758C356D534FBFAFF6BDCCFA cPrime: 61FF1A8B6117EF118328E88B3227993014DCD075B8A1A7F9801893EEE6405BB960B6B7F6A1A27518A3409139A48B859681CC758F2BCC3EEFB04394A375A5CD71316490938ABFD194B20BCD31B3980261C9ED69BF9B1D7D7659A8040DB1E25D2BA6F703486624B73CACDCA27DB0F7E2408C9448E38873280F5E9950D7CCE252A647580C19904FAD62AEC300BC8E38F05948B63BAD5CE7C90E40C4BC65117761F5F8868F8025D6CEB2C5DF60DE38C3232922087EFCF2CD95DE5E87B6888B88C86CC78315585B2CC688A71B477BFA388DC2334DFA8AA95503D5397E2AE0352903EA6A0AE8B649A914B3525FE58F564BF19CC09F54E105D19BD81054E57001F70BBDD7719449687E9A53B16CA5366A19105A8BA08589AD08DF1300EF4F923BA9E762A82FB09B76E125F2F274D617BF30EAB465ECF24D3707AD300D9AFC1CF1DC40EE7D4EEA6D150E6F0A31DB9F8F92BA8EEEB35D7445589B046BA79EFE231106CF0A75712AB392724C53EFF9F5733BEE0D6A44D0B6F515D0F5E40B1B1E17E67AED3C81D00AC468A28F8453D4B0DA809E57D823F28D61ED0B59A08C622972D99179DA8636C45F1CE8F6252AC86D91B5E92997014E3F5089E68BC52CED5DAE6D5B175FE2D61928465059724C835902D7612CDB69CDAC664FC1C9CB11203A8C7B71486E97B7D1BC6A98F493DCBEC8E629558ED361091293D1B5D2096CEB9FC7AFEE71DB7CCFE482B68A196429FF04D15903E7A75C7BB5F622C36971694559FF07DFAA79E41C362B22643CD39BD9E1D3D6C2A306B5F1102C266EEE67DCDACF36697A836F203838EC110308C90A3D01570CB3668ABA50340E40F54CFA6A9E8862532F5F19848AA11FD34FC86B7FCB1637F4E5A1D03AFCE44124E4E460B84C63496ADED55801DF2517A90AB061C8E63AB6B14BE1694D6F389DD85F5639C5783AFCA0146E6A1EB0C40563C137010DB60BBC3D6374D6F3A892DEBC064701C64BECCB8E2C33B740CC7ED49D108A8C4656818DF5F7D91EAAA446AC6CCDE30C6D3D1BF66E4E3B7B6B81E3CB17227F80DB0096E6BE7D859C09713749FCA21530FE1A716EBE325504319BD0EA2A7D7713607CB679B0A0B2268D493B67C0481872177FFD2593F3ACF691CEE99A36ECA722579EFAA59ACC59EF8CEA9108E620B06056C19D3C1EB91E8634DE4957706DFA8F9D0A9E0CD4094F6B95A83F118A513EBFE5E99AEB88A268E0097FCC3C7AE250B681933BBC2A8F5381F94D156434A87E9EE37E78C27A0CDAEEA9814BCB43DF538DBE628C802C1A94E0CDDCD0CD5A0F8220DA97C2383936A33919FCDC11D70ED4437DD2D7C73CD0C3BB90CA7070228FE8D64A1C9D56E6B34830EF300B5AA6EC6C78A5425AE6F7AD0EFDD527CF0AF8E09B56E495BE66F665C64B0A42C5C4B24680480AD2E5C11D991F7E3DA759AEC802F176DDF11EF71469DC13B3A3E03699519858AC6FC65C27FA4CEFDA09C82E8F958E018DD5255CA2F628E0DA7391ABED6D37705528AB22EC71DC8836D7FD4645944703A51CC74D297092FCE139E8976F8BE9C5F86390B74D401A8C8153112201133D0C517C6CE7A38C086069CE3971F1AD28F3E5D01B56A480B417A016AEA46394CDF764812918D8AB0501D5D18CE13FBD3DE91F504215CCD0E2D17B7E963C867F6F132114E36459FC5AF7CEE99B789673E524131F7DC71360951A997A9CE50DD5FAFC4521144441C06BB41C79E8ED53285D137D54F325A6C2F2EF74E34C0F877A614CE45DC0AEDDF95A0E2E4EDAE29AF411C9CC2AF95C9EA9A94A7961C8246E654FA28F3D568D5FEE93352C2E0D60CCAF5B00090AB6E7A53AA06A8CD3737EBF1B65D625BCF220F74DE22D9871EFC376BF082D4B872A303C32427A0C98BECF58959C9F9E2E887DBC42AAB1656AD15637A6A8F4BF9634095491F8C99242913891437E6C5B50A213DDE80D2196BE12C3937FE3239BF6759ABB8C1C9466F42FBD53894AE52FB533321429FCE4FEC1DB352C49583A7D817EAF62000888ECB0EBFFEF69FF8E590CFA25BEAB21605B635ABC2CA23680789725CF700F553C88352F31616154873D18B6C6EB519FC639B070FD67F86AAB62349DBFFA89F93051A7C7B7BD161FCD73672CEEF59A9BB7F571EABE2570C5BF31ECAA1F9CA7A9C6D31EA5FB7C979CDD2613897E7D1503FB0C19ADDCFB3A63E2185FC4101838DA66CCE2D3D9FFB47746C2003EDD86C2F8C3 Accepted, returning KPrime fips203-0.2.1/tests/nist_vectors/Decapsulation -- ML-KEM-512.txt000064400000000000000000001465711046102023000216520ustar 00000000000000Decapsulation -- ML-KEM-512 dk: 174313EFA93520E28A7076C888096E02B0BDD86830497B61FDEAB6209C6CF71C625C4680775C3477581C427A6FE1B0356EAB048BCA434F83B542C8B860010696A57299BB262268891FFC72142CA1A866185CA82D05406695BA57D4C930F9C17D6223523CF5A4F2A433A364459AC0ACDE7254481329288B1BE187CC25219F48C2443C532199859355320D04F0B80DE969F169A3D2BA3411B4ADBC01B66271824CD9543C78BA4804AE81F3AF00336C5CC3698354C0E01873A2A17D6A95A312689A99DC89084150A8D52BB31C3FF3D4215FA3C4111B401992866E513E5128A20ED95FDEE61485DC937E099D76F79B92734DC4CBB9A7A413FEA6285BC0C27C961E47D1983644C4BF913D72F4B030D34738427263E87AB4C0B7DF0B72CA8AA0BAA67B079939D587801D60C87A20405E5C52603C072FDB63E2E1C2A95CC26F5ABEF6088333800886D093CA01A76F57005E053569542E0A076B98736D4D39B00FC1653FBC2D12EA32A94B9B92C68BA4B68A4E7B370A23B03FE8221639B01244806C27067A58031DB80D2D03661A017BB46BB3711ACB568A4FABEBAFC5FA06F7CA0E4D962E3170CB11C0A8D18A09CE27A6A9763E123885450224DE07CC17546C17951FDE476E083583EF10BF76A98AFFF9B12DB5401CD3673495392D741291C3AA78420C8A7CB5FFE65012997C4DA4322EA90B5014B5B4D0180100247047341E4C24B96B8D7C0020524B7C1D66C3E08CB299EB4EC6FA0EE8EA05FD430F57605E892B232D2047CA9B4ECAD9BDD09C9951196916525D1EC921B6E3CE0EE692EBA728B4DB10F3381FBF584ABB7B6A9210C7C424CE4A369370CB48D608634ABA0BFF91C5620A1189D0CA97421D423429FB663952DC1231B4362B7162FE3A42111C91D76A964CB4154194209EDBAA1F481BD126C325D15678E39BCCE4C704EA487246648A6C6C2540B5F680A35EE2824246450A7293F21A90CFD14EFAF78FA3D7322251C641A50E95BB5EC5CA0B60E89D7C18B7A44A0FAFB4BCADE9B588D1B7FCF12BA1E1084D56B197EA90A79A3D83927A2307603BC211C0830CB7062C04254824575B226CAD9A27C2A45519AE39546467690485498A320AD56993B15A9D22C6191446CB40AA7547401681DCC7E36596B10C07FA2A20B43C4B0124401F8A0E744878C7296623C7395B6994D18C4787A289DBB05CB1827451D83F072904537594F515CA1017991620A33E096EE0DC091AE4CA960603B101B5B4E23E9A5B65E1F6C2A8CC89341383B706725ED5B3485769181B8F76439C05636A0C3436FFBA8B86A5306FA111F6FC71EB779B25707CFAE0A6DA7B0AD5D94B10F21E4FCA92893B9FFE73210763401377837A10CA9625346C42ADC705BD92DB3426D926CE4B5EC24A5CDF27CB91E5A7E7164D1BDC99D75679FBC93A58F647DAC1086CE931BC089233E9487E0867BC58472B01BF2895C323B64DBE4A17A9E841B053CADB5C76D035724C321BBC13666F0A35DFDA0721E8987623256A994D95FA1C05F57C1E15A30C4A0C8318A0D83C410C362862E817DD6ABBAA4BBE75B736CCCBB4AF2A188402BD4CE597932008862865332562F324C7A424151FB59D0AE1821F2864C7E698127AAD92C33B313988C29A09E260449BCA7BEE360862314E47519EF3918DDDE403E7B92AC9908F93C6369CC5C47B8CB1DC3A3479C762F62A18FE05A9B0645A5311A01828723AEB51FA505E96B29E3D2B6E5B1327DE3A61AB0C50BE0124B64B33314B32D6122510E46445857AA0E2C4B0D256955620A8681D1E555126D00509E35BF59683DDAA40E82C519B855852C366CB54452BF910B001692330345708653F511800B10E009D9F7D10A53B8B30BF13B06F254EC8A6BA539700F6358DE0463A019540C9873F3F4680E2113A7CCC55FF754D85AA67E9E55F887424E0B2625682A5DDA218F03C3C10A246CDB0CC91D19D8F024DB9B1415F50ACD8F65DE2787B9103C575B687765572CFFA59026C2BCEE77423BCAFD3054BF8E2713FB85B0BF6A46E716152F5C9A3011EC90114C76B01516799BD5911415B704544077F188806755EEC4131E55556DB903F4284C1F90086FF431B68F51F629812F320B55F219D72A1928F38C9A1EC823BA198BA9ABBACF62902B3CA0AFC95EA8AC303FB8BDD29BB9D18A03BA44E58B1B0B85A2A1662E6A31DA7545511A478A18177889061EF76631264239ADEBD04A8C52B72E2B1F3A2DFBBD8C054E70CC2A742E7B7D417DFED314422187DE1B2954481195755EC04BB7671C4331446BBE8952514905321A2176E935B5420C0D5EA4465 c: 84A188A072E4D4F449A4BE170274DD2A5F3E356E95B96E40AD3FF1455E36C6A71E909DD2C0DFF8AD2C9F503BAC9065716248083BDA40CECB38E3B3058BAF51A7572384FF8406A8136A4FC6D912A54B2EB5B9D598FB689E72ED3DEFD2FF8355ED9E9CCA53E82C0886E094C592C392311F04FEC68F9A1C531CF3419030892B5BDCACEEF6A0E7F1BD44903F49DE8E37B02BA3FC5121D99F8CC3040F66832F77021B4CA35F7A4825038936564CA2E673FF9CC0519C25F6A52D87EDD965B2464AA365D2BF068B72FC68B65E88515E2C832BBDB27D61BF512B5FC2D8590FB35F49500CAFE70E7D0776B5C4E4503A7189ADBAFF5D5B515CC68B2F81D993C6D7FA7D3D1D90EBFF51DA3FBBB4430E5BBEDBCA8DA078DCE8EC815B168BFC09AB4A20678870F4868B1FAE28D209C75368A799317DFA08C2B651FAC72DCA2A1B4CBB75E873F15C51B6D0B5E6F5E60E2AF6C40D2CABCBF3588F44BCEA6D72D359F40F9CF5E0EC40A5215E5ACEEAF0DA00D923D4CEFF5C3A3AB1E46C754F4AE052C2BC49FDB4521AE44DF634D56E433DAD3DF3C07115406FF8BFD0D7C93B4941D0F09213C1681CFD5C8663DF02041A3CBD162F5C4D80CB1DC7D4A501AD06FE96EB348B6E331C8296FE904EB97C087456328D703B85BDAC2FB43C728D0B05FC54B8C155C010EF0DB14CC668D1B1BC727AF8864076736B898BABA1C81DCA2053F58587D3C4E33C694A264BE2897E7D2EEFADDA9FF88D70BF3731F1228CB3E131EB0CB76FDBD2CCB1CBC18D1450AC7A16349E7129CAB720D5CB70B56E855E8305DCDA730BBD0EA33EF0815D02190BB98E30F73BF7789CDD673C613B0C57CB2EF32E670A98D2D630670773C59D8A6A2CFCFF1C7CA1BB55C17A32CB65A2EA19C7B8E295C6898CF32FEE1DEB01472BE76C3A78CB242EDFE21D961FCB85C3CF6CEE218986C1BD932BF97BC6DECAABF8C62940C0A58E87C6EDDCD74B7F715D8C22520546239F3AAA10A435820103B4E3295311D992C9C8771A3CE849868F36F31214F9639C028F4A5F4945F2BEC9585077BF2F637D2549F8348C00ECBF19C470DF255EFF6232813429F853 dk_pke: 174313EFA93520E28A7076C888096E02B0BDD86830497B61FDEAB6209C6CF71C625C4680775C3477581C427A6FE1B0356EAB048BCA434F83B542C8B860010696A57299BB262268891FFC72142CA1A866185CA82D05406695BA57D4C930F9C17D6223523CF5A4F2A433A364459AC0ACDE7254481329288B1BE187CC25219F48C2443C532199859355320D04F0B80DE969F169A3D2BA3411B4ADBC01B66271824CD9543C78BA4804AE81F3AF00336C5CC3698354C0E01873A2A17D6A95A312689A99DC89084150A8D52BB31C3FF3D4215FA3C4111B401992866E513E5128A20ED95FDEE61485DC937E099D76F79B92734DC4CBB9A7A413FEA6285BC0C27C961E47D1983644C4BF913D72F4B030D34738427263E87AB4C0B7DF0B72CA8AA0BAA67B079939D587801D60C87A20405E5C52603C072FDB63E2E1C2A95CC26F5ABEF6088333800886D093CA01A76F57005E053569542E0A076B98736D4D39B00FC1653FBC2D12EA32A94B9B92C68BA4B68A4E7B370A23B03FE8221639B01244806C27067A58031DB80D2D03661A017BB46BB3711ACB568A4FABEBAFC5FA06F7CA0E4D962E3170CB11C0A8D18A09CE27A6A9763E123885450224DE07CC17546C17951FDE476E083583EF10BF76A98AFFF9B12DB5401CD3673495392D741291C3AA78420C8A7CB5FFE65012997C4DA4322EA90B5014B5B4D0180100247047341E4C24B96B8D7C0020524B7C1D66C3E08CB299EB4EC6FA0EE8EA05FD430F57605E892B232D2047CA9B4ECAD9BDD09C9951196916525D1EC921B6E3CE0EE692EBA728B4DB10F3381FBF584ABB7B6A9210C7C424CE4A369370CB48D608634ABA0BFF91C5620A1189D0CA97421D423429FB663952DC1231B4362B7162FE3A42111C91D76A964CB4154194209EDBAA1F481BD126C325D15678E39BCCE4C704EA487246648A6C6C2540B5F680A35EE2824246450A7293F21A90CFD14EFAF78FA3D7322251C641A50E95BB5EC5CA0B60E89D7C18B7A44A0FAFB4BCADE9B588D1B7FCF12BA1E1084D56B197EA90A79A3D83927A2307603BC211C0830CB7062C04254824575B226CAD ek_pke: 9A27C2A45519AE39546467690485498A320AD56993B15A9D22C6191446CB40AA7547401681DCC7E36596B10C07FA2A20B43C4B0124401F8A0E744878C7296623C7395B6994D18C4787A289DBB05CB1827451D83F072904537594F515CA1017991620A33E096EE0DC091AE4CA960603B101B5B4E23E9A5B65E1F6C2A8CC89341383B706725ED5B3485769181B8F76439C05636A0C3436FFBA8B86A5306FA111F6FC71EB779B25707CFAE0A6DA7B0AD5D94B10F21E4FCA92893B9FFE73210763401377837A10CA9625346C42ADC705BD92DB3426D926CE4B5EC24A5CDF27CB91E5A7E7164D1BDC99D75679FBC93A58F647DAC1086CE931BC089233E9487E0867BC58472B01BF2895C323B64DBE4A17A9E841B053CADB5C76D035724C321BBC13666F0A35DFDA0721E8987623256A994D95FA1C05F57C1E15A30C4A0C8318A0D83C410C362862E817DD6ABBAA4BBE75B736CCCBB4AF2A188402BD4CE597932008862865332562F324C7A424151FB59D0AE1821F2864C7E698127AAD92C33B313988C29A09E260449BCA7BEE360862314E47519EF3918DDDE403E7B92AC9908F93C6369CC5C47B8CB1DC3A3479C762F62A18FE05A9B0645A5311A01828723AEB51FA505E96B29E3D2B6E5B1327DE3A61AB0C50BE0124B64B33314B32D6122510E46445857AA0E2C4B0D256955620A8681D1E555126D00509E35BF59683DDAA40E82C519B855852C366CB54452BF910B001692330345708653F511800B10E009D9F7D10A53B8B30BF13B06F254EC8A6BA539700F6358DE0463A019540C9873F3F4680E2113A7CCC55FF754D85AA67E9E55F887424E0B2625682A5DDA218F03C3C10A246CDB0CC91D19D8F024DB9B1415F50ACD8F65DE2787B9103C575B687765572CFFA59026C2BCEE77423BCAFD3054BF8E2713FB85B0BF6A46E716152F5C9A3011EC90114C76B01516799BD5911415B704544077F188806755EEC4131E55556DB903F4284C1F90086FF431B68F51F629812F320B55F219D72A1928F38C9A1EC823BA198BA9ABBACF62902B3CA0AFC95EA8AC303FB8BDD29BB9D18A03BA44E58B1B0B85A2A1662E6A31DA7545511A478A18177889061EF76631264239ADEBD04A8C5 h: 2B72E2B1F3A2DFBBD8C054E70CC2A742E7B7D417DFED314422187DE1B2954481 z: 195755EC04BB7671C4331446BBE8952514905321A2176E935B5420C0D5EA4465 c1: 84A188A072E4D4F449A4BE170274DD2A5F3E356E95B96E40AD3FF1455E36C6A71E909DD2C0DFF8AD2C9F503BAC9065716248083BDA40CECB38E3B3058BAF51A7572384FF8406A8136A4FC6D912A54B2EB5B9D598FB689E72ED3DEFD2FF8355ED9E9CCA53E82C0886E094C592C392311F04FEC68F9A1C531CF3419030892B5BDCACEEF6A0E7F1BD44903F49DE8E37B02BA3FC5121D99F8CC3040F66832F77021B4CA35F7A4825038936564CA2E673FF9CC0519C25F6A52D87EDD965B2464AA365D2BF068B72FC68B65E88515E2C832BBDB27D61BF512B5FC2D8590FB35F49500CAFE70E7D0776B5C4E4503A7189ADBAFF5D5B515CC68B2F81D993C6D7FA7D3D1D90EBFF51DA3FBBB4430E5BBEDBCA8DA078DCE8EC815B168BFC09AB4A20678870F4868B1FAE28D209C75368A799317DFA08C2B651FAC72DCA2A1B4CBB75E873F15C51B6D0B5E6F5E60E2AF6C40D2CABCBF3588F44BCEA6D72D359F40F9CF5E0EC40A5215E5ACEEAF0DA00D923D4CEFF5C3A3AB1E46C754F4AE052C2BC49FDB4521AE44DF634D56E433DAD3DF3C07115406FF8BFD0D7C93B4941D0F09213C1681CFD5C8663DF02041A3CBD162F5C4D80CB1DC7D4A501AD06FE96EB348B6E331C8296FE904EB97C087456328D703B85BDAC2FB43C728D0B05FC54B8C155C010EF0DB14CC668D1B1BC727AF8864076736B898BABA1C81DCA2053F58587D3C4E33C694A264BE2897E7D2EEFADDA9FF88D70BF3731F1228CB3E131EB0CB76FDBD2CCB1CBC18D1450AC7A16349E7129CAB720D5CB70B56E855E8305DCDA730BBD0EA33EF0815D02190BB98E30F73BF7789CDD673C613B0C57CB2EF32E670A98D2D630670773C59D8A6A2CFCFF1C7CA1BB55C17A32CB65A2EA19C7B8E295C6898CF32FEE c2: 1DEB01472BE76C3A78CB242EDFE21D961FCB85C3CF6CEE218986C1BD932BF97BC6DECAABF8C62940C0A58E87C6EDDCD74B7F715D8C22520546239F3AAA10A435820103B4E3295311D992C9C8771A3CE849868F36F31214F9639C028F4A5F4945F2BEC9585077BF2F637D2549F8348C00ECBF19C470DF255EFF6232813429F853 u: [[1261, 1795, 1691, 1489, 741, 1005, 517, 2136, 3114, 432, 2705, 2877, 2633, 2988, 2767, 1430, 1317, 3062, 20, 2253, 1037, 1235, 1573, 705, 3140, 3046, 836, 2048, 683, 3277, 2955, 2259, 2640, 127, 3085, 2237, 1300, 289, 1791, 940, 2523, 2126, 42, 2682, 660, 670, 2698, 72, 2949, 348, 2045, 1138, 114, 3228, 257, 85, 3043, 2094, 800, 2578, 2370, 1053, 605, 601, 1421, 1190, 1291, 3270, 2003, 543, 2363, 803, 2441, 3290, 205, 1112, 2435, 2624, 549, 1089, 754, 1700, 312, 2919, 1313, 575, 185, 1908, 2656, 855, 3225, 2585, 2129, 2620, 992, 367, 1622, 52, 2526, 1782, 2637, 2568, 2331, 3101, 800, 1586, 2594, 2467, 221, 3238, 478, 2890, 2958, 42, 2272, 2120, 1651, 273, 1307, 2077, 2952, 988, 780, 1326, 2923, 1492, 127, 351, 2744, 3251, 3033, 940, 2617, 1873, 2835, 1118, 1912, 1378, 2698, 3319, 507, 364, 1473, 488, 1632, 2838, 371, 3088, 1538, 497, 348, 966, 1362, 497, 3319, 85, 2116, 2588, 2129, 2370, 306, 319, 1577, 575, 2923, 2737, 2637, 1632, 2812, 361, 2253, 1235, 631, 2048, 796, 2328, 1141, 59, 640, 2276, 2415, 2715, 387, 1534, 588, 992, 878, 757, 1200, 2815, 3049, 3322, 2799, 280, 1473, 2578, 2949, 244, 1326, 1921, 3140, 2253, 3222, 796, 94, 2406, 3322, 1063, 3205, 2337, 2741, 878, 2542, 2984, 1440, 2637, 458, 1795, 1479, 3027, 1599, 2393, 1161, 1808, 1651, 2295, 553, 419, 335, 111, 2728, 1752, 2949, 2936, 2113, 2731, 2526, 783, 2097, 2175, 1330, 2744, 3040, 114, 2295, 354, 3033, 2598, 1811, 2243, 1411, 988, 1440, 1759, 2698, 3137], [1131, 1313, 868, 2363, 1580, 1447, 774, 546, 800, 2864, 2289, 2224, 3157, 1860, 796, 891, 2276, 2893, 2620, 2747, 289, 3319, 1456, 3192, 728, 192, 1938, 436, 1970, 2984, 2224, 3131, 709, 1873, 1863, 2757, 3166, 2702, 3033, 754, 575, 2682, 2776, 1031, 241, 598, 120, 2454, 1070, 1037, 972, 341, 1573, 1310, 2754, 2770, 2854, 2757, 2350, 800, 790, 364, 1115, 832, 361, 3322, 868, 2806, 3150, 1918, 65, 2708, 2445, 741, 55, 1362, 923, 2702, 328, 1294, 2389, 832, 1352, 780, 2279, 3137, 1463, 1005, 2913, 2867, 367, 2767, 1369, 2705, 345, 3303, 2984, 1021, 582, 1437, 166, 439, 1170, 3309, 2133, 1934, 3157, 107, 2042, 484, 686, 1463, 1024, 2812, 2324, 618, 585, 465, 699, 150, 16, 1037, 2929, 2516, 276, 156, 2448, 179, 575, 1310, 2120, 2721, 575, 569, 3040, 3228, 436, 1300, 2676, 1395, 2942, 2399, 1749, 2607, 1759, 163, 995, 3189, 2929, 731, 250, 2962, 1027, 2165, 1990, 975, 1567, 3023, 3196, 601, 1609, 2220, 1655, 3231, 458, 3212, 2897, 637, 2448, 2523, 2679, 2932, 2656, 2685, 2861, 1450, 2376, 2666, 2588, 2646, 1460, 946, 836, 2240, 2061, 849, 1570, 1476, 1798, 1619, 1700, 2770, 660, 1131, 2428, 1733, 2802, 1144, 1456, 2845, 2871, 2711, 764, 2120, 202, 403, 1534, 29, 2578, 1879, 764, 631, 3300, 1502, 2962, 2032, 3215, 2578, 1726, 770, 2536, 2357, 2432, 3160, 2646, 2162, 1248, 2737, 696, 1495, 384, 1495, 1473, 2207, 2211, 575, 3316, 2702, 3124, 2097, 1440, 276, 3056, 653, 1492, 497, 2217, 335, 647, 566, 1138, 2581, 445, 738, 2493, 3095]] v: [2705, 208, 2289, 2913, 208, 0, 1456, 832, 2289, 416, 1456, 2913, 2497, 1248, 2081, 624, 1665, 1456, 2289, 2497, 832, 416, 2913, 416, 3121, 2705, 416, 2913, 2705, 208, 1248, 1873, 3121, 208, 2289, 2497, 1040, 1665, 624, 2497, 3121, 2497, 2497, 1248, 2913, 2913, 208, 416, 1873, 1665, 1248, 1665, 208, 2497, 2705, 2289, 624, 1873, 2289, 416, 1873, 3121, 2289, 1456, 1248, 2497, 2913, 2705, 2081, 2497, 2289, 2081, 1665, 3121, 1248, 2497, 1873, 416, 0, 832, 0, 2497, 1040, 2081, 2913, 1665, 1456, 1665, 1248, 2497, 2705, 2913, 2497, 2705, 1456, 2705, 2289, 832, 3121, 1456, 208, 1456, 2705, 1040, 2497, 1665, 416, 416, 416, 1040, 1040, 0, 1248, 832, 624, 416, 3121, 1873, 2081, 624, 2081, 2081, 0, 208, 832, 2081, 1040, 624, 416, 1665, 208, 0, 624, 0, 832, 2289, 624, 2913, 1873, 416, 624, 1040, 208, 208, 1873, 2705, 416, 1873, 1873, 2497, 1665, 2497, 1456, 1456, 2081, 208, 2497, 624, 1665, 2913, 1873, 832, 1248, 1665, 3121, 1665, 1248, 624, 624, 3121, 416, 208, 832, 208, 1873, 3121, 624, 1248, 2497, 1873, 416, 0, 3121, 1665, 2081, 832, 3121, 1040, 1873, 832, 1040, 832, 416, 3121, 2913, 2289, 1873, 2497, 1665, 1040, 0, 1040, 1456, 1456, 3121, 2289, 3121, 416, 624, 1248, 2705, 1456, 1040, 416, 1873, 832, 1665, 3121, 832, 624, 2497, 1665, 0, 0, 2497, 2913, 3121, 2289, 1873, 208, 832, 2497, 0, 1456, 3121, 2705, 1040, 416, 2913, 1040, 3121, 3121, 416, 1248, 416, 624, 208, 1665, 832, 624, 1873, 416, 1665, 3121, 624, 1040] sHat: [[791, 308, 2543, 858, 544, 2222, 1648, 3207, 2440, 1760, 2, 3035, 2264, 774, 2889, 1559, 2813, 2926, 3104, 1737, 3319, 1569, 1628, 2052, 3191, 837, 2167, 453, 2626, 1783, 225, 859, 2926, 74, 2699, 1084, 847, 2904, 2114, 2956, 352, 96, 1430, 1834, 2969, 619, 2082, 2198, 3103, 1839, 3092, 2578, 1704, 390, 2140, 730, 5, 1636, 2709, 1403, 2516, 780, 505, 2012, 866, 1314, 1340, 2639, 1266, 826, 1187, 1110, 154, 2764, 734, 1351, 840, 657, 2856, 440, 2017, 3272, 293, 2546, 584, 1100, 828, 533, 1433, 2360, 597, 211, 4, 2959, 2317, 1694, 2545, 2614, 2770, 843, 1041, 2779, 444, 2912, 354, 2087, 2380, 1357, 2108, 2983, 1096, 2784, 897, 2815, 768, 1731, 860, 1692, 1155, 3077, 2272, 1841, 418, 2010, 1386, 2617, 2066, 2470, 3225, 2205, 264, 1284, 1448, 701, 3251, 1009, 1267, 541, 863, 3146, 2833, 1025, 537, 2153, 366, 997, 2129, 2594, 2318, 1533, 1758, 334, 3205, 2365, 2430, 2512, 1910, 2495, 914, 1239, 3012, 2972, 1191, 314, 1790, 650, 91, 3116, 1660, 489, 327, 2445, 1078, 3140, 447, 985, 1138, 2831, 816, 1149, 568, 1828, 2147, 1966, 180, 2940, 3039, 1824, 2762, 2568, 1722, 1978, 2311, 921, 2005, 2056, 29, 3206, 122, 1026, 3166, 1317, 3168, 115, 2863, 1597, 482, 3118, 3241, 3109, 2671, 3045, 2294, 2096, 51, 136, 134, 2365, 458, 2672, 1903, 5, 1374, 848, 1129, 741, 1802, 1712, 920, 1751, 2381, 2819, 271, 1628, 3135, 731, 2578, 814, 2985, 2484, 1682, 2236, 1700, 2219, 2894, 887, 778, 2818, 2111, 558, 2326, 2819, 1042, 2052, 1900, 98], [2170, 53, 2077, 219, 813, 1632, 282, 1968, 2996, 2870, 2673, 3249, 2646, 1272, 2987, 2814, 2757, 111, 2807, 236, 1613, 745, 49, 3255, 17, 2700, 2769, 152, 1998, 2658, 1705, 999, 2066, 2131, 581, 576, 2014, 3264, 1047, 1733, 1303, 505, 2014, 1764, 1288, 2099, 239, 3057, 2422, 2218, 2559, 2847, 1325, 1035, 796, 1661, 1332, 921, 1069, 295, 913, 2732, 632, 196, 3210, 2903, 1791, 1294, 2322, 1993, 1101, 810, 2350, 186, 1104, 2897, 180, 397, 1, 576, 1904, 836, 3102, 580, 3001, 2262, 124, 512, 2898, 1988, 1565, 3126, 3296, 2856, 2969, 1262, 2758, 239, 2792, 94, 1021, 244, 87, 1510, 2953, 562, 45, 1138, 3018, 1257, 2506, 3037, 3280, 2457, 2385, 1681, 534, 1493, 2334, 540, 950, 3310, 1550, 2350, 2027, 650, 2996, 269, 2291, 499, 2239, 1189, 3003, 1703, 146, 3185, 1220, 3298, 1610, 2355, 2928, 1164, 2262, 1584, 2634, 187, 511, 3161, 2658, 272, 137, 3245, 663, 468, 1090, 659, 1787, 918, 3154, 301, 1073, 875, 299, 1575, 2814, 1059, 3089, 2321, 2775, 2406, 1100, 347, 1089, 521, 2974, 2733, 2079, 436, 1745, 3122, 293, 1389, 888, 2494, 1228, 3198, 2564, 1166, 1650, 1604, 3210, 1734, 37, 2900, 246, 2616, 606, 2094, 1602, 1108, 522, 2359, 2802, 2305, 463, 1261, 2042, 2303, 1955, 813, 290, 3173, 1345, 234, 2965, 1515, 2757, 188, 2144, 2526, 2172, 2929, 2724, 244, 1199, 3019, 2477, 2910, 392, 2941, 508, 703, 417, 142, 1613, 2837, 2711, 2318, 2727, 985, 643, 1961, 1827, 1536, 571, 284, 960, 200, 1719, 704, 1284, 1154, 1828, 1461, 3106, 2774]] w: [1558, 92, 164, 1760, 1700, 82, 3105, 3297, 1538, 1766, 1763, 181, 1746, 3293, 1756, 3229, 1581, 8, 1636, 3282, 1699, 3307, 1542, 41, 39, 46, 1686, 1653, 29, 1697, 1665, 1697, 73, 3243, 1717, 2, 3277, 34, 3276, 68, 1621, 1657, 3315, 1666, 1664, 1717, 3311, 1598, 3262, 1738, 1544, 3302, 1628, 1521, 1606, 3239, 1658, 3316, 209, 108, 1510, 1568, 1658, 108, 48, 5, 1696, 78, 3141, 3300, 1557, 1676, 1577, 1765, 85, 3312, 1720, 1592, 3250, 3181, 142, 45, 1613, 47, 1830, 3239, 3216, 3269, 3232, 1703, 1712, 33, 3111, 3253, 1703, 3251, 1663, 1709, 224, 1684, 1623, 1643, 3231, 1767, 3319, 15, 156, 1611, 3132, 1753, 1498, 1764, 1593, 128, 1737, 3279, 1753, 60, 3263, 1540, 1655, 5, 1655, 15, 3275, 1574, 149, 227, 134, 49, 1633, 24, 1752, 3319, 46, 8, 3270, 36, 78, 113, 1701, 8, 44, 1723, 1668, 1589, 3290, 103, 1718, 86, 1582, 38, 1561, 133, 3309, 3160, 93, 1733, 3315, 3313, 116, 1723, 3238, 3254, 3306, 1665, 27, 1534, 1672, 1676, 1773, 3237, 1562, 5, 70, 19, 182, 1737, 1688, 1670, 36, 1532, 1757, 3210, 1725, 1596, 3272, 3275, 1759, 41, 3310, 1625, 1661, 1739, 3279, 1614, 1641, 3285, 1639, 158, 3266, 3238, 1755, 27, 1468, 193, 1660, 43, 68, 18, 3164, 19, 5, 1560, 3209, 3321, 3182, 3315, 57, 3164, 73, 3304, 1688, 1743, 1758, 72, 1555, 114, 1898, 3174, 1652, 1616, 2, 1791, 3209, 1685, 3225, 1552, 1823, 1636, 42, 17, 1715, 26, 3234, 92, 1605, 199, 1802, 0, 1641, 3224, 3295, 1749, 1513, 3251] mPrime: 195755EC04BB7671C4331446BBE8952514905321A2176E935B5420C0D5EA4465 KPrime: 224B9C051213EF46549243796532282973FA7CF97E8913C339C1940AC17E05E0 rPrime: 92A1F927E9CB290EA28358A8927D1CB7E25789194C510DC1462A04EE4CC75B21 tHat: [[1946, 3106, 1444, 405, 2478, 1347, 1892, 1686, 1284, 1176, 650, 163, 2517, 2358, 2737, 2517, 1570, 412, 1556, 3252, 2624, 1882, 71, 356, 3201, 3197, 1507, 2406, 3249, 112, 2810, 514, 3252, 1203, 1025, 1026, 2591, 232, 2164, 1924, 2503, 1634, 1827, 924, 2395, 2374, 3281, 1144, 647, 2202, 219, 1483, 689, 1864, 2129, 1021, 2311, 66, 1363, 2375, 1525, 3233, 1808, 2449, 22, 2610, 2366, 1760, 3296, 157, 1050, 3246, 1686, 48, 433, 2896, 692, 1006, 2970, 1621, 1761, 3119, 3240, 2204, 820, 2097, 1719, 1824, 1374, 2877, 1864, 1685, 2840, 2289, 886, 2500, 773, 1702, 1036, 867, 2815, 2235, 1414, 778, 367, 282, 3318, 1823, 2027, 2487, 37, 1991, 250, 2670, 3034, 167, 2517, 1213, 528, 495, 2639, 2348, 2953, 2547, 1022, 535, 775, 1030, 1811, 2103, 122, 3233, 1430, 834, 620, 2772, 1479, 3024, 2962, 845, 2342, 621, 3022, 1508, 2754, 1476, 2015, 3250, 1425, 2686, 1767, 1233, 3099, 2461, 1751, 1941, 2555, 940, 1624, 1151, 474, 140, 2412, 798, 2236, 2336, 2355, 1166, 2174, 1648, 2236, 1141, 299, 3056, 1320, 3129, 1571, 1243, 2750, 372, 2217, 1054, 944, 3237, 3291, 1893, 1488, 1827, 588, 435, 956, 1633, 2671, 848, 2783, 125, 2081, 2446, 886, 594, 2410, 1241, 2709, 463, 1285, 1999, 1310, 2609, 2572, 196, 2179, 2561, 3288, 1043, 1548, 643, 2146, 382, 2781, 2998, 2986, 3044, 1909, 875, 3020, 2892, 2735, 386, 644, 3024, 1356, 2430, 147, 130, 2182, 1618, 1331, 1570, 1267, 3186, 1188, 338, 1311, 2523, 266, 2094, 2079, 1602, 1735, 2446, 2578, 2775, 914, 956, 2353, 2179], [2754, 153, 226, 1094, 2715, 1980, 1774, 131, 354, 1251, 327, 2533, 499, 2265, 1245, 62, 2535, 683, 201, 2297, 1683, 876, 1436, 3148, 3195, 2840, 2780, 835, 1913, 1580, 2806, 386, 1534, 2704, 1200, 1446, 339, 2561, 2072, 1826, 2874, 1310, 250, 1509, 662, 2539, 2877, 1762, 859, 625, 2782, 1555, 3243, 1280, 446, 576, 2998, 820, 2865, 804, 726, 593, 1040, 1614, 1349, 1960, 672, 3150, 688, 1389, 1685, 517, 2216, 470, 1310, 1301, 38, 93, 777, 1470, 1781, 2105, 2781, 1034, 3304, 1298, 1435, 1416, 850, 1644, 1227, 1109, 2347, 271, 432, 1680, 35, 835, 2135, 1616, 319, 389, 256, 235, 3328, 2553, 125, 2641, 2875, 776, 959, 2817, 1391, 1250, 1736, 2986, 1875, 9, 1526, 2259, 1760, 932, 1281, 1033, 1993, 1016, 1599, 2052, 482, 929, 3196, 1372, 1535, 1239, 2693, 1658, 1513, 1534, 1160, 583, 736, 1579, 598, 2648, 733, 394, 3312, 963, 528, 1130, 205, 3275, 401, 2525, 655, 1232, 441, 1051, 95, 2757, 1752, 1503, 2274, 1975, 913, 3152, 1653, 2171, 1398, 1829, 2767, 1439, 3074, 694, 1998, 1870, 3107, 2811, 1491, 1200, 760, 1822, 2111, 1467, 1547, 2639, 366, 1559, 1362, 3231, 419, 480, 457, 320, 3015, 22, 1873, 2454, 2493, 277, 2881, 1797, 1093, 116, 2175, 2177, 1286, 1511, 492, 788, 1509, 1381, 219, 1017, 1090, 3096, 249, 2144, 1023, 436, 1384, 511, 2146, 297, 243, 2898, 351, 2514, 370, 2346, 2191, 3219, 3233, 2094, 315, 2442, 2746, 3001, 1708, 671, 770, 3243, 3082, 2399, 2794, 3128, 2819, 2239, 2525, 2994, 2205, 2561, 1083, 1258, 344, 2827]] bHat = aHat^T: [[[1341, 1232, 1520, 1770, 1003, 1831, 2265, 2612, 3123, 2306, 2308, 2255, 1490, 1757, 3189, 527, 3134, 69, 1977, 3080, 2397, 130, 1582, 978, 3006, 804, 2954, 2425, 1044, 1858, 3045, 2399, 2205, 2550, 2921, 122, 1228, 2138, 2028, 121, 2672, 2810, 2355, 918, 3306, 1704, 760, 542, 3315, 2757, 2693, 1951, 1877, 1773, 1983, 1080, 708, 2782, 3172, 1953, 1452, 1721, 1892, 1248, 1798, 1997, 1316, 2886, 2562, 2126, 3292, 31, 3282, 2460, 1927, 2546, 2859, 1498, 905, 1786, 199, 2414, 1990, 1834, 515, 2527, 494, 743, 2335, 2652, 2521, 1445, 1538, 275, 2051, 1796, 1074, 333, 2770, 1060, 2473, 2840, 979, 648, 2891, 139, 2866, 3043, 1062, 159, 2676, 1072, 1455, 1652, 1722, 1985, 2592, 2855, 2396, 1723, 3, 304, 3034, 2717, 899, 72, 2047, 3212, 1207, 2879, 3130, 1150, 453, 1398, 518, 916, 3155, 520, 629, 2344, 966, 3254, 577, 2344, 1025, 1063, 1548, 2577, 2271, 665, 1798, 3220, 2069, 1307, 3102, 3220, 1057, 437, 1217, 941, 487, 885, 1418, 2967, 1058, 1396, 1932, 721, 2302, 730, 522, 2775, 372, 359, 1712, 2573, 2476, 2273, 2627, 1436, 417, 2326, 2963, 1542, 1470, 2662, 728, 2267, 2454, 836, 443, 998, 3223, 2987, 440, 2548, 539, 1465, 1776, 532, 406, 1756, 3231, 2506, 1574, 1183, 1437, 2043, 1381, 1618, 2438, 416, 3158, 2431, 760, 1974, 1599, 1637, 611, 826, 1576, 1703, 3197, 127, 2296, 2774, 3170, 1351, 1635, 2287, 1133, 1110, 1299, 915, 2495, 787, 2044, 689, 3080, 1719, 1343, 3007, 1914, 1995, 1831, 2520, 2468, 694, 965, 665, 1532, 2025, 733, 2621, 752, 1605], [1107, 1430, 1656, 2723, 1978, 2161, 2909, 1681, 2024, 1209, 2176, 1472, 2579, 3193, 1266, 2891, 2717, 2156, 2500, 2580, 1459, 1409, 1570, 1053, 538, 1782, 2370, 2274, 2948, 325, 2898, 857, 3112, 710, 1579, 1744, 3081, 1871, 2509, 2458, 1463, 479, 1749, 2296, 1140, 2636, 328, 1349, 502, 1761, 989, 359, 2149, 1892, 2098, 1286, 804, 933, 149, 1944, 2217, 2744, 2954, 1092, 1103, 878, 3326, 1679, 3102, 2809, 1795, 574, 696, 2034, 2029, 2448, 2135, 2194, 2503, 823, 2128, 144, 1105, 963, 1929, 1328, 3113, 1097, 3052, 1648, 2484, 1650, 2180, 958, 606, 1317, 1804, 1384, 672, 3053, 2554, 865, 1727, 1415, 1929, 3154, 652, 875, 3149, 998, 3240, 2022, 2963, 1205, 1546, 3195, 767, 2671, 2607, 1803, 20, 1117, 948, 2191, 3261, 2478, 404, 1826, 3250, 2506, 2373, 932, 1131, 2317, 2269, 1348, 1468, 1091, 748, 1428, 1056, 1387, 1239, 2847, 3157, 2702, 2015, 1255, 2443, 2435, 2593, 90, 3119, 499, 1133, 1612, 1520, 2342, 1072, 2683, 83, 2279, 1263, 3266, 2199, 1519, 1825, 1309, 2528, 47, 438, 309, 1518, 2420, 3090, 2179, 2935, 1451, 2304, 951, 2545, 1654, 3056, 2547, 77, 1009, 205, 1809, 1568, 2342, 599, 836, 2768, 3005, 2877, 301, 475, 2302, 305, 2121, 1705, 1426, 134, 1412, 2429, 795, 688, 3322, 2501, 2658, 2624, 3098, 878, 687, 1608, 1006, 1545, 1968, 2378, 468, 2303, 2194, 2518, 1457, 16, 504, 95, 2007, 734, 2785, 98, 1422, 3236, 3044, 1251, 2906, 2639, 2433, 3163, 1519, 1576, 1630, 2987, 1430, 1823, 2949, 2139, 637, 298, 3004, 2426, 3260, 3128, 3059, 291, 2868]], [[1490, 2832, 3007, 87, 745, 2812, 374, 2590, 2710, 2551, 3299, 346, 1573, 2189, 2468, 139, 551, 1030, 1873, 3009, 1273, 1775, 2465, 190, 1929, 666, 2757, 1478, 1525, 362, 784, 472, 2798, 715, 2660, 855, 76, 2123, 524, 394, 3257, 1995, 205, 2851, 2305, 202, 3016, 2563, 816, 161, 992, 379, 1278, 2061, 95, 1542, 1884, 1431, 2503, 62, 3180, 1320, 1291, 2129, 697, 2997, 367, 1277, 948, 2299, 228, 1321, 1930, 2895, 842, 2553, 1372, 3135, 1074, 2797, 2292, 3180, 291, 1832, 2580, 201, 2690, 2465, 2544, 1341, 2051, 2719, 692, 2968, 1173, 728, 595, 968, 39, 2628, 1344, 2638, 1878, 2022, 138, 974, 2049, 1125, 1616, 603, 1373, 2565, 1100, 143, 1672, 3104, 1243, 2222, 2379, 2517, 1040, 2306, 1932, 2232, 2414, 1713, 2733, 2613, 210, 2899, 2225, 2417, 1153, 497, 532, 1226, 262, 2346, 1385, 924, 3111, 468, 1646, 191, 2982, 2701, 2902, 2380, 3032, 494, 174, 2728, 1105, 744, 125, 1495, 38, 2909, 1141, 3020, 2882, 1922, 2506, 2908, 2238, 1611, 41, 431, 2658, 2025, 2119, 3256, 3101, 2231, 2925, 3299, 791, 2320, 84, 3084, 1029, 2357, 2775, 2083, 2328, 1041, 1048, 991, 1106, 2707, 1944, 3248, 1587, 548, 2929, 600, 3258, 1248, 2516, 1528, 358, 1167, 106, 1476, 1446, 1374, 2209, 2259, 234, 928, 3253, 3168, 478, 2383, 2531, 2209, 630, 2093, 962, 55, 318, 2421, 1577, 1821, 751, 1514, 294, 1757, 425, 1024, 895, 390, 2531, 2178, 2151, 1118, 3219, 299, 2208, 2239, 407, 2184, 2323, 742, 1553, 3275, 1188, 1947, 60, 1538, 989, 1589, 2246, 677, 2878, 1923], [1870, 3321, 145, 1061, 1324, 1482, 2251, 3214, 3210, 2036, 1155, 393, 3199, 3013, 627, 371, 1565, 1594, 523, 2681, 452, 1173, 2787, 2781, 1422, 420, 1010, 1164, 1696, 2259, 464, 1557, 709, 2202, 986, 2065, 3081, 3085, 1543, 2780, 1209, 1584, 452, 631, 943, 2201, 3047, 617, 156, 1642, 1750, 3056, 2725, 158, 2234, 2969, 3002, 3121, 2707, 3103, 1852, 312, 2732, 2553, 836, 1663, 2660, 1299, 1227, 732, 2633, 1653, 2922, 1352, 2187, 383, 2319, 2650, 1625, 828, 3144, 1333, 2004, 830, 888, 1811, 1248, 2772, 543, 2505, 1352, 2143, 3127, 2158, 89, 2546, 2032, 918, 1347, 1170, 1139, 1824, 605, 1597, 1536, 360, 2817, 1845, 2283, 2681, 1821, 1632, 1674, 3289, 695, 651, 2882, 3127, 1179, 2895, 4, 2780, 1420, 2965, 545, 2508, 278, 1726, 467, 1242, 2215, 1513, 424, 2896, 1910, 2627, 576, 2049, 408, 3020, 2565, 3272, 1820, 1438, 1010, 523, 3067, 2464, 1939, 624, 347, 1840, 2150, 2970, 1050, 1275, 3275, 760, 1072, 1447, 355, 2674, 1035, 2885, 840, 665, 1106, 2391, 2849, 3088, 2274, 2110, 2245, 3223, 1668, 256, 1557, 406, 1585, 2563, 194, 1876, 2882, 1126, 1050, 2555, 3260, 2140, 2434, 700, 1806, 512, 3174, 841, 2889, 1971, 652, 821, 828, 1498, 3151, 1440, 1038, 1782, 2297, 2146, 871, 2472, 3117, 21, 86, 2439, 3245, 1017, 2212, 2431, 1440, 1670, 1586, 1253, 2961, 1185, 2464, 704, 213, 1625, 961, 1036, 2316, 355, 1592, 3255, 3012, 365, 1156, 1393, 1085, 1161, 2603, 601, 3076, 799, 1919, 914, 561, 2296, 1331, 2214, 2464, 2121, 311, 2043, 2450, 2336, 1608, 1583]]] r: [[2, 0, 3328, 3328, 3328, 1, 0, 2, 0, 3328, 2, 1, 1, 3327, 1, 3327, 3328, 3328, 3328, 3328, 3328, 1, 2, 3328, 3328, 1, 0, 0, 3328, 3328, 3328, 0, 0, 3328, 3328, 0, 0, 0, 1, 0, 3326, 1, 3328, 3328, 0, 0, 1, 0, 0, 1, 1, 0, 0, 3328, 3328, 1, 0, 0, 3327, 0, 0, 3326, 3328, 1, 3328, 3327, 0, 3328, 1, 1, 3328, 3327, 3328, 3328, 1, 0, 0, 3328, 0, 0, 0, 3326, 1, 0, 3328, 0, 1, 0, 1, 0, 1, 3328, 0, 3328, 1, 3328, 1, 3328, 3327, 3328, 0, 3328, 2, 0, 3327, 0, 2, 1, 0, 1, 3327, 0, 0, 1, 1, 2, 3328, 2, 3328, 0, 3328, 1, 3328, 1, 1, 2, 0, 3328, 3, 1, 3327, 3328, 3328, 3328, 0, 0, 0, 3327, 0, 3328, 0, 0, 3328, 3, 3327, 3328, 0, 0, 0, 1, 1, 2, 3327, 0, 2, 1, 1, 0, 3328, 1, 3328, 1, 0, 1, 0, 3328, 0, 0, 3328, 0, 0, 0, 0, 1, 1, 2, 1, 1, 1, 0, 2, 0, 3328, 0, 0, 1, 3328, 2, 0, 0, 1, 1, 2, 2, 1, 1, 3327, 0, 0, 0, 0, 1, 3328, 0, 1, 1, 0, 3328, 3328, 0, 3328, 0, 3328, 0, 3326, 2, 1, 3328, 3328, 2, 3328, 1, 1, 0, 2, 0, 3328, 1, 2, 1, 3328, 3328, 0, 1, 0, 0, 3327, 0, 1, 0, 0, 0, 0, 0, 1, 2, 2, 1, 3328, 1, 0, 0, 3328, 3328, 0, 0], [3327, 0, 0, 3328, 0, 0, 0, 1, 3328, 3328, 0, 0, 0, 1, 3328, 2, 3328, 0, 0, 0, 1, 3328, 3328, 3, 3328, 3327, 3328, 0, 0, 0, 1, 0, 1, 1, 3326, 3, 0, 1, 3328, 1, 3328, 3328, 1, 0, 3327, 3326, 0, 3328, 0, 3327, 1, 0, 1, 0, 1, 1, 1, 0, 3328, 1, 0, 2, 0, 3328, 3328, 3327, 3328, 3328, 3328, 1, 1, 3327, 1, 3328, 0, 1, 0, 1, 0, 1, 0, 3328, 3328, 2, 1, 1, 0, 1, 3328, 0, 0, 0, 3, 0, 1, 3327, 0, 3327, 3328, 0, 1, 0, 3328, 0, 0, 2, 1, 0, 0, 0, 2, 2, 0, 0, 1, 3328, 3328, 1, 1, 1, 2, 3327, 1, 3328, 3328, 2, 2, 3328, 3328, 1, 3328, 0, 3, 1, 0, 3328, 1, 3328, 0, 0, 1, 2, 3328, 0, 0, 3328, 0, 3328, 3328, 3328, 0, 1, 3328, 0, 2, 2, 0, 2, 0, 0, 3328, 1, 1, 0, 3328, 3328, 2, 1, 1, 0, 2, 0, 1, 0, 3327, 3328, 2, 0, 0, 1, 3327, 3328, 3328, 1, 3327, 0, 2, 1, 2, 0, 3326, 1, 1, 3327, 0, 3328, 3327, 3328, 0, 3328, 1, 2, 3327, 2, 2, 0, 3328, 0, 3328, 3328, 2, 3328, 3328, 3328, 2, 1, 0, 0, 1, 3327, 3328, 1, 3328, 1, 1, 1, 1, 2, 1, 0, 1, 3328, 3328, 0, 3328, 0, 0, 1, 1, 2, 0, 0, 1, 0, 0, 3327, 3328, 3328, 0, 0, 1, 0, 0, 3328, 2, 3328]] e1: [[3328, 1, 0, 3328, 0, 0, 3328, 0, 0, 3328, 0, 0, 1, 1, 0, 0, 3328, 0, 0, 1, 1, 3328, 3328, 1, 0, 0, 3328, 3328, 1, 1, 2, 3327, 3328, 3328, 0, 0, 3327, 0, 0, 0, 3327, 0, 3327, 3328, 2, 1, 2, 3328, 3328, 0, 0, 0, 0, 0, 0, 1, 1, 1, 3328, 2, 0, 2, 3328, 3328, 0, 1, 0, 1, 3328, 3328, 3328, 0, 3327, 0, 0, 0, 0, 3328, 3328, 0, 3328, 1, 3328, 0, 3327, 0, 3327, 3328, 0, 1, 3328, 3327, 1, 3327, 3328, 3328, 1, 3328, 3328, 0, 3328, 1, 2, 1, 0, 0, 3327, 3328, 3327, 0, 3328, 3328, 1, 3328, 2, 2, 3328, 0, 0, 2, 3328, 3327, 3328, 1, 1, 0, 1, 3327, 1, 1, 0, 1, 3328, 1, 3327, 1, 1, 1, 1, 3328, 3328, 3328, 0, 1, 3328, 3328, 0, 3328, 0, 3328, 1, 0, 3328, 0, 1, 1, 1, 3327, 1, 0, 3328, 3328, 3327, 2, 3328, 0, 0, 3328, 3328, 0, 3328, 0, 3327, 3327, 1, 3328, 0, 1, 0, 2, 3328, 0, 0, 1, 0, 1, 1, 0, 2, 3328, 0, 1, 1, 3328, 0, 1, 0, 1, 0, 2, 0, 1, 0, 1, 2, 1, 1, 0, 0, 1, 0, 1, 1, 1, 1, 0, 3328, 1, 0, 0, 3328, 2, 0, 0, 3328, 0, 0, 3328, 3328, 3328, 3327, 3328, 0, 1, 1, 1, 1, 0, 1, 2, 3327, 3328, 0, 3328, 3328, 3328, 1, 0, 3327, 3328, 3328, 0, 3328, 0, 0, 1], [3328, 0, 3328, 2, 1, 3328, 3328, 1, 3328, 1, 3328, 0, 0, 3327, 0, 3328, 0, 3328, 3328, 2, 3328, 3328, 0, 3328, 3328, 1, 0, 3328, 0, 3328, 0, 0, 1, 3328, 0, 0, 3328, 1, 1, 3328, 0, 3328, 1, 1, 3328, 1, 0, 0, 0, 3328, 1, 3328, 0, 0, 0, 1, 3328, 0, 1, 1, 0, 3328, 0, 2, 0, 1, 2, 0, 3328, 0, 1, 0, 1, 0, 1, 3327, 0, 3328, 3328, 1, 0, 0, 1, 3328, 3327, 0, 0, 3328, 1, 3328, 0, 0, 1, 0, 1, 0, 1, 0, 2, 0, 0, 1, 2, 0, 2, 1, 3328, 3328, 2, 0, 0, 0, 1, 3328, 0, 3328, 3327, 0, 2, 1, 1, 2, 0, 1, 3328, 2, 0, 0, 1, 3328, 0, 1, 1, 0, 3328, 0, 0, 0, 3328, 0, 0, 1, 3328, 1, 0, 3328, 3327, 0, 0, 3328, 1, 1, 1, 1, 1, 1, 2, 1, 2, 1, 3327, 1, 2, 3327, 1, 1, 0, 3328, 1, 0, 1, 3328, 0, 1, 1, 0, 3328, 1, 1, 3328, 0, 1, 1, 3328, 0, 0, 0, 1, 1, 0, 3328, 0, 0, 0, 1, 3328, 3328, 0, 1, 3328, 0, 1, 3328, 0, 3328, 1, 0, 3328, 0, 1, 3328, 1, 3328, 3328, 1, 1, 3328, 3327, 3328, 1, 0, 0, 0, 1, 0, 3327, 3328, 0, 0, 1, 0, 0, 3328, 3328, 3328, 1, 1, 2, 1, 3328, 0, 0, 1, 3328, 0, 1, 2, 3328, 3328, 3328, 3327, 0, 1, 3328, 0, 1]] e2: [0, 2, 2, 0, 3328, 0, 1, 1, 1, 2, 1, 3328, 3328, 0, 3328, 2, 0, 1, 1, 1, 3328, 3328, 3328, 1, 3327, 3328, 1, 1, 0, 0, 3328, 1, 0, 0, 3327, 3328, 0, 1, 0, 1, 0, 1, 1, 0, 3328, 0, 1, 3327, 0, 3328, 0, 0, 0, 3328, 3328, 2, 1, 1, 0, 0, 1, 3328, 3328, 3328, 3328, 1, 1, 0, 1, 3328, 0, 1, 1, 2, 0, 0, 3328, 0, 1, 0, 3328, 0, 1, 1, 1, 3328, 0, 1, 3327, 3328, 1, 1, 0, 3328, 3328, 3327, 0, 1, 3328, 0, 1, 0, 3328, 3328, 3327, 3328, 0, 0, 0, 0, 0, 1, 3328, 3328, 3328, 3328, 1, 1, 0, 1, 3328, 0, 3328, 3328, 2, 3328, 3328, 0, 3328, 2, 0, 0, 0, 3327, 1, 0, 1, 1, 0, 2, 0, 1, 0, 0, 3328, 0, 0, 1, 3328, 1, 1, 0, 0, 0, 0, 3328, 0, 1, 1, 0, 0, 1, 0, 0, 3328, 1, 3328, 3328, 3328, 3328, 0, 0, 1, 0, 0, 0, 1, 1, 3328, 0, 0, 1, 1, 3328, 0, 1, 2, 0, 0, 1, 1, 3328, 1, 0, 0, 2, 0, 1, 1, 1, 1, 3328, 0, 1, 3328, 1, 0, 3328, 0, 0, 0, 3328, 1, 3327, 1, 3328, 3328, 3328, 1, 0, 3328, 0, 2, 0, 3328, 0, 3328, 3327, 0, 3328, 1, 1, 0, 0, 0, 1, 0, 3328, 1, 0, 3328, 3328, 1, 3328, 0, 0, 3327, 3327, 3327, 3327, 3328, 3327, 3328, 2, 1, 0] rHat: [[2524, 3201, 2259, 2409, 1681, 275, 2303, 818, 2724, 1213, 1874, 1491, 2627, 2267, 1790, 12, 3216, 2734, 1684, 2342, 1622, 1659, 3106, 855, 2814, 529, 2170, 1324, 273, 1745, 1941, 1553, 2165, 1335, 2735, 1669, 520, 1013, 2681, 3008, 2408, 3292, 843, 1569, 2385, 2734, 1605, 1413, 443, 2593, 1163, 1239, 2014, 783, 1773, 2574, 2450, 80, 760, 3150, 2495, 763, 3235, 2456, 2033, 1064, 2718, 534, 2202, 299, 612, 1585, 2342, 1360, 1308, 3246, 1146, 788, 1211, 783, 1471, 2124, 398, 2285, 2531, 994, 3263, 2893, 1074, 695, 1524, 3080, 894, 2625, 512, 1759, 2052, 916, 1074, 608, 644, 3141, 277, 1115, 1244, 3295, 1022, 1937, 1207, 1096, 2567, 1853, 1625, 2532, 534, 1443, 2334, 2936, 3230, 1282, 542, 18, 1030, 1792, 1598, 3267, 1880, 3213, 1318, 2900, 1931, 1871, 1677, 223, 2486, 2627, 1779, 1945, 240, 2493, 70, 3217, 189, 2838, 952, 2143, 3236, 1620, 398, 1922, 479, 440, 1424, 1538, 281, 971, 668, 994, 1200, 154, 2452, 745, 474, 462, 25, 684, 2216, 2045, 2962, 1599, 1659, 2517, 460, 19, 696, 2294, 614, 2282, 2546, 3081, 2283, 1197, 675, 537, 2278, 2680, 1624, 2793, 1187, 1766, 3278, 3162, 298, 561, 3300, 210, 2649, 643, 272, 1969, 1891, 787, 568, 423, 3263, 2003, 2642, 3065, 845, 726, 1002, 2673, 211, 6, 1058, 1126, 2912, 2357, 2493, 1682, 2878, 1044, 1661, 2427, 2278, 1435, 2201, 964, 2782, 1094, 1585, 95, 996, 1635, 462, 101, 2586, 702, 1186, 1200, 2658, 785, 1751, 2850, 1082, 1995, 1832, 592, 718, 2503, 845, 471, 917, 2668, 2022, 2520], [153, 2870, 2700, 2222, 2289, 2362, 2880, 434, 237, 1157, 1217, 1258, 529, 216, 2039, 632, 801, 1177, 846, 3283, 2928, 556, 497, 2045, 488, 2415, 270, 932, 3309, 2207, 1567, 1072, 3038, 1143, 1162, 2202, 1093, 897, 1530, 1793, 875, 1533, 344, 2089, 1670, 1517, 3316, 1918, 1807, 689, 2044, 1087, 523, 1793, 29, 3297, 2309, 3292, 2088, 1136, 2044, 2922, 570, 414, 2765, 2010, 1848, 355, 2566, 256, 2477, 2794, 990, 882, 994, 1062, 485, 1696, 550, 648, 2853, 2085, 3065, 1942, 317, 2527, 1139, 671, 1979, 437, 57, 2648, 1536, 3309, 69, 1061, 779, 2239, 388, 2325, 648, 1406, 811, 2049, 1520, 2168, 2834, 935, 2073, 2211, 2863, 412, 374, 511, 1478, 1497, 1286, 1904, 1994, 49, 2022, 2931, 2250, 2824, 3277, 198, 135, 67, 2689, 942, 1624, 10, 2475, 3012, 2342, 620, 743, 1841, 2725, 351, 2842, 2368, 3198, 2234, 902, 1513, 1034, 3104, 2285, 2153, 692, 1349, 2132, 363, 1355, 932, 334, 1150, 2968, 496, 2963, 1153, 2525, 2895, 787, 1747, 2289, 657, 511, 2167, 863, 2640, 185, 3061, 139, 3245, 2298, 285, 1725, 3324, 1094, 2624, 2431, 3195, 1644, 2997, 929, 1264, 943, 1465, 884, 3262, 687, 2971, 711, 1222, 509, 119, 1482, 1233, 174, 1969, 2405, 1928, 3170, 1896, 781, 2754, 2283, 3300, 1106, 853, 3086, 2295, 694, 2001, 1864, 1166, 1783, 623, 231, 2970, 221, 2465, 839, 3095, 1322, 2849, 589, 239, 1850, 152, 2995, 2443, 1516, 509, 2137, 2231, 2276, 3156, 1772, 3261, 105, 2271, 2845, 3071, 2791, 2548, 571, 2241, 2621, 1945, 3259, 1238, 2645, 2941]] BHat * rHat: [[1543, 2042, 1510, 2836, 1201, 2517, 2269, 179, 2136, 1238, 1383, 1803, 493, 2955, 3151, 3114, 1526, 2974, 2350, 4, 1260, 2779, 1774, 1509, 2880, 2684, 2612, 1779, 2610, 242, 2279, 2924, 2714, 210, 2765, 2912, 1737, 376, 2090, 3112, 2113, 1662, 891, 621, 2484, 2511, 1311, 2014, 395, 2519, 726, 796, 3074, 2714, 1336, 1669, 1272, 2131, 714, 1523, 1719, 1344, 669, 3130, 1254, 1492, 2878, 448, 2314, 336, 736, 2346, 2842, 2432, 2778, 1767, 2107, 2579, 884, 2490, 851, 2861, 1907, 1423, 116, 2521, 620, 1217, 1675, 1322, 1058, 200, 2651, 1753, 1460, 1280, 2913, 3219, 2773, 147, 738, 2656, 1455, 1688, 53, 2552, 1957, 2717, 1278, 678, 667, 294, 7, 836, 3224, 1846, 62, 574, 2446, 2639, 1747, 1911, 56, 2958, 2384, 223, 368, 2590, 2915, 541, 1855, 26, 652, 1692, 1555, 2431, 2461, 1852, 181, 2682, 1954, 591, 2169, 1335, 3209, 2526, 1862, 3108, 3004, 68, 1295, 1407, 3241, 2109, 1606, 3057, 2888, 1175, 1393, 911, 584, 89, 2305, 2683, 782, 3218, 1617, 19, 2209, 119, 2961, 141, 424, 28, 1874, 2287, 1264, 1326, 2725, 2876, 2694, 2237, 2529, 1851, 3078, 2013, 1574, 1222, 2029, 1185, 2870, 1424, 2724, 3292, 2679, 3088, 2311, 2703, 468, 356, 2705, 1483, 2729, 2718, 1225, 122, 3303, 3177, 2833, 3053, 1444, 1330, 3222, 3052, 2086, 2284, 3007, 506, 2570, 3220, 3139, 1385, 2444, 1138, 1341, 2767, 568, 1659, 784, 3218, 387, 1786, 3169, 308, 1169, 1873, 1585, 2188, 1603, 2695, 1532, 116, 3132, 2442, 1544, 1001, 835, 135, 3063, 2831, 2785, 2821, 2186, 1203, 1197, 3050], [855, 2295, 2396, 1118, 2704, 3002, 565, 2103, 1429, 1441, 1242, 1576, 2583, 3119, 1139, 3018, 544, 1377, 2295, 3013, 2574, 1439, 821, 2014, 3087, 2157, 2434, 355, 2732, 2912, 256, 864, 593, 8, 2616, 106, 3056, 2697, 1801, 1734, 1270, 3157, 60, 1387, 1052, 1982, 2484, 3176, 2816, 1969, 628, 1358, 3153, 3256, 1461, 338, 2578, 2644, 1646, 1878, 2747, 997, 2614, 727, 1080, 133, 672, 842, 2712, 1418, 2037, 676, 1549, 1245, 484, 508, 1030, 1661, 2599, 642, 454, 186, 845, 3310, 2879, 2313, 156, 2644, 2236, 604, 783, 1517, 732, 2089, 1259, 2998, 2775, 2937, 2500, 291, 2532, 1756, 2864, 2294, 3191, 829, 177, 1517, 2062, 1439, 2751, 133, 1872, 3047, 2975, 729, 1421, 1456, 1163, 2328, 2561, 439, 439, 503, 2237, 1870, 1097, 24, 674, 220, 3318, 851, 1060, 1020, 2849, 703, 2635, 2069, 2037, 2951, 2918, 205, 1429, 2787, 1382, 2586, 405, 2514, 88, 3084, 519, 2053, 3116, 951, 2652, 1920, 296, 2216, 1285, 683, 935, 1984, 1775, 464, 1532, 3201, 2990, 1336, 726, 40, 2626, 342, 606, 1178, 1540, 3109, 2010, 2268, 939, 220, 759, 2749, 1763, 814, 2665, 1811, 850, 2335, 2294, 1206, 1667, 1102, 2159, 2394, 2172, 3289, 1505, 664, 1253, 1786, 2980, 1728, 2365, 2843, 738, 1760, 1232, 446, 3197, 2777, 257, 2884, 3119, 2519, 2060, 1728, 2968, 1082, 2682, 521, 877, 2171, 930, 1763, 2310, 1044, 236, 2134, 96, 1641, 58, 2641, 2003, 1507, 1108, 1760, 2299, 1637, 2372, 710, 1796, 769, 738, 3247, 1656, 2790, 1624, 2209, 1494, 1108, 2064, 1565, 1656, 1725, 1307, 3133]] NTTInverse(BHat * rHat): [[1262, 1792, 1692, 1491, 741, 1006, 518, 2135, 3114, 433, 2704, 2877, 2631, 2987, 2765, 1430, 1319, 3062, 20, 2252, 1035, 1235, 1575, 706, 3139, 3047, 838, 2049, 682, 3276, 2954, 2263, 2640, 129, 3084, 2238, 1304, 288, 1791, 938, 2524, 2126, 43, 2683, 659, 669, 2697, 71, 2950, 349, 2044, 1138, 115, 3228, 257, 85, 3042, 2092, 801, 2577, 2370, 1051, 605, 604, 1421, 1188, 1290, 3270, 2004, 545, 2363, 802, 2442, 3289, 206, 1112, 2435, 2623, 552, 1088, 756, 1699, 314, 2919, 1314, 576, 186, 1908, 2657, 854, 3226, 2586, 2128, 2621, 991, 367, 1622, 52, 2528, 1782, 2638, 2568, 2330, 3101, 801, 1587, 2595, 2470, 224, 3238, 479, 2892, 2956, 42, 2270, 2117, 1652, 273, 1308, 2074, 2952, 990, 781, 1324, 2923, 1492, 126, 354, 2743, 3250, 3034, 937, 2617, 1870, 2838, 1116, 1910, 1377, 2697, 3320, 507, 366, 1472, 488, 1633, 2840, 371, 3091, 1538, 497, 347, 965, 1363, 496, 3318, 83, 2117, 2590, 2127, 2371, 308, 318, 1580, 573, 2925, 2738, 2638, 1632, 2813, 362, 2255, 1236, 632, 2049, 797, 2328, 1141, 58, 639, 2275, 2416, 2716, 387, 1532, 588, 991, 877, 756, 1199, 2816, 3048, 3322, 2798, 280, 1472, 2577, 2948, 243, 1327, 1918, 3142, 2251, 3222, 797, 91, 2406, 3323, 1063, 3207, 2337, 2741, 877, 2542, 2982, 1438, 2635, 458, 1792, 1479, 3026, 1599, 2391, 1159, 1807, 1653, 2296, 552, 419, 337, 112, 2731, 1754, 2949, 2935, 2112, 2731, 2524, 784, 2095, 2172, 1331, 2746, 3040, 116, 2295, 356, 3033, 2599, 1813, 2243, 1411, 987, 1441, 1760, 2699, 3135], [1131, 1312, 870, 2363, 1580, 1447, 776, 544, 801, 2862, 2291, 2223, 3157, 1862, 797, 893, 2277, 2895, 2622, 2746, 289, 3319, 1456, 3194, 729, 192, 1937, 437, 1971, 2984, 2224, 3130, 707, 1873, 1863, 2758, 3168, 2702, 3031, 755, 575, 2682, 2775, 1028, 243, 598, 119, 2454, 1069, 1037, 972, 341, 1572, 1309, 2755, 2769, 2854, 2757, 2350, 800, 791, 364, 1114, 830, 361, 3321, 865, 2807, 3152, 1918, 64, 2708, 2444, 740, 54, 1363, 924, 2704, 328, 1292, 2389, 832, 1351, 780, 2281, 3137, 1463, 1004, 2911, 2868, 368, 2765, 1367, 2705, 343, 3304, 2982, 1020, 580, 1438, 166, 438, 1167, 3310, 2132, 1932, 3157, 109, 2040, 484, 685, 1462, 1023, 2813, 2326, 618, 588, 464, 697, 148, 15, 1036, 2928, 2515, 276, 153, 2448, 179, 575, 1312, 2120, 2721, 576, 569, 3042, 3229, 436, 1299, 2676, 1395, 2943, 2397, 1750, 2605, 1760, 163, 998, 3189, 2929, 733, 249, 2960, 1025, 2164, 1987, 975, 1564, 3024, 3195, 602, 1612, 2219, 1653, 3234, 457, 3211, 2897, 639, 2446, 2524, 2678, 2932, 2655, 2683, 2861, 1449, 2378, 2666, 2586, 2648, 1459, 946, 833, 2242, 2062, 847, 1570, 1476, 1796, 1620, 1702, 2770, 660, 1131, 2427, 1734, 2802, 1143, 1456, 2846, 2871, 2709, 764, 2119, 201, 402, 1536, 29, 2577, 1879, 765, 629, 3302, 1503, 2962, 2031, 3217, 2581, 1728, 769, 2535, 2356, 2431, 3158, 2645, 2164, 1248, 2736, 697, 1493, 382, 1497, 1474, 2210, 2213, 575, 3316, 2700, 3124, 2099, 1439, 276, 3056, 655, 1492, 497, 2214, 336, 648, 566, 1139, 2582, 445, 740, 2492, 3093]] u = NTTInverse(BHat * rHat) + e1: [[1261, 1793, 1692, 1490, 741, 1006, 517, 2135, 3114, 432, 2704, 2877, 2632, 2988, 2765, 1430, 1318, 3062, 20, 2253, 1036, 1234, 1574, 707, 3139, 3047, 837, 2048, 683, 3277, 2956, 2261, 2639, 128, 3084, 2238, 1302, 288, 1791, 938, 2522, 2126, 41, 2682, 661, 670, 2699, 70, 2949, 349, 2044, 1138, 115, 3228, 257, 86, 3043, 2093, 800, 2579, 2370, 1053, 604, 603, 1421, 1189, 1290, 3271, 2003, 544, 2362, 802, 2440, 3289, 206, 1112, 2435, 2622, 551, 1088, 755, 1700, 313, 2919, 1312, 576, 184, 1907, 2657, 855, 3225, 2584, 2129, 2619, 990, 366, 1623, 51, 2527, 1782, 2637, 2569, 2332, 3102, 801, 1587, 2593, 2469, 222, 3238, 478, 2891, 2957, 41, 2272, 2119, 1651, 273, 1308, 2076, 2951, 988, 780, 1325, 2924, 1492, 127, 352, 2744, 3251, 3034, 938, 2616, 1871, 2836, 1117, 1911, 1378, 2698, 3319, 506, 365, 1472, 489, 1632, 2839, 371, 3090, 1538, 496, 348, 965, 1362, 496, 3319, 84, 2118, 2588, 2128, 2371, 307, 317, 1578, 575, 2924, 2738, 2638, 1631, 2812, 362, 2254, 1236, 630, 2047, 798, 2327, 1141, 59, 639, 2277, 2415, 2716, 387, 1533, 588, 992, 878, 756, 1201, 2815, 3048, 3323, 2799, 279, 1472, 2578, 2948, 244, 1327, 1920, 3142, 2252, 3222, 798, 93, 2407, 3324, 1063, 3207, 2338, 2741, 878, 2543, 2983, 1439, 2635, 457, 1793, 1479, 3026, 1598, 2393, 1159, 1807, 1652, 2296, 552, 418, 336, 111, 2729, 1753, 2949, 2936, 2113, 2732, 2525, 784, 2096, 2174, 1329, 2745, 3040, 115, 2294, 355, 3034, 2599, 1811, 2242, 1410, 987, 1440, 1760, 2699, 3136], [1130, 1312, 869, 2365, 1581, 1446, 775, 545, 800, 2863, 2290, 2223, 3157, 1860, 797, 892, 2277, 2894, 2621, 2748, 288, 3318, 1456, 3193, 728, 193, 1937, 436, 1971, 2983, 2224, 3130, 708, 1872, 1863, 2758, 3167, 2703, 3032, 754, 575, 2681, 2776, 1029, 242, 599, 119, 2454, 1069, 1036, 973, 340, 1572, 1309, 2755, 2770, 2853, 2757, 2351, 801, 791, 363, 1114, 832, 361, 3322, 867, 2807, 3151, 1918, 65, 2708, 2445, 740, 55, 1361, 924, 2703, 327, 1293, 2389, 832, 1352, 779, 2279, 3137, 1463, 1003, 2912, 2867, 368, 2765, 1368, 2705, 344, 3304, 2983, 1020, 582, 1438, 166, 439, 1169, 3310, 2134, 1933, 3156, 108, 2042, 484, 685, 1462, 1024, 2812, 2326, 617, 586, 464, 699, 149, 16, 1038, 2928, 2516, 275, 155, 2448, 179, 576, 1311, 2120, 2722, 577, 569, 3041, 3229, 436, 1299, 2675, 1395, 2943, 2398, 1749, 2606, 1760, 162, 996, 3189, 2929, 732, 250, 2961, 1026, 2165, 1988, 976, 1566, 3025, 3197, 603, 1610, 2220, 1655, 3232, 458, 3212, 2897, 638, 2447, 2524, 2679, 2931, 2655, 2684, 2862, 1449, 2377, 2667, 2587, 2647, 1459, 947, 834, 2241, 2062, 847, 1570, 1477, 1797, 1620, 1701, 2770, 660, 1131, 2428, 1733, 2801, 1143, 1457, 2845, 2871, 2710, 763, 2119, 200, 403, 1536, 28, 2577, 1880, 764, 630, 3301, 1502, 2963, 2032, 3216, 2579, 1727, 770, 2535, 2356, 2431, 3159, 2645, 2162, 1247, 2736, 697, 1494, 382, 1497, 1473, 2209, 2212, 576, 3317, 2702, 3125, 2098, 1439, 276, 3057, 654, 1492, 498, 2216, 335, 647, 565, 1137, 2582, 446, 739, 2492, 3094]] mu: [1665, 0, 0, 1665, 1665, 0, 0, 0, 1665, 1665, 1665, 0, 1665, 0, 1665, 0, 1665, 0, 1665, 0, 1665, 0, 1665, 0, 0, 0, 1665, 1665, 0, 1665, 1665, 1665, 0, 0, 1665, 0, 0, 0, 0, 0, 1665, 1665, 0, 1665, 1665, 1665, 0, 1665, 0, 1665, 1665, 0, 1665, 1665, 1665, 0, 1665, 0, 0, 0, 1665, 1665, 1665, 0, 0, 0, 1665, 0, 0, 0, 1665, 1665, 1665, 1665, 0, 0, 1665, 1665, 0, 0, 0, 0, 1665, 0, 1665, 0, 0, 0, 0, 1665, 1665, 0, 0, 0, 1665, 0, 1665, 1665, 0, 1665, 1665, 1665, 0, 1665, 0, 0, 0, 1665, 0, 1665, 1665, 1665, 1665, 0, 1665, 0, 1665, 0, 0, 1665, 1665, 0, 1665, 0, 0, 1665, 0, 0, 0, 0, 1665, 0, 1665, 0, 0, 0, 0, 0, 0, 0, 1665, 0, 0, 1665, 1665, 1665, 0, 0, 1665, 0, 1665, 0, 1665, 0, 0, 0, 0, 1665, 0, 0, 0, 1665, 0, 0, 0, 1665, 0, 1665, 1665, 1665, 1665, 0, 1665, 0, 0, 0, 0, 1665, 1665, 1665, 0, 1665, 1665, 0, 1665, 1665, 0, 0, 1665, 0, 0, 1665, 1665, 1665, 0, 1665, 1665, 0, 1665, 0, 0, 0, 1665, 0, 1665, 0, 1665, 0, 0, 0, 0, 0, 0, 1665, 0, 0, 0, 0, 0, 0, 0, 0, 1665, 1665, 1665, 0, 1665, 0, 1665, 0, 1665, 1665, 0, 1665, 0, 1665, 0, 1665, 1665, 1665, 0, 0, 1665, 0, 0, 0, 1665, 0, 1665, 0, 1665, 0, 0, 1665, 1665, 0] tHat^T * rHat: [474, 1376, 1132, 3010, 891, 2219, 2908, 2935, 1253, 763, 2954, 1511, 2031, 331, 2722, 1959, 1548, 58, 2185, 2256, 2257, 692, 2086, 1659, 3002, 627, 2156, 2421, 2648, 13, 1169, 2843, 1429, 2709, 563, 992, 2112, 2855, 1367, 92, 1669, 3044, 1221, 2938, 919, 357, 1616, 2927, 1260, 77, 2778, 2526, 2148, 1749, 446, 2201, 3125, 1803, 784, 2865, 3074, 3057, 715, 1352, 203, 1281, 3021, 2640, 2088, 1453, 2081, 1846, 375, 1467, 1925, 1486, 1653, 78, 3047, 1159, 3119, 854, 1992, 2435, 949, 2631, 2924, 1393, 2232, 3067, 2685, 3159, 875, 197, 2418, 521, 2211, 2482, 2034, 1237, 1239, 2799, 3260, 508, 1583, 2208, 853, 2224, 187, 2505, 2902, 724, 492, 1388, 3239, 948, 3229, 594, 2246, 555, 131, 734, 2142, 1682, 1735, 1488, 2786, 223, 1346, 66, 936, 2635, 688, 3028, 1727, 945, 2259, 735, 883, 2039, 260, 2687, 1643, 3310, 1819, 2805, 1954, 107, 2899, 3172, 2126, 2686, 1656, 884, 2654, 1351, 23, 1013, 1695, 694, 224, 2518, 1195, 3034, 2178, 830, 1088, 2782, 1916, 1058, 3175, 1914, 2925, 264, 2699, 1523, 1140, 1949, 407, 686, 2624, 2646, 2078, 3080, 1324, 2449, 2388, 2390, 215, 2167, 190, 178, 1342, 3051, 637, 3012, 1031, 1600, 2066, 834, 2532, 2080, 2114, 115, 2480, 1006, 57, 208, 3068, 2594, 3205, 3067, 1244, 2583, 1495, 1844, 2610, 867, 3008, 698, 702, 835, 2898, 272, 2742, 210, 1750, 3128, 73, 1308, 634, 1916, 1286, 1831, 731, 3255, 1165, 2, 1559, 2539, 1751, 1680, 200, 1957, 2809, 2302, 2968, 399, 1064, 1227, 333, 2502, 2727, 510, 2271, 2451] NTTInverse(tHat^T * rHat): [1121, 135, 2210, 1197, 1834, 3261, 1526, 865, 695, 1984, 3092, 2833, 763, 1317, 345, 713, 1, 1484, 632, 2551, 2446, 486, 1259, 376, 3102, 2743, 2082, 1299, 2606, 1823, 2957, 177, 3043, 200, 554, 2434, 1046, 1647, 711, 2409, 1465, 835, 2470, 2840, 1326, 1173, 159, 2113, 1887, 3242, 2935, 1698, 1918, 891, 1052, 2314, 2251, 1814, 2198, 356, 305, 1548, 607, 1413, 1205, 2524, 1311, 2635, 2176, 2517, 701, 444, 61, 1423, 1152, 2509, 184, 2048, 82, 908, 3227, 2433, 2769, 2125, 1145, 1743, 1501, 1694, 1346, 828, 957, 2822, 2588, 2758, 3044, 2766, 562, 2392, 3072, 3141, 1901, 3151, 2754, 2606, 2551, 1653, 314, 2106, 477, 2685, 2792, 1697, 2961, 730, 2228, 490, 1399, 1844, 2072, 2389, 485, 2141, 1680, 184, 891, 497, 953, 552, 371, 1682, 1958, 3274, 2237, 21, 793, 2266, 643, 2849, 1821, 313, 2310, 993, 239, 1906, 222, 1087, 435, 1833, 263, 2435, 62, 2402, 3174, 1401, 2068, 310, 2415, 2268, 1628, 2928, 1861, 2409, 1332, 1716, 3083, 22, 1172, 2393, 2300, 1465, 1995, 225, 2466, 149, 1770, 3098, 642, 2861, 736, 206, 352, 1741, 1404, 1739, 402, 2576, 3163, 1120, 108, 767, 938, 2507, 2034, 1415, 2998, 634, 286, 2494, 26, 938, 3326, 1119, 3059, 1412, 1527, 2190, 1492, 387, 547, 1227, 2762, 1379, 1023, 2151, 1925, 799, 1715, 3053, 759, 714, 2460, 1592, 1654, 1584, 774, 2901, 1501, 2187, 111, 296, 2520, 923, 47, 3019, 3187, 1018, 1100, 2185, 1146, 2734, 3063, 3069, 2020, 1239, 486, 598, 1936, 1595, 2447, 623, 293, 418, 1621, 1373, 2371, 1097] e2 + mu: [1665, 2, 2, 1665, 1664, 0, 1, 1, 1666, 1667, 1666, 3328, 1664, 0, 1664, 2, 1665, 1, 1666, 1, 1664, 3328, 1664, 1, 3327, 3328, 1666, 1666, 0, 1665, 1664, 1666, 0, 0, 1663, 3328, 0, 1, 0, 1, 1665, 1666, 1, 1665, 1664, 1665, 1, 1663, 0, 1664, 1665, 0, 1665, 1664, 1664, 2, 1666, 1, 0, 0, 1666, 1664, 1664, 3328, 3328, 1, 1666, 0, 1, 3328, 1665, 1666, 1666, 1667, 0, 0, 1664, 1665, 1, 0, 3328, 0, 1666, 1, 1666, 3328, 0, 1, 3327, 1664, 1666, 1, 0, 3328, 1664, 3327, 1665, 1666, 3328, 1665, 1666, 1665, 3328, 1664, 3327, 3328, 0, 1665, 0, 1665, 1665, 1666, 1664, 3328, 1664, 3328, 1666, 1, 0, 1666, 1664, 0, 1664, 3328, 2, 1664, 3328, 0, 3328, 2, 1665, 0, 1665, 3327, 1, 0, 1, 1, 0, 2, 1665, 1, 0, 1665, 1664, 1665, 0, 1, 1664, 1, 1666, 0, 1665, 0, 0, 3328, 0, 1666, 1, 0, 0, 1666, 0, 0, 3328, 1666, 3328, 1664, 1664, 1664, 1665, 0, 1666, 0, 0, 0, 1, 1666, 1664, 1665, 0, 1666, 1666, 3328, 1665, 1666, 2, 0, 1665, 1, 1, 1664, 1666, 1665, 0, 1667, 1665, 1, 1666, 1, 1, 3328, 1665, 1, 1664, 1, 1665, 3328, 0, 0, 0, 3328, 1, 1663, 1, 3328, 3328, 3328, 1, 0, 3328, 0, 1667, 1665, 1664, 0, 1664, 3327, 1665, 3328, 1666, 1666, 0, 1665, 0, 1666, 0, 1664, 1666, 1665, 3328, 3328, 1666, 3328, 0, 0, 1663, 3327, 1663, 3327, 1664, 3327, 3328, 1667, 1666, 0] v = NTTInverse(tHat^T * rHat) + e2 + mu: [2786, 137, 2212, 2862, 169, 3261, 1527, 866, 2361, 322, 1429, 2832, 2427, 1317, 2009, 715, 1666, 1485, 2298, 2552, 781, 485, 2923, 377, 3100, 2742, 419, 2965, 2606, 159, 1292, 1843, 3043, 200, 2217, 2433, 1046, 1648, 711, 2410, 3130, 2501, 2471, 1176, 2990, 2838, 160, 447, 1887, 1577, 1271, 1698, 254, 2555, 2716, 2316, 588, 1815, 2198, 356, 1971, 3212, 2271, 1412, 1204, 2525, 2977, 2635, 2177, 2516, 2366, 2110, 1727, 3090, 1152, 2509, 1848, 384, 83, 908, 3226, 2433, 1106, 2126, 2811, 1742, 1501, 1695, 1344, 2492, 2623, 2823, 2588, 2757, 1379, 2764, 2227, 729, 3071, 1477, 238, 1487, 2753, 941, 2549, 1652, 314, 442, 477, 1021, 1128, 34, 1296, 729, 563, 489, 3065, 1845, 2072, 726, 2149, 2141, 15, 183, 893, 2161, 952, 552, 370, 1684, 294, 3274, 573, 19, 794, 2266, 644, 2850, 1821, 315, 646, 994, 239, 242, 1886, 2752, 435, 1834, 1927, 2436, 1728, 2402, 1510, 1401, 2068, 309, 2415, 605, 1629, 2928, 1861, 746, 1332, 1716, 3082, 1688, 1171, 728, 635, 3129, 331, 225, 803, 149, 1770, 3098, 643, 1198, 2400, 1871, 352, 78, 3070, 1738, 2067, 913, 3165, 1120, 1773, 768, 939, 842, 371, 3080, 2998, 2301, 1951, 2495, 1692, 939, 3327, 1118, 1395, 1413, 3191, 2191, 3157, 386, 547, 1227, 2762, 1378, 1024, 485, 1926, 798, 1714, 3052, 760, 714, 2459, 1592, 3321, 3249, 2438, 2901, 3165, 2185, 1776, 295, 857, 2589, 47, 1355, 3187, 2684, 1100, 520, 2812, 1070, 3062, 3068, 357, 1238, 486, 598, 270, 1593, 781, 621, 1957, 416, 1620, 3040, 708, 1097] KBar: 59083ED864711F4AE886A8F055932D84294CEAB01B51A0F12ABBA30EB9809715 cPrime: 84A188A072E4D4F449A4BE170274DD2A5F3E356E95B96E40AD3FF1455E36C6A71E909DD2C0DFF8AD2C9F503BAC9065716248083BDA40CECB38E3B3058BAF51A7572384FF8406A8136A4FC6D912A54B2EB5B9D598FB689E72ED3DEFD2FF8355ED9E9CCA53E82C0886E094C592C392311F04FEC68F9A1C531CF3419030892B5BDCACEEF6A0E7F1BD44903F49DE8E37B02BA3FC5121D99F8CC3040F66832F77021B4CA35F7A4825038936564CA2E673FF9CC0519C25F6A52D87EDD965B2464AA365D2BF068B72FC68B65E88515E2C832BBDB27D61BF512B5FC2D8590FB35F49500CAFE70E7D0776B5C4E4503A7189ADBAFF5D5B515CC68B2F81D993C6D7FA7D3D1D90EBFF51DA3FBBB4430E5BBEDBCA8DA078DCE8EC815B168BFC09AB4A20678870F4868B1FAE28D209C75368A799317DFA08C2B651FAC72DCA2A1B4CBB75E873F15C51B6D0B5E6F5E60E2AF6C40D2CABCBF3588F44BCEA6D72D359F40F9CF5E0EC40A5215E5ACEEAF0DA00D923D4CEFF5C3A3AB1E46C754F4AE052C2BC49FDB4521AE44DF634D56E433DAD3DF3C07115406FF8BFD0D7C93B4941D0F09213C1681CFD5C8663DF02041A3CBD162F5C4D80CB1DC7D4A501AD06FE96EB348B6E331C8296FE904EB97C087456328D703B85BDAC2FB43C728D0B05FC54B8C155C010EF0DB14CC668D1B1BC727AF8864076736B898BABA1C81DCA2053F58587D3C4E33C694A264BE2897E7D2EEFADDA9FF88D70BF3731F1228CB3E131EB0CB76FDBD2CCB1CBC18D1450AC7A16349E7129CAB720D5CB70B56E855E8305DCDA730BBD0EA33EF0815D02190BB98E30F73BF7789CDD673C613B0C57CB2EF32E670A98D2D630670773C59D8A6A2CFCFF1C7CA1BB55C17A32CB65A2EA19C7B8E295C6898CF32FEE1DEB01472BE76C3A78CB242EDFE21D961FCB85C3CF6CEE218986C1BD932BF97BC6DECAABF8C62940C0A58E87C6EDDCD74B7F715D8C22520546239F3AAA10A435820103B4E3295311D992C9C8771A3CE849868F36F31214F9639C028F4A5F4945F2BEC9585077BF2F637D2549F8348C00ECBF19C470DF255EFF6232813429F853 Accepted, returning KPrime fips203-0.2.1/tests/nist_vectors/Decapsulation -- ML-KEM-768.txt000064400000000000000000002261561046102023000216650ustar 00000000000000Decapsulation -- ML-KEM-768 dk: 3456859BF707E672AC712B7E70F5427574597502B81DE8931C92A9C0D22A8E1773CB87472205A31C32206BA4BCF42259533CB3A19C0200860244A6C3F6921845B0A05850187A4310B3D5223AAAA0C79B9BBCFCCB3F751214EB0CFAC1A29ED8848A5A49BA84BA68E6B6F5057D493105FF38A9F44B4E7F6CBE7D216408F7B48605B270B253B001A5401C0C9127CC185B1B0CF92B99FBA0D95A295F873515520C86321B8C966C837AAB34B2BFFAB2A2A4301B356B26CDC4563802901B4762F284281A382E5F762BEF47B519A81A108657EBE962BE120B5FB3B9ED338CCF47B3A03952A16633F6E6B534E6B63D05706EFA0F94C03A2B856AE551422F9011F2589A41B96A2CD213C6999B09E91FF423CB106A1A920B84B811469497154223987F005C72F8AF388B090C639F8C774FC5A294C74A212C91A86C328AEBEA558AB43F8B873534FA2EF9E66CEF3C52CD471AB78375E745B9D0AA65D2278B9275AE5348B16CF62AC8065734E4BD77B80CCF897605EB76F485AF8A0B466557A83C0292CCF903EE7AA57C3B51AD660189B86139E380425B31A92689DF2431BFA7B69EAB1727451B29DA8B8BF851E1BC2D3A63134CA9663C57AEC6985CEBD56DB0447B136B017A974761C3C67D33772F9964E5434D643504332A3027294A078C599CB29163109CE3B56CE698B4D3F59E2956A1F03A4B955593F2D2457FFAAE9624A0711045B3F55292F20CC9D0CD791A21597B0F2CD980F3510F0B0239022000D735586EE6A73F3A3DCBD6BD1A85C86512ABF3C51CE00A0331F65360462C022329597A81C3F92FC17938C9138F4111387979C28F0334F90119221374DAB045929B49E43A9646A243F4464DAF811AB00630C75961BCD4AF5D99115A3749191BA8FD41CE0B3C89A695B4BB85064FD3AF95C9B4AEE09AC7B0CC69ECA36A004B6CD662A6D32795053EF0A03ADA3B98BFE3B46A79723E3A45AB3C31950669AD77072062CC3B504DF1334FD6909EAC7915F1D5AD16639F5FB564416454259134D565882CB381CBA58B76880767B50AC1B85795D7268433B371230ED4C72F99AB1AD1E595A459CF0A2334AA1463ADE4BDC9249605381857BB98095B41132946CA2457DFAA9149582AA19927B63689E2929AA41027BEF4921970BAD4A55490D91ABE251DEF4552CA88034106A02CE4B058F8B59624B67E063BF178B015E4281EB114A2BC2454943A4B4647122C42CBEA4E94154FD3E4B791F6290B782994206853D67000A633F320A8A374CA5D4038F9CA4244DCB02E9A84E1F7C8A821132B32B9A840557B34780665301724BA2606681D945E34D7CF941B8963CAA1001A491B8B2E43570E9AB95C0A57C503F0AB960B4856D0251574710FE5CB474284FC1049AA2A7B03694A1C763E99DAC6AD0BA8038B138A64432E349116A031E8C792781751BA473CBDF55720005ABDAA13D50182F0E633776BB0675C40472BAD1F9672769183D0CCC810BC25A8573220569F6AC4BAC22A1354D8B36C0580D0E5299E629C506CC7655546FF27810C97B51BA056BBF86ED9CB7C0A537F72D0CF9AD2C231E29EBF553F613CBB15B3721A20077E505FD390CB19F6488A107DEE1CAC58AB7034BA690300219595B3695C1234E8B57E33C8D3A048454A616DF3C9B56A6FF2026AF997725FC95579043BAE9399B6790D637B4FA820B0B2D2CAB607BAF6A372734C31EE0026F3C076D14A8E3EE66AAD8BBBCCEB9DC70C7B6BB0BB76C200C231601CA0873EC8710F4B18D57290B033727C601EDB71C2B0F0C21D553E0E7A4F77716839C7C8448ABB9F66A54E8A4B08A79D9A392CA1270031388BAD56217E32AEF55411974906A245C00712B3CBB1170685193FE25ACD7AC13D32073F3879A5D78375F0052CF79175BAB46D22370597BD06789EDD0711CC4243507A02B4FAADBB62250CC997AE0327AEB00DEB529192A64B1096A86B19674D0B0AF05C4AAE178C2C9A6442E94ED0A56033A11EE42632C0B4AA51D42150790F41062B77253C25BA4DE559761F0A90068389728BC977F70CF7BCCFBD883DF13C79F5F2C34312CB1D5A55D78C1B242096A8C0593CFB2753460BD30ABA306C74173995748385D00B3670E61324D87DE8A14450DC493768777FF0CE6810937A711229561A5EF2BB69861074E00BD93266E4B86269E18EEA2CAACB60A1358636CD7A7CA6BB682130241784B101EA5BFD6C3A07158621614736F6996D5A4E14963A12D836E533A0C8912DB7E11685A4A53D8285F08750DFF66DA27C23B97542DEFB99E470ACD5E647C940CB57301B43CC3E68E64E28B06770695EF609265E06C60F22CB875849E62BAB88CC10ECF622C379CB54F13D8B2BAC902B9AB02BB330B45AC8B741C2647AC45B5BF48A6D3FE039986CC940C60A94E66CF644531016A5272450824314B5662A0A909ABFB46FD27BAED3ABA8259361596882B08B2AC7233930FC3786738ED2F81EE638C45C3B9CFD1951DB5BCC1445C2C1625D57D57B53904B6A1AB681580755E89FA79775A657CD62B4426304BC0C711E2807A2C9E852D4B4359EE6B53E4675F523C90782572DC7368FB400C328C70FC846B5E98A4330BBB627BDD784B4DAF0B1F645944942B4C2B6225C8B31E989545522BA6F10396034CB1CA745977844D570894C611A5608A757416D6DE59963C32798C493EFD2264C231910E9A30090CA7B5384F231B89BA68A238190EF1A2A43CB01703470A0F061A70738944BCD9B7004F24797AECB88B1091CFED0590B0415453C39B6EC45B66305FAEA6B55A4B7967505FE3862A267ADBFE05B9181A06501893391650EAAA4A6D16853349276F98E0F44CD726615C61C16713094D8AB093CAC71F2803E7D39109EF5009C9C2CDAF7B7A6B37A33A49881F4BB5D7245A14C5042280C76A84E63F49D0D619D46D723BAA747A3BA90A6FB637A9A1DC02268FD5C043D18CBA1528AC8E225C1F923D1CC84F2E78E25DC3CCE9353C9DAC2AD726A79F64940801DD5701EFBDCB80A98A25993CD7F80591320B63172718647B976A98A771686F0120A053B0C4474604305890FECAF23475DDCC11BC08A9C5F592ABB1A153DB1B883C0507EB68F78E0A14DEBBFEEC621E10A69B6DAAFAA916B539533E508007C4188CE05C862D101D4DB1DF3C4502B8C8AE1457488A36EAD2665BFACB321760281DB9CA72C7614363404A0A8EABC058A23A346875FA96BB18AC2CCF093B8A855673811CED47CBE1EE81D2CF07E43FC4872090853743108865F02C5612AA87166707EE90FFD5B8021F0AA016E5DBCD91F57B3562D3A2BCFA20A4C03010B8AA144E6482804B474FEC1F5E138BE632A3B9C82483DC6890A13B1E8EE6AF714EC5EFAC3B1976B29DADB605B14D3732B5DE118596516858117E2634C4EA0CC c: DFA6B9D72A63B420B89DDE50F7E0D56ECF876BFEF991FCE91C8D286FA6EABAC1730FD87741FE4AD717B282A21E235A55C3757D88D4CE62F414EB77EB9D357EE29D00087BF8110E5BBBC7C90419072EAE044BF7E183D43A94B2632AA14649619B70649521BC19370942EF70F36C34C8C23591EE0CA71A12D279E0F52D39ED0F913F8C262621FB242E680DEB307B0749C6B393A8EF66F8B04AAFA877B951AB93F598B4B2FAB04F88AC803984FF37E3FE74F3A616D5314EB3A826F874F8ECD3A5647D04942A57EFC09638470DC0A9DF40B317571D3984A78CF7D11751090722B3059E07591CC4A2ED9BA0DCE99BE9E5EE5DB8D698CDEB5814759BA977C90079CF2AFDE478069C513A60091A3A5D0111E22DE06CB145C14E22A214CB278C8152B0681BCAFF54D552B54A671C0DFEF775E7C54FEFC4853868C955971ABDAC2A76292CCCD4FD1C706B7D3614159673E9D7B29A2D3F63363129E7A21E803A460F2714E3E25922780AF38257CD1495ACD1E01980638DF58A153DAB07EFB5C7E78ADACF631956D69CCDA070459568BD9D11A2934BCF1643BC99468238910B1F742EBB3C03D39FD45CFB85BA309E29DD9B5CD560819EC729FCAC8B9D725E3E8ABEDE4B5298A8658EE3F781B0CE683CBB7335CD57EFE2204A8F197446D7314CDBF4C5D08CCC41F80857CC9571FBFB906060F7E17C8CEF0F274AFF83E393B15F2F9589A13AF4BC78E16CDDE62361D63B8DC903B70C01A43419CD2052150BD28719F61FF31F4A9BEC4DDBCEC1F8FB2EFBF37DFFFA4C7FECA8CE6D626BFDA16EE708D9206814A2EF988525615D4AC9BE608C4B03ABEE95B32A5DB74A96119A7E159AF99CD98E88EAF09F0D780E7C7E814B8E88B4F4E15FA54995D0ECBAD3EF046A4947F3E8B9E744241489B806FE9401E78BAFC8E882E9D6D0700F720C0024E7DA49061C5D18A62074040ABC0003200ED465231797930A2E2AA501F64862DDA13014A99F9D3270AA907EEB3FDBFF291600DF1F6B39684B11E396B70D86F90492E82B09BA25607B0C286FBC070182AC76FA7C859AAFEA87016AED22C3605A2789A1D439FD8D933342DAB745A3E550E7D77C01A6234BDA7D6BB19D495E6560FCE8396FC3C6E088ED60F5F2771416EA3BE5BE472B6404906C91E71D9A8672F390083655AB7D0EC6EDFE86789CE20BE2EA90CA5CC31416FB24CBAF94DA1468FE696BCDF5247CF117CBE9334076CA6896B2F6A016B1F7C73728807898D8B199756C2B0AA2457E1B4F7754C4576CE5645614EA15C1AE28B094EB217C7A7A41239576CBDA380EE68783432730AD5EBE7F51D6BE7FB02AB37BE0C96AAC9F3C790A18D159E6BABA71EC88C110FD84C336DF630F271CF79328B6C879DF7CDE0F70712220B1FBB9ACB48248D91F0E2B6E3BE40C2B221E626E7E330D9D83CC0668F7308591E14C7D72B841A6F05F3FDC139EECC1536765650B55A9CEC6BBF54CCEC5C3AC9A0E39F48F237BD4C660CB1A8D250BB6C8C010FEC34CC3D91599271C7531330F12A3E44FAFD905D2C6 dk_pke: 3456859BF707E672AC712B7E70F5427574597502B81DE8931C92A9C0D22A8E1773CB87472205A31C32206BA4BCF42259533CB3A19C0200860244A6C3F6921845B0A05850187A4310B3D5223AAAA0C79B9BBCFCCB3F751214EB0CFAC1A29ED8848A5A49BA84BA68E6B6F5057D493105FF38A9F44B4E7F6CBE7D216408F7B48605B270B253B001A5401C0C9127CC185B1B0CF92B99FBA0D95A295F873515520C86321B8C966C837AAB34B2BFFAB2A2A4301B356B26CDC4563802901B4762F284281A382E5F762BEF47B519A81A108657EBE962BE120B5FB3B9ED338CCF47B3A03952A16633F6E6B534E6B63D05706EFA0F94C03A2B856AE551422F9011F2589A41B96A2CD213C6999B09E91FF423CB106A1A920B84B811469497154223987F005C72F8AF388B090C639F8C774FC5A294C74A212C91A86C328AEBEA558AB43F8B873534FA2EF9E66CEF3C52CD471AB78375E745B9D0AA65D2278B9275AE5348B16CF62AC8065734E4BD77B80CCF897605EB76F485AF8A0B466557A83C0292CCF903EE7AA57C3B51AD660189B86139E380425B31A92689DF2431BFA7B69EAB1727451B29DA8B8BF851E1BC2D3A63134CA9663C57AEC6985CEBD56DB0447B136B017A974761C3C67D33772F9964E5434D643504332A3027294A078C599CB29163109CE3B56CE698B4D3F59E2956A1F03A4B955593F2D2457FFAAE9624A0711045B3F55292F20CC9D0CD791A21597B0F2CD980F3510F0B0239022000D735586EE6A73F3A3DCBD6BD1A85C86512ABF3C51CE00A0331F65360462C022329597A81C3F92FC17938C9138F4111387979C28F0334F90119221374DAB045929B49E43A9646A243F4464DAF811AB00630C75961BCD4AF5D99115A3749191BA8FD41CE0B3C89A695B4BB85064FD3AF95C9B4AEE09AC7B0CC69ECA36A004B6CD662A6D32795053EF0A03ADA3B98BFE3B46A79723E3A45AB3C31950669AD77072062CC3B504DF1334FD6909EAC7915F1D5AD16639F5FB564416454259134D565882CB381CBA58B76880767B50AC1B85795D7268433B371230ED4C72F99AB1AD1E595A459CF0A2334AA1463ADE4BDC9249605381857BB98095B41132946CA2457DFAA9149582AA19927B63689E2929AA41027BEF4921970BAD4A55490D91ABE251DEF4552CA88034106A02CE4B058F8B59624B67E063BF178B015E4281EB114A2BC2454943A4B4647122C42CBEA4E94154FD3E4B791F6290B782994206853D67000A633F320A8A374CA5D4038F9CA4244DCB02E9A84E1F7C8A821132B32B9A840557B34780665301724BA2606681D945E34D7CF941B8963CAA1001A491B8B2E43570E9AB95C0A57C503F0AB960B4856D0251574710FE5CB474284FC1049AA2A7B03694A1C763E99DAC6AD0BA8038B138A64432E349116A031E8C792781751BA473CBDF55720005ABDAA13D50182F0E633776BB0675C40472BAD1F9672769183D0CCC810BC25A8573220569F6AC4BAC22A1354D8B36C0580D0E5299E629C506CC7655546FF27810C97B51BA056BBF86ED9CB7C0A537F72D0CF9AD2C231E29EBF553F613CBB15B3721A20077E505FD390CB19F6488A107DEE1CAC58AB7034BA690300219595B3695C12 ek_pke: 34E8B57E33C8D3A048454A616DF3C9B56A6FF2026AF997725FC95579043BAE9399B6790D637B4FA820B0B2D2CAB607BAF6A372734C31EE0026F3C076D14A8E3EE66AAD8BBBCCEB9DC70C7B6BB0BB76C200C231601CA0873EC8710F4B18D57290B033727C601EDB71C2B0F0C21D553E0E7A4F77716839C7C8448ABB9F66A54E8A4B08A79D9A392CA1270031388BAD56217E32AEF55411974906A245C00712B3CBB1170685193FE25ACD7AC13D32073F3879A5D78375F0052CF79175BAB46D22370597BD06789EDD0711CC4243507A02B4FAADBB62250CC997AE0327AEB00DEB529192A64B1096A86B19674D0B0AF05C4AAE178C2C9A6442E94ED0A56033A11EE42632C0B4AA51D42150790F41062B77253C25BA4DE559761F0A90068389728BC977F70CF7BCCFBD883DF13C79F5F2C34312CB1D5A55D78C1B242096A8C0593CFB2753460BD30ABA306C74173995748385D00B3670E61324D87DE8A14450DC493768777FF0CE6810937A711229561A5EF2BB69861074E00BD93266E4B86269E18EEA2CAACB60A1358636CD7A7CA6BB682130241784B101EA5BFD6C3A07158621614736F6996D5A4E14963A12D836E533A0C8912DB7E11685A4A53D8285F08750DFF66DA27C23B97542DEFB99E470ACD5E647C940CB57301B43CC3E68E64E28B06770695EF609265E06C60F22CB875849E62BAB88CC10ECF622C379CB54F13D8B2BAC902B9AB02BB330B45AC8B741C2647AC45B5BF48A6D3FE039986CC940C60A94E66CF644531016A5272450824314B5662A0A909ABFB46FD27BAED3ABA8259361596882B08B2AC7233930FC3786738ED2F81EE638C45C3B9CFD1951DB5BCC1445C2C1625D57D57B53904B6A1AB681580755E89FA79775A657CD62B4426304BC0C711E2807A2C9E852D4B4359EE6B53E4675F523C90782572DC7368FB400C328C70FC846B5E98A4330BBB627BDD784B4DAF0B1F645944942B4C2B6225C8B31E989545522BA6F10396034CB1CA745977844D570894C611A5608A757416D6DE59963C32798C493EFD2264C231910E9A30090CA7B5384F231B89BA68A238190EF1A2A43CB01703470A0F061A70738944BCD9B7004F24797AECB88B1091CFED0590B0415453C39B6EC45B66305FAEA6B55A4B7967505FE3862A267ADBFE05B9181A06501893391650EAAA4A6D16853349276F98E0F44CD726615C61C16713094D8AB093CAC71F2803E7D39109EF5009C9C2CDAF7B7A6B37A33A49881F4BB5D7245A14C5042280C76A84E63F49D0D619D46D723BAA747A3BA90A6FB637A9A1DC02268FD5C043D18CBA1528AC8E225C1F923D1CC84F2E78E25DC3CCE9353C9DAC2AD726A79F64940801DD5701EFBDCB80A98A25993CD7F80591320B63172718647B976A98A771686F0120A053B0C4474604305890FECAF23475DDCC11BC08A9C5F592ABB1A153DB1B883C0507EB68F78E0A14DEBBFEEC621E10A69B6DAAFAA916B539533E508007C4188CE05C862D101D4DB1DF3C4502B8C8AE1457488A36EAD2665BFACB321760281DB9CA72C7614363404A0A8EABC058A23A346875FA96BB18AC2CCF093B8A855673811CED47CBE1EE81D2CF07E43FC4872090853743108865F02C5612AA87166707EE90FFD5B8021F0AA016E5DBCD91F57B3562D3A2BCFA20A4C0301 h: 0B8AA144E6482804B474FEC1F5E138BE632A3B9C82483DC6890A13B1E8EE6AF7 z: 14EC5EFAC3B1976B29DADB605B14D3732B5DE118596516858117E2634C4EA0CC c1: DFA6B9D72A63B420B89DDE50F7E0D56ECF876BFEF991FCE91C8D286FA6EABAC1730FD87741FE4AD717B282A21E235A55C3757D88D4CE62F414EB77EB9D357EE29D00087BF8110E5BBBC7C90419072EAE044BF7E183D43A94B2632AA14649619B70649521BC19370942EF70F36C34C8C23591EE0CA71A12D279E0F52D39ED0F913F8C262621FB242E680DEB307B0749C6B393A8EF66F8B04AAFA877B951AB93F598B4B2FAB04F88AC803984FF37E3FE74F3A616D5314EB3A826F874F8ECD3A5647D04942A57EFC09638470DC0A9DF40B317571D3984A78CF7D11751090722B3059E07591CC4A2ED9BA0DCE99BE9E5EE5DB8D698CDEB5814759BA977C90079CF2AFDE478069C513A60091A3A5D0111E22DE06CB145C14E22A214CB278C8152B0681BCAFF54D552B54A671C0DFEF775E7C54FEFC4853868C955971ABDAC2A76292CCCD4FD1C706B7D3614159673E9D7B29A2D3F63363129E7A21E803A460F2714E3E25922780AF38257CD1495ACD1E01980638DF58A153DAB07EFB5C7E78ADACF631956D69CCDA070459568BD9D11A2934BCF1643BC99468238910B1F742EBB3C03D39FD45CFB85BA309E29DD9B5CD560819EC729FCAC8B9D725E3E8ABEDE4B5298A8658EE3F781B0CE683CBB7335CD57EFE2204A8F197446D7314CDBF4C5D08CCC41F80857CC9571FBFB906060F7E17C8CEF0F274AFF83E393B15F2F9589A13AF4BC78E16CDDE62361D63B8DC903B70C01A43419CD2052150BD28719F61FF31F4A9BEC4DDBCEC1F8FB2EFBF37DFFFA4C7FECA8CE6D626BFDA16EE708D9206814A2EF988525615D4AC9BE608C4B03ABEE95B32A5DB74A96119A7E159AF99CD98E88EAF09F0D780E7C7E814B8E88B4F4E15FA54995D0ECBAD3EF046A4947F3E8B9E744241489B806FE9401E78BAFC8E882E9D6D0700F720C0024E7DA49061C5D18A62074040ABC0003200ED465231797930A2E2AA501F64862DDA13014A99F9D3270AA907EEB3FDBFF291600DF1F6B39684B11E396B70D86F90492E82B09BA25607B0C286FBC070182AC76FA7C859AAFEA87016AED22C3605A2789A1D439FD8D933342DAB745A3E550E7D77C01A6234BDA7D6BB19D495E6560FCE8396FC3C6E088ED60F5F2771416EA3BE5BE472B6404906C91E71D9A8672F390083655AB7D0EC6EDFE86789CE20BE2EA90CA5CC31416FB24CBAF94DA1468FE696BCDF5247CF117CBE9334076CA6896B2F6A016B1F7C73728807898D8B199756C2B0AA2457E1B4F7754C4576CE5645614EA15C1AE28B094EB217C7A7A41239576CBDA380EE68783432730AD5EBE7F51D6BE7FB02AB37BE0C96AAC9F3C790A18D159E6BABA71EC88C1 c2: 10FD84C336DF630F271CF79328B6C879DF7CDE0F70712220B1FBB9ACB48248D91F0E2B6E3BE40C2B221E626E7E330D9D83CC0668F7308591E14C7D72B841A6F05F3FDC139EECC1536765650B55A9CEC6BBF54CCEC5C3AC9A0E39F48F237BD4C660CB1A8D250BB6C8C010FEC34CC3D91599271C7531330F12A3E44FAFD905D2C6 u: [[2389, 2006, 1232, 556, 322, 146, 2919, 2048, 722, 1521, 1713, 2780, 2854, 1622, 2263, 3306, 1642, 2614, 2181, 374, 458, 3153, 1996, 3049, 1437, 780, 803, 2809, 1219, 2965, 569, 2799, 1739, 559, 1795, 397, 1778, 1112, 172, 1531, 406, 943, 770, 1284, 793, 2305, 2906, 3059, 1343, 2955, 1791, 2051, 0, 2295, 2936, 231, 2542, 2360, 400, 2624, 845, 1476, 2393, 2263, 2510, 1515, 1765, 1713, 2354, 878, 2630, 1294, 969, 1378, 481, 1265, 504, 923, 1112, 436, 1443, 1476, 478, 858, 777, 715, 2337, 679, 2315, 1196, 894, 3101, 2536, 2214, 940, 2731, 393, 1222, 2389, 741, 3267, 218, 3306, 1821, 1788, 237, 3075, 478, 150, 2789, 2237, 634, 2897, 1876, 325, 2337, 478, 3257, 2022, 3228, 2237, 3179, 2113, 1554, 1434, 2354, 1021, 3192, 494, 562, 3053, 2298, 257, 2607, 33, 748, 2926, 1661, 1830, 3313, 2874, 1443, 1177, 2770, 1824, 686, 2116, 501, 806, 1759, 2337, 2754, 536, 2786, 231, 1925, 2633, 3189, 46, 1960, 2679, 2760, 0, 2207, 725, 676, 1232, 1131, 927, 878, 2055, 1827, 1635, 1625, 888, 120, 1687, 650, 296, 2055, 855, 2568, 211, 2116, 3267, 124, 1489, 3040, 1336, 1229, 2438, 1219, 2263, 1837, 705, 3066, 286, 1057, 1427, 2204, 1219, 163, 2965, 2695, 969, 1037, 2958, 81, 1339, 2146, 1674, 120, 1749, 2750, 68, 221, 1567, 36, 2334, 2305, 1057, 3069, 1782, 2107, 2562, 1619, 631, 1684, 267, 1808, 1424, 2627, 829, 1109, 979, 2357, 2737, 2578, 679, 3303, 1635, 1551, 306, 1037, 777, 1200, 2939, 1352, 1486, 1525, 1382, 2458, 2224, 1281, 2155, 572], [663, 2877, 1505, 1456, 1180, 1349, 1050, 273, 2984, 1964, 1242, 2324, 1333, 3157, 1830, 705, 992, 1489, 1814, 397, 2081, 1294, 793, 507, 2562, 598, 1346, 445, 2055, 631, 153, 1138, 666, 1057, 2318, 2724, 1560, 20, 1847, 1837, 2461, 1151, 3176, 2224, 2520, 1232, 400, 3014, 2113, 3296, 1860, 328, 1944, 2669, 705, 2090, 1196, 1096, 2110, 2461, 1343, 429, 1021, 982, 2337, 640, 3134, 1996, 1892, 1769, 894, 150, 101, 3007, 3075, 787, 2507, 3290, 1070, 1206, 1648, 2188, 2533, 2055, 966, 2467, 1486, 2773, 1144, 3017, 393, 543, 819, 2428, 1534, 1489, 1970, 2129, 3251, 2893, 1908, 1730, 2110, 1320, 2958, 1638, 101, 2295, 670, 2581, 3079, 1502, 1005, 1622, 2461, 2949, 1769, 3179, 1326, 1508, 2724, 380, 634, 2851, 1625, 159, 666, 2659, 211, 1866, 1196, 2656, 1317, 2380, 3118, 1882, 312, 1534, 1765, 1622, 2952, 3313, 2029, 962, 3326, 728, 1034, 2308, 2806, 1076, 497, 2100, 189, 2695, 2949, 2929, 1183, 1427, 1866, 1261, 3192, 2750, 494, 49, 595, 218, 1873, 683, 914, 166, 943, 276, 1700, 1625, 1326, 3199, 2598, 3316, 523, 2019, 1599, 2350, 770, 2520, 3303, 3114, 3075, 3170, 2903, 2285, 673, 1655, 767, 3049, 2380, 1278, 1180, 413, 2425, 3007, 858, 176, 2087, 263, 3023, 1856, 289, 488, 1148, 2155, 481, 2480, 312, 2402, 169, 2224, 1606, 744, 2220, 1209, 2259, 1307, 914, 2003, 1242, 2097, 2994, 2038, 2370, 1778, 2211, 3131, 1349, 1674, 751, 1612, 1242, 2393, 741, 1775, 585, 406, 1658, 2149, 1070, 120, 2331, 2428, 3183, 1024, 2185, 953, 2728, 1860, 3010, 3010], [221, 862, 471, 2399, 1684, 1037, 81, 3004, 2949, 1804, 2120, 1700, 2422, 172, 2539, 198, 371, 10, 1873, 3004, 1541, 1307, 1456, 1209, 1743, 133, 2711, 55, 33, 153, 156, 416, 46, 1213, 1840, 299, 2988, 2198, 2393, 546, 1369, 1248, 465, 1278, 1551, 130, 1050, 2198, 1349, 543, 2507, 2214, 2133, 2389, 3322, 2848, 1661, 1281, 3, 2900, 2598, 1957, 2090, 979, 2552, 1430, 2890, 176, 1268, 1034, 936, 3023, 972, 2087, 1960, 1248, 400, 1674, 2451, 2448, 855, 416, 2315, 1541, 813, 1141, 1378, 2282, 3257, 315, 2185, 3085, 2607, 156, 1372, 510, 1278, 962, 3007, 3290, 2955, 741, 114, 2838, 1427, 679, 1957, 1050, 3248, 2669, 75, 2159, 2611, 2139, 3215, 1395, 1408, 1999, 1573, 1317, 312, 1869, 3010, 1443, 2298, 159, 462, 3088, 1144, 614, 2910, 263, 1736, 2477, 1934, 2480, 2728, 865, 228, 1873, 1183, 1573, 1554, 2003, 2100, 715, 881, 111, 1008, 2357, 3205, 185, 1476, 3105, 361, 1567, 2172, 2471, 1769, 3053, 2133, 2659, 172, 270, 2568, 1034, 579, 2285, 2146, 1008, 2084, 3306, 2838, 2789, 2796, 478, 1235, 1651, 575, 3040, 166, 1300, 543, 1362, 2152, 1391, 1713, 293, 3072, 1655, 2900, 520, 416, 1762, 1278, 2311, 1330, 2591, 2256, 130, 1359, 2968, 1427, 1027, 387, 901, 1235, 1408, 744, 1330, 1057, 3043, 901, 3069, 2113, 2289, 2978, 397, 3127, 1590, 1229, 676, 1099, 1541, 2324, 1840, 738, 2991, 2936, 728, 2042, 624, 2227, 2988, 3313, 1057, 2360, 3274, 2520, 553, 3079, 98, 514, 1388, 3056, 2624, 2975, 133, 910, 2042, 1993, 2428, 1437, 2588, 462, 2516]] v: [0, 208, 2705, 3121, 832, 1665, 624, 2497, 1248, 624, 3121, 2705, 624, 1248, 3121, 0, 1456, 416, 2497, 208, 1456, 3121, 624, 1873, 1665, 416, 1248, 2289, 1665, 2497, 1873, 1456, 3121, 2705, 2497, 1456, 2913, 2705, 3121, 0, 0, 1456, 208, 1456, 416, 416, 0, 416, 208, 2289, 2289, 3121, 1873, 2289, 2497, 2081, 832, 2289, 416, 1665, 1665, 832, 1873, 2705, 3121, 208, 2913, 0, 2289, 416, 2913, 1248, 2289, 624, 832, 2913, 2497, 0, 2289, 416, 416, 416, 2913, 208, 416, 1248, 2913, 1248, 2913, 1456, 624, 624, 2705, 0, 2705, 1873, 624, 1665, 2497, 2497, 1248, 0, 1665, 1248, 1456, 3121, 0, 624, 1040, 1665, 208, 1873, 208, 2913, 2497, 832, 2705, 1456, 416, 1456, 1665, 2289, 208, 832, 1248, 2081, 0, 3121, 3121, 1040, 3121, 624, 2497, 2705, 624, 208, 2913, 1873, 2497, 2913, 208, 2497, 624, 1040, 1456, 1248, 1040, 1248, 1040, 1248, 2289, 0, 1040, 1040, 1873, 2081, 2913, 2497, 1248, 2497, 2289, 2289, 1040, 3121, 2497, 832, 2913, 2497, 1040, 2497, 624, 2497, 2497, 2081, 2081, 1873, 2913, 0, 1873, 624, 832, 3121, 3121, 1665, 624, 416, 2289, 1456, 832, 2705, 1248, 2497, 0, 1248, 2289, 2497, 2081, 208, 2705, 1665, 1040, 416, 2289, 0, 1248, 2289, 1665, 2497, 0, 2497, 0, 208, 2913, 3121, 624, 2497, 2497, 832, 624, 2497, 1873, 2705, 1040, 208, 1873, 1873, 1456, 416, 2497, 208, 1040, 1456, 208, 624, 624, 624, 3121, 0, 416, 208, 624, 2081, 832, 2913, 3121, 832, 3121, 2081, 1873, 2705, 1040, 0, 416, 2705, 1248, 2497] sHat: [[1588, 2133, 1947, 127, 742, 2759, 2929, 2018, 1392, 1071, 1141, 1431, 629, 2944, 2077, 2366, 540, 2713, 704, 685, 1934, 1841, 1995, 1144, 1314, 2608, 540, 515, 1131, 3018, 756, 1426, 3155, 2867, 3233, 41, 1536, 40, 1604, 3130, 758, 393, 69, 2571, 88, 389, 890, 260, 1459, 557, 2618, 2570, 3015, 2489, 3260, 3263, 1343, 295, 2836, 206, 506, 2604, 2206, 2125, 2698, 1173, 1210, 2984, 1640, 2926, 1525, 2000, 329, 83, 2303, 2707, 3060, 1252, 3199, 3046, 381, 1602, 1800, 2895, 1414, 2848, 624, 1339, 432, 2640, 3136, 193, 1937, 3266, 2840, 437, 2316, 703, 2969, 2575, 2777, 661, 1887, 856, 533, 197, 646, 435, 1676, 1737, 2691, 2743, 564, 3067, 762, 2603, 164, 435, 2869, 614, 1229, 1388, 568, 2304, 1819, 1572, 1266, 648, 2074, 739, 1631, 695, 2031, 2900, 2073, 426, 1552, 1400, 2539, 1582, 702, 177, 863, 2971, 1005, 2243, 1999, 2868, 2464, 1315, 1697, 822, 1782, 2910, 1588, 2926, 1341, 1792, 2670, 255, 148, 940, 1323, 1704, 485, 1061, 47, 281, 2290, 2469, 2369, 1707, 556, 317, 2502, 2489, 2313, 510, 1012, 3250, 2576, 422, 2962, 2112, 440, 1121, 1940, 345, 834, 2434, 127, 1472, 2162, 2815, 2872, 152, 780, 2550, 1932, 1271, 709, 2378, 2759, 532, 300, 2697, 620, 2211, 2795, 1374, 1162, 1019, 1931, 856, 2612, 751, 1785, 1742, 3311, 1315, 1997, 420, 951, 1880, 1511, 2964, 2768, 1626, 2002, 2226, 1426, 2791, 2131, 2836, 1644, 687, 1736, 1392, 1076, 3038, 2167, 203, 2511, 1896, 2821, 1902, 1524, 2808, 2954, 1120, 1893, 2693, 572, 2336, 2508, 63], [2798, 2647, 2940, 1299, 1709, 22, 2185, 1563, 825, 2062, 2882, 789, 1705, 2194, 1247, 786, 1983, 2922, 2974, 378, 1319, 436, 2601, 2237, 2187, 1311, 3297, 731, 826, 310, 2380, 1642, 1852, 2789, 2246, 1481, 1515, 1757, 1200, 1972, 2835, 22, 1914, 1145, 865, 3180, 893, 1907, 2351, 1609, 997, 1236, 1380, 67, 2611, 770, 2343, 1186, 3079, 1432, 668, 2331, 99, 2497, 1507, 1739, 2278, 2889, 1491, 2543, 1577, 2581, 2800, 1203, 1429, 2357, 754, 1117, 2687, 2799, 1174, 2562, 113, 1105, 1459, 1327, 658, 207, 201, 3293, 2681, 529, 2905, 247, 2348, 2061, 499, 245, 523, 912, 2, 2, 1495, 1411, 1646, 2686, 2623, 979, 1739, 3037, 1306, 3208, 613, 2737, 1523, 460, 2784, 48, 1585, 1343, 1632, 708, 770, 658, 2649, 2071, 2499, 767, 2497, 903, 969, 2289, 321, 897, 2425, 3111, 911, 832, 505, 400, 802, 1857, 218, 1115, 2962, 1177, 2788, 2403, 582, 1082, 1780, 1236, 431, 424, 1712, 768, 2503, 1557, 1212, 2813, 2397, 281, 1882, 1171, 2841, 2689, 509, 3300, 3083, 2195, 1446, 2889, 1467, 104, 847, 2813, 2453, 2892, 174, 2478, 199, 3275, 3177, 2622, 106, 1200, 1644, 1581, 934, 637, 1429, 992, 240, 938, 3034, 2435, 959, 2894, 2410, 1831, 2622, 1107, 3243, 787, 1685, 1680, 1965, 119, 544, 3270, 59, 1237, 1009, 1267, 214, 2537, 2476, 343, 1521, 2781, 790, 2550, 1375, 1611, 1089, 1350, 293, 841, 1493, 2182, 812, 2075, 1483, 2234, 2166, 120, 1383, 171, 2241, 1403, 1941, 621, 900, 2867, 881, 226, 2004, 764, 2969, 426, 1489, 2398, 2468, 3317, 778, 834], [1194, 1585, 1197, 3038, 1225, 2402, 2053, 387, 2903, 2443, 2825, 1045, 2323, 1122, 1226, 1394, 2783, 2330, 2121, 677, 2465, 633, 1718, 2195, 738, 2473, 164, 625, 1214, 2351, 25, 2983, 1492, 1354, 2448, 429, 1470, 466, 1519, 1316, 2250, 56, 1601, 2560, 1068, 2830, 2136, 2911, 1174, 2914, 1662, 944, 2289, 2823, 1045, 654, 286, 331, 3234, 587, 1108, 937, 1611, 1140, 3090, 1058, 2763, 1262, 1428, 1265, 1235, 2942, 1681, 671, 2059, 663, 148, 1666, 1619, 1805, 1536, 826, 243, 2690, 1187, 3239, 93, 900, 2809, 1068, 3140, 2829, 2606, 2121, 2017, 3215, 424, 306, 555, 2963, 168, 1364, 1147, 1923, 1286, 774, 1047, 2978, 1574, 1664, 1053, 1513, 1844, 3325, 2964, 2193, 2659, 2588, 2560, 1169, 2843, 744, 1859, 229, 2458, 1483, 1802, 3157, 3, 2751, 2966, 1152, 86, 605, 1045, 1815, 1295, 3262, 583, 2116, 252, 1169, 2730, 1970, 2307, 1190, 1564, 999, 2713, 3181, 2989, 2688, 2819, 312, 1162, 1078, 1070, 2323, 22, 794, 2024, 2348, 1912, 1297, 1978, 964, 1469, 1407, 32, 1440, 2749, 314, 469, 2080, 1776, 830, 2935, 2822, 3175, 1029, 2887, 2770, 1567, 1833, 374, 2105, 3280, 3212, 3088, 603, 1960, 805, 1568, 2549, 1130, 2988, 2754, 306, 2132, 2877, 1388, 2048, 1488, 670, 670, 2502, 3152, 3190, 1381, 1125, 2047, 2066, 1804, 2905, 27, 1386, 2235, 1775, 3033, 1996, 778, 2037, 114, 3325, 666, 3117, 561, 2542, 1471, 1013, 3169, 2995, 789, 1835, 26, 114, 126, 1525, 211, 3257, 1561, 1167, 138, 2001, 3310, 2753, 2904, 1802, 2612, 1691, 3, 528, 1429, 2873, 3177, 293]] w: [68, 163, 1585, 16, 1716, 11, 3326, 51, 52, 3252, 1770, 1636, 3287, 1786, 1720, 1554, 20, 1550, 1709, 1771, 1697, 12, 1754, 20, 3227, 1698, 42, 1763, 1637, 1607, 1608, 1707, 1790, 1695, 59, 10, 3285, 3274, 1590, 1631, 1625, 9, 3219, 146, 1584, 1612, 55, 1718, 1623, 1815, 1771, 20, 1792, 3222, 78, 1808, 1557, 1786, 3313, 1782, 3233, 1678, 1637, 3310, 1608, 106, 5, 1563, 92, 1584, 3202, 135, 9, 1537, 3282, 1691, 1705, 3312, 1623, 1719, 1595, 1623, 3267, 1613, 1734, 3273, 1564, 1710, 9, 19, 88, 50, 66, 1760, 1615, 27, 1707, 1603, 117, 1602, 1545, 3273, 1559, 3328, 4, 3277, 1698, 32, 1646, 75, 3299, 105, 1651, 1636, 154, 46, 1661, 8, 1742, 1730, 1753, 1537, 36, 3290, 1712, 1806, 1512, 45, 1693, 1571, 9, 1733, 139, 1579, 133, 32, 1555, 29, 1657, 1708, 1720, 3209, 1668, 57, 1611, 39, 3300, 96, 3225, 1615, 1544, 1601, 53, 3301, 26, 1750, 1722, 3231, 78, 3309, 1519, 3323, 53, 1727, 1542, 70, 1593, 127, 1723, 90, 1689, 3263, 16, 1580, 1852, 34, 3256, 1790, 1665, 53, 1649, 52, 13, 3326, 1683, 3276, 1678, 48, 0, 8, 53, 1651, 1676, 3311, 3302, 3247, 3299, 3224, 121, 1613, 1644, 1479, 1744, 3277, 1812, 3319, 3202, 3308, 3319, 1580, 65, 122, 3220, 1629, 1638, 1696, 1643, 1560, 83, 180, 68, 1634, 1549, 3293, 15, 72, 1537, 1598, 3259, 3141, 1620, 3253, 49, 1759, 1718, 1753, 3308, 3210, 1592, 108, 30, 119, 55, 8, 24, 1608, 10, 1692, 3276, 3280, 1788, 1539, 3261, 84, 1703, 1659] mPrime: 14EC5EFAC3B1976B29DADB605B14D3732B5DE118596516858117E2634C4EA0CC KPrime: BD7256B242F404869D662F80BF677A16C0C6FC1568CCA5B64582A01A6A142D71 rPrime: 5AE7C624837B9165CB3469F5F573F94FB3B1DE20C97F718135CEA8A97A81DC4D tHat: [[2100, 2910, 894, 3203, 211, 1162, 2629, 1556, 877, 3231, 2741, 1782, 754, 1696, 2041, 1833, 2399, 1372, 1145, 944, 942, 2457, 2486, 215, 2915, 1271, 168, 2818, 690, 3245, 1974, 2976, 1014, 1834, 3187, 788, 238, 608, 243, 1900, 2769, 2276, 1598, 1710, 2989, 3000, 3020, 2526, 3271, 1968, 107, 3003, 630, 12, 450, 1539, 28, 2170, 2110, 1820, 2831, 388, 725, 2311, 944, 1827, 124, 486, 475, 3111, 176, 3119, 1309, 997, 2574, 1271, 375, 1671, 1849, 3212, 2628, 3000, 1695, 2646, 2638, 1208, 1800, 2522, 2458, 707, 1953, 2, 2097, 2227, 1709, 533, 638, 2787, 1269, 277, 2455, 100, 1442, 3076, 519, 2865, 459, 379, 1286, 408, 575, 1454, 2765, 3095, 573, 115, 2111, 1939, 1957, 2109, 117, 95, 1836, 2335, 2677, 2891, 621, 882, 1797, 3033, 2054, 2535, 2013, 272, 716, 1076, 2640, 39, 2740, 2783, 699, 598, 2316, 2428, 942, 624, 174, 219, 747, 2325, 1682, 1210, 1552, 2697, 2411, 1649, 2893, 160, 3312, 1189, 1966, 2241, 2604, 1609, 2370, 1262, 1488, 1546, 307, 490, 1764, 802, 1216, 2731, 1105, 541, 2384, 247, 1601, 688, 1399, 962, 2597, 1243, 2533, 1893, 2591, 2304, 774, 2200, 2930, 3224, 1911, 207, 3319, 3323, 2237, 984, 3313, 1939, 757, 3135, 579, 3249, 2589, 1365, 3287, 440, 36, 2402, 168, 1436, 2876, 639, 1619, 180, 2771, 2976, 3120, 1862, 2327, 2387, 884, 2136, 3024, 864, 1648, 318, 2084, 2013, 488, 1098, 3152, 1181, 2103, 1910, 127, 3311, 104, 2353, 378, 295, 1577, 421, 606, 3007, 1641, 264, 116, 190, 729, 1635, 2276, 1579, 361, 2286], [3306, 2722, 203, 2582, 1589, 872, 2765, 1991, 2982, 1675, 33, 579, 1047, 2840, 2561, 1470, 3325, 934, 1287, 2145, 289, 1142, 1590, 2463, 2669, 1253, 1556, 937, 2066, 877, 997, 2563, 456, 729, 439, 366, 1157, 2650, 573, 2136, 2032, 1288, 1759, 1759, 3234, 567, 1465, 1063, 3038, 2463, 228, 2759, 1749, 1150, 201, 3252, 87, 435, 3139, 1004, 1640, 1262, 40, 1659, 2416, 1510, 2550, 608, 1630, 3168, 527, 3250, 2183, 1173, 3046, 2738, 3208, 268, 1772, 559, 2499, 3255, 340, 991, 2955, 2754, 2960, 2466, 2992, 2866, 1072, 1451, 1992, 1051, 1218, 1958, 3012, 1461, 2804, 1752, 63, 926, 3224, 3222, 1600, 172, 1684, 1742, 1270, 1332, 1552, 2641, 1063, 1282, 898, 324, 1717, 678, 10, 2473, 1215, 1787, 3026, 2791, 3027, 2698, 805, 1561, 2137, 2086, 2992, 680, 967, 914, 3120, 895, 902, 2279, 2258, 495, 2278, 3139, 2908, 2499, 2557, 1297, 3035, 3269, 1300, 3108, 705, 1494, 1367, 1981, 83, 1209, 2666, 2913, 2177, 117, 2133, 2558, 1959, 1881, 1958, 3285, 1122, 1067, 1123, 3008, 268, 487, 1832, 2592, 2249, 1326, 1236, 859, 1694, 2910, 1598, 1876, 1013, 3218, 519, 1400, 1837, 876, 1167, 11, 2243, 3186, 2063, 1132, 2485, 2222, 67, 2995, 1974, 3026, 1239, 2888, 218, 2847, 1526, 2372, 585, 2884, 1730, 555, 2908, 792, 2537, 1352, 597, 2978, 111, 913, 1120, 3251, 1820, 1114, 2199, 1095, 213, 2199, 332, 422, 2134, 2672, 343, 1748, 1389, 2462, 867, 636, 1176, 2364, 751, 621, 844, 402, 2320, 2622, 0, 3241, 891, 2117, 498, 2947, 1691, 2218, 291, 2312, 2799, 673], [2883, 28, 1136, 1795, 160, 1567, 1959, 896, 2964, 3284, 155, 71, 2034, 2420, 2990, 2188, 2481, 448, 254, 1437, 1035, 336, 3141, 915, 3254, 1118, 950, 86, 2810, 1726, 1109, 2938, 1430, 87, 2302, 1571, 1954, 2774, 191, 1470, 401, 2568, 357, 2192, 307, 1625, 2574, 2634, 422, 1677, 1107, 2339, 2422, 2287, 1039, 3284, 1650, 342, 3270, 353, 113, 2371, 3032, 154, 3132, 1818, 242, 1000, 2429, 259, 1438, 15, 3228, 713, 2010, 2943, 934, 1963, 1075, 2442, 1153, 3007, 605, 1111, 3233, 1284, 2114, 194, 2166, 1258, 1123, 2527, 269, 2518, 1862, 573, 1978, 1146, 2723, 2315, 2982, 1599, 2682, 473, 704, 1666, 3325, 69, 2109, 3249, 673, 2213, 712, 606, 2497, 575, 3281, 2124, 2034, 2286, 3109, 973, 974, 1337, 2761, 3117, 685, 1703, 1657, 1183, 64, 472, 213, 487, 3323, 2957, 2058, 2601, 857, 3289, 127, 1432, 19, 2914, 561, 1815, 1926, 2964, 2422, 2218, 1655, 2145, 752, 161, 2821, 195, 1092, 1543, 1347, 2192, 3087, 2814, 1827, 1492, 476, 444, 2752, 2504, 2399, 677, 2747, 337, 317, 2955, 131, 1292, 1662, 2299, 120, 2590, 2893, 3070, 1774, 540, 2785, 1680, 2742, 2813, 426, 1721, 1363, 825, 2277, 0, 380, 2180, 1486, 3200, 354, 29, 3028, 477, 1267, 1292, 3115, 2216, 1505, 1860, 904, 1770, 1709, 1618, 3263, 2874, 1569, 39, 2945, 2509, 3239, 1890, 1556, 835, 4, 2698, 3306, 91, 906, 2610, 1862, 1528, 2985, 2838, 650, 3276, 1008, 2953, 1448, 1653, 312, 3297, 3284, 3047, 2078, 478, 44, 2031, 3139, 1167, 2418, 128, 1107, 791, 1544, 1528, 1282, 1564]] bHat = aHat^T: [[[504, 2561, 2088, 2399, 2069, 274, 1069, 2208, 2645, 1765, 1640, 521, 787, 2050, 2822, 2997, 781, 1188, 2933, 1171, 2759, 2455, 950, 891, 348, 2834, 1385, 700, 1585, 1576, 576, 291, 1843, 662, 3091, 3142, 1490, 1488, 281, 1242, 1900, 2462, 444, 691, 3262, 184, 1193, 2680, 550, 1625, 2801, 1621, 3120, 1201, 194, 326, 2485, 1941, 1407, 959, 2886, 2526, 1406, 1385, 2114, 3007, 2940, 1188, 2724, 2563, 3055, 2818, 327, 564, 63, 1667, 3065, 1932, 5, 1290, 3017, 331, 419, 224, 2851, 2633, 3076, 2962, 2068, 2099, 1693, 1130, 2106, 1270, 441, 1013, 1765, 458, 2772, 2202, 1835, 1049, 2259, 2454, 2650, 1365, 1627, 2967, 3093, 1882, 2911, 510, 2129, 642, 2237, 2085, 2050, 864, 2870, 1072, 2052, 2223, 2191, 2426, 957, 447, 1237, 2365, 2069, 1161, 1049, 936, 1374, 3132, 608, 1800, 3108, 2674, 3265, 1940, 426, 771, 1148, 328, 2337, 2425, 117, 3062, 664, 653, 1628, 2268, 2932, 365, 1186, 3233, 3026, 2257, 2522, 1096, 3141, 1785, 2330, 1394, 717, 1691, 38, 1601, 2433, 2305, 538, 673, 3275, 421, 2579, 405, 892, 1534, 1396, 1827, 648, 1721, 2241, 698, 265, 43, 2673, 1673, 2438, 1445, 3143, 2364, 561, 831, 1097, 2447, 473, 2584, 518, 2594, 1930, 160, 3103, 523, 818, 1547, 2342, 1909, 220, 405, 2025, 1972, 1353, 2370, 1261, 2552, 736, 1993, 514, 2503, 97, 2700, 1505, 619, 3128, 2609, 2608, 2280, 826, 1528, 3181, 1835, 1107, 739, 1033, 587, 512, 828, 2049, 588, 2052, 1067, 2020, 3175, 2234, 1586, 2374, 1862, 1807, 1121, 2289, 760, 1079, 1776, 657, 1874], [1435, 2714, 2093, 2896, 517, 494, 2247, 2648, 2828, 2715, 1739, 878, 392, 376, 1827, 2132, 2803, 1460, 2753, 59, 1064, 724, 934, 1041, 1642, 3064, 1629, 1249, 1891, 2787, 2524, 2964, 271, 2785, 3317, 3054, 3050, 1946, 149, 2757, 2099, 3066, 2070, 126, 3059, 1287, 817, 663, 846, 1671, 669, 1630, 230, 134, 1851, 956, 3227, 144, 2684, 1896, 1365, 793, 453, 804, 895, 1377, 1305, 3144, 614, 414, 2549, 1391, 511, 565, 2795, 1321, 1259, 1745, 2527, 508, 1770, 1839, 1316, 2127, 1302, 1044, 2759, 2112, 669, 453, 2185, 349, 2549, 3017, 3173, 1789, 2817, 2493, 658, 2102, 297, 2025, 816, 1083, 970, 372, 1964, 906, 823, 2432, 2817, 2965, 2882, 2338, 3005, 2385, 1198, 521, 2632, 1714, 159, 2135, 31, 3278, 1230, 1100, 479, 1492, 642, 111, 1104, 939, 901, 2950, 1227, 2008, 873, 1790, 1779, 1706, 781, 1017, 1747, 2670, 1125, 2139, 1174, 726, 1934, 3180, 1299, 988, 473, 266, 2481, 2115, 1483, 3244, 499, 1211, 492, 1495, 3301, 1054, 3261, 3169, 560, 2466, 2040, 1180, 1126, 1371, 342, 917, 215, 2825, 1900, 1015, 3253, 1106, 1878, 3052, 2792, 1743, 152, 1733, 2732, 1031, 1338, 2118, 285, 1338, 1878, 3325, 2550, 219, 2947, 247, 1082, 1126, 2652, 2538, 2871, 2715, 2810, 2969, 3131, 258, 844, 578, 3197, 3069, 2519, 2894, 2860, 1627, 1428, 1206, 628, 2543, 335, 1101, 227, 2985, 2607, 2666, 2251, 2018, 613, 1187, 3057, 1355, 2599, 2119, 960, 2002, 343, 453, 3082, 964, 1855, 3167, 1176, 1334, 2813, 2580, 698, 2624, 1672, 1906, 1836, 984, 2838, 1044, 1528, 479], [173, 872, 2311, 901, 2233, 305, 1614, 153, 2648, 1301, 1372, 1173, 1956, 1923, 1074, 1787, 827, 802, 2238, 1507, 360, 2287, 530, 52, 1078, 2726, 3283, 323, 995, 1454, 38, 1260, 3029, 1150, 1296, 605, 307, 1490, 1189, 1163, 2788, 1006, 311, 1585, 712, 2709, 2767, 1200, 2872, 1181, 2113, 681, 21, 240, 1383, 2755, 2439, 2202, 1396, 148, 2791, 1213, 431, 3074, 1902, 655, 2953, 2758, 1289, 2689, 1210, 2897, 562, 1719, 1022, 1480, 3242, 1193, 2429, 1038, 596, 1432, 515, 12, 1484, 2369, 3012, 1330, 1834, 279, 1301, 421, 2313, 2182, 139, 1734, 1923, 2672, 2362, 200, 1017, 843, 596, 724, 346, 894, 2515, 1914, 3208, 1104, 2891, 381, 751, 321, 2038, 2740, 2049, 315, 3109, 672, 1259, 2627, 2576, 2376, 3229, 185, 19, 2373, 2249, 311, 720, 2180, 1752, 1684, 2874, 1873, 242, 1445, 1156, 826, 2464, 2821, 1976, 340, 1973, 3163, 2666, 3216, 343, 1948, 1672, 2281, 3079, 1685, 1856, 1883, 714, 758, 223, 2844, 2117, 1899, 2167, 806, 2296, 72, 160, 1508, 2985, 2758, 671, 638, 2766, 89, 2292, 2447, 1963, 448, 1878, 1446, 2991, 2114, 405, 2676, 2944, 1891, 1392, 1271, 1018, 714, 166, 2714, 1782, 2490, 2039, 1542, 2674, 1223, 1699, 2470, 67, 2778, 2201, 1330, 607, 116, 1375, 2339, 2912, 1032, 2632, 1539, 1349, 357, 288, 877, 962, 2331, 2148, 1493, 797, 2809, 1334, 1087, 1515, 228, 494, 1690, 2989, 2906, 2594, 576, 146, 1646, 451, 2629, 1249, 459, 990, 1058, 2371, 1143, 711, 63, 2602, 208, 961, 1872, 2135, 1727, 1865, 460, 2063, 1377, 1961, 674]], [[877, 2689, 1314, 2901, 2383, 2676, 776, 1093, 373, 619, 2108, 1575, 302, 2884, 2512, 3312, 354, 3190, 2488, 1489, 450, 2083, 950, 3219, 1736, 858, 990, 1726, 1010, 268, 1985, 2456, 2400, 1322, 1692, 792, 830, 2967, 1496, 305, 1859, 3199, 181, 773, 737, 654, 2211, 2472, 1979, 1700, 1487, 481, 1512, 1996, 704, 3195, 1924, 577, 2456, 2113, 620, 1900, 747, 1711, 3029, 330, 3103, 344, 1648, 193, 1535, 2411, 1276, 3311, 2481, 2874, 391, 101, 2934, 877, 2063, 1063, 528, 89, 2131, 2800, 2878, 1023, 1280, 851, 1870, 2841, 1500, 1453, 1779, 1740, 447, 3105, 1459, 2871, 1054, 2457, 2503, 2298, 2740, 2664, 3326, 703, 2697, 1073, 588, 1797, 146, 3163, 482, 3245, 328, 2927, 1894, 1676, 2011, 2012, 3326, 2628, 2114, 51, 9, 325, 3212, 2441, 104, 1908, 2893, 2419, 1131, 2260, 1076, 3290, 3303, 1284, 1342, 272, 1042, 499, 2096, 697, 94, 1653, 3156, 1314, 707, 132, 540, 395, 3132, 2127, 2717, 2405, 827, 593, 224, 2818, 1100, 1236, 1585, 3159, 2404, 2160, 657, 1064, 1578, 1321, 1941, 1275, 1228, 943, 2773, 3179, 1719, 1584, 940, 2966, 2024, 843, 1858, 2536, 1122, 2306, 3257, 1191, 1368, 83, 2567, 1552, 1912, 286, 2792, 183, 1800, 705, 1242, 1652, 469, 555, 123, 2646, 950, 3230, 941, 3104, 2895, 1836, 592, 1449, 95, 3121, 2440, 2724, 1799, 1139, 214, 494, 534, 2152, 2559, 1648, 1041, 1856, 1250, 1418, 3159, 1988, 1690, 162, 711, 1731, 1316, 1566, 2396, 2183, 2879, 907, 2796, 3073, 100, 3060, 2629, 2117, 2826, 3135, 2089, 3126, 301, 1620, 3086, 2870], [2030, 1476, 1307, 1939, 469, 688, 102, 935, 1684, 2508, 2703, 2261, 3181, 7, 1626, 2393, 1204, 1721, 1179, 1497, 2130, 2115, 1335, 1073, 2528, 773, 949, 2385, 562, 2111, 2643, 2432, 2674, 570, 3076, 2459, 1549, 322, 964, 2775, 1385, 727, 3251, 844, 3017, 305, 1718, 74, 246, 2901, 2480, 2465, 2876, 2534, 2461, 2405, 2370, 1091, 3058, 2925, 174, 1887, 1655, 868, 666, 3224, 639, 1967, 7, 323, 668, 2464, 496, 2743, 2606, 2358, 2146, 503, 1470, 377, 1935, 1406, 2879, 2045, 1266, 3100, 1121, 822, 2643, 953, 310, 816, 1910, 671, 3122, 780, 1930, 1547, 2064, 63, 651, 1358, 3187, 2051, 1087, 3039, 400, 2813, 2661, 466, 1380, 3102, 1423, 587, 760, 2773, 217, 520, 843, 309, 2936, 2653, 59, 2991, 310, 1523, 2450, 901, 245, 1000, 1998, 543, 1124, 2506, 783, 1442, 652, 2915, 636, 3058, 601, 264, 1463, 2600, 194, 831, 609, 871, 1298, 811, 913, 2155, 2352, 3094, 1291, 2202, 2384, 1109, 407, 419, 2011, 252, 929, 2402, 2480, 610, 2196, 1179, 365, 383, 1843, 690, 3274, 843, 1526, 180, 340, 2717, 246, 1660, 1494, 2922, 1744, 1293, 674, 3307, 2035, 3176, 1011, 2997, 187, 2305, 2535, 3095, 2049, 1458, 3089, 479, 1693, 2935, 1871, 1208, 2406, 1548, 59, 2275, 172, 2777, 1653, 1702, 2404, 1153, 19, 2692, 722, 2679, 2435, 1039, 2537, 10, 410, 485, 2369, 465, 1481, 1427, 2357, 2868, 2171, 2474, 2812, 2681, 3184, 388, 2601, 468, 2609, 1566, 1300, 848, 1776, 1073, 3059, 2328, 1887, 1799, 2995, 3099, 498, 2584, 2918, 591, 2214, 709, 837, 2916], [1699, 1753, 2869, 3202, 1534, 2495, 1639, 2474, 3258, 502, 315, 2343, 2767, 2558, 782, 3300, 763, 719, 2597, 770, 1299, 2184, 1891, 2564, 2579, 328, 818, 105, 2248, 2130, 2559, 2964, 2411, 3256, 835, 1059, 3154, 2224, 2134, 2836, 2372, 2213, 2197, 941, 688, 2759, 3100, 3214, 1206, 482, 761, 1515, 684, 3073, 130, 3204, 177, 2931, 1937, 283, 51, 2569, 2983, 2924, 1276, 595, 225, 2274, 1372, 1458, 31, 931, 537, 359, 47, 710, 3270, 735, 549, 1245, 2463, 1829, 2641, 3320, 451, 2958, 3219, 2582, 2743, 2170, 603, 426, 1730, 3270, 1241, 2177, 341, 2549, 2362, 1529, 2581, 1944, 3265, 1705, 1458, 1757, 966, 350, 1235, 2974, 1305, 1257, 1476, 818, 2677, 742, 1442, 3305, 2688, 1263, 5, 2460, 1315, 3313, 1831, 1135, 1908, 2076, 1739, 2340, 1771, 592, 1136, 346, 528, 3141, 756, 302, 1663, 341, 3211, 2052, 3228, 1009, 124, 3147, 591, 66, 1445, 2356, 106, 1276, 1299, 2065, 382, 1965, 2930, 2989, 1787, 2113, 1759, 2501, 1978, 1898, 591, 406, 3110, 1522, 3239, 1451, 2368, 2957, 2291, 582, 2707, 370, 871, 3257, 1335, 1495, 1790, 27, 1934, 2767, 1933, 2027, 3172, 2031, 880, 916, 193, 695, 2225, 817, 2187, 549, 2, 2608, 31, 1501, 1901, 853, 2148, 2952, 1211, 270, 477, 820, 2580, 2250, 95, 651, 1475, 360, 2596, 660, 353, 2985, 1346, 33, 2966, 2156, 1732, 2577, 2902, 148, 979, 2601, 1659, 1423, 368, 1435, 2324, 1147, 996, 3191, 2176, 1055, 3219, 427, 3077, 2739, 2896, 3220, 693, 2421, 1259, 893, 3075, 3112, 1219, 218, 3006, 2683, 260, 1594]], [[944, 2368, 2787, 2753, 1705, 169, 2455, 2348, 1200, 3008, 513, 1731, 441, 2153, 493, 2496, 1405, 2360, 2147, 2699, 1629, 2955, 353, 2774, 1471, 1444, 1430, 2000, 2051, 956, 2517, 3193, 1350, 1581, 2066, 2621, 2178, 866, 1706, 420, 1024, 428, 1180, 2236, 31, 2331, 2615, 2312, 3054, 2288, 485, 1167, 2293, 946, 3103, 2625, 3258, 2567, 2840, 2568, 2198, 1295, 3081, 1233, 334, 269, 2864, 1981, 1823, 646, 1377, 757, 1997, 183, 1819, 2432, 2779, 2861, 2612, 975, 1288, 2691, 2196, 864, 441, 2778, 799, 1224, 2825, 1130, 3188, 2877, 2661, 1563, 476, 3208, 3266, 1094, 338, 56, 936, 210, 563, 3179, 628, 604, 1738, 3232, 1899, 2116, 1616, 2938, 3075, 446, 971, 166, 2634, 2641, 2881, 1533, 3082, 2998, 834, 2501, 1380, 2904, 1934, 3302, 3194, 1864, 543, 668, 3162, 3136, 1542, 1482, 336, 140, 2347, 938, 1300, 2734, 2140, 347, 283, 1220, 1000, 1185, 2426, 1996, 1903, 1608, 2316, 500, 2018, 2520, 1712, 825, 464, 2240, 1720, 1602, 868, 1703, 1748, 495, 2972, 432, 2901, 687, 1700, 512, 532, 2738, 2935, 2770, 434, 425, 1358, 2528, 623, 574, 1719, 589, 2229, 2713, 524, 2083, 630, 2900, 122, 3289, 23, 1215, 678, 2081, 423, 3004, 1949, 72, 1439, 1410, 66, 1038, 989, 1498, 2423, 3096, 3191, 1954, 523, 965, 753, 515, 99, 1500, 634, 3144, 1190, 2916, 1319, 3141, 1491, 2471, 1143, 2160, 2206, 1933, 1550, 1899, 2968, 396, 2964, 947, 456, 2026, 1666, 2535, 2078, 2911, 53, 2785, 1750, 1115, 197, 1643, 137, 499, 3078, 1343, 2495, 1636, 1800, 1670, 842, 3096], [701, 632, 1748, 2683, 1252, 1738, 953, 2885, 2065, 3283, 1280, 65, 150, 2085, 687, 1257, 1828, 3211, 3204, 3016, 2508, 3259, 2379, 1469, 2774, 2441, 1831, 979, 1840, 2930, 250, 2733, 2091, 1663, 126, 2994, 2941, 124, 1260, 2555, 813, 462, 1359, 1108, 2598, 1961, 453, 228, 1688, 2019, 745, 1924, 3183, 2730, 2857, 970, 853, 3174, 2550, 1691, 2114, 1921, 1568, 1852, 2851, 2882, 2838, 914, 377, 1767, 1026, 602, 1162, 691, 16, 2105, 1066, 2449, 2264, 3126, 1580, 1207, 927, 2682, 658, 2350, 456, 2203, 1390, 1665, 2836, 3194, 1357, 315, 1680, 787, 2404, 681, 3128, 55, 645, 225, 2332, 2371, 297, 831, 865, 1022, 2016, 2860, 1134, 3159, 3000, 1703, 2896, 1555, 858, 1331, 3113, 2002, 637, 1153, 133, 1369, 2392, 1332, 1122, 2070, 1858, 2577, 2766, 1889, 1808, 3322, 2828, 1534, 1708, 1433, 561, 1073, 2651, 2576, 3219, 493, 1964, 2504, 1388, 1955, 670, 285, 1201, 2333, 3009, 1526, 3324, 2845, 2875, 12, 734, 381, 3094, 1188, 2567, 981, 1434, 2909, 3229, 1392, 885, 553, 329, 2917, 1254, 1733, 2306, 3163, 2760, 90, 2761, 2545, 2023, 1064, 1617, 485, 1501, 1834, 417, 740, 2618, 1530, 2781, 3183, 933, 2813, 163, 2695, 2418, 2915, 1864, 2416, 3096, 11, 3251, 208, 2963, 3042, 1177, 802, 1301, 893, 1178, 2365, 1836, 913, 990, 44, 858, 1250, 1826, 1028, 2652, 2647, 1886, 857, 3109, 2386, 2999, 309, 1793, 2014, 1510, 484, 1292, 1250, 826, 2990, 3286, 2879, 249, 1737, 2728, 1980, 2468, 1574, 212, 1477, 1690, 1738, 1462, 2880, 1990, 209, 37, 2970, 327, 2770], [454, 1606, 3133, 139, 2795, 769, 2212, 86, 131, 527, 505, 544, 2963, 2093, 2911, 982, 2357, 2477, 3171, 1936, 232, 94, 2258, 2957, 1822, 2592, 2248, 591, 644, 2553, 56, 2399, 2031, 2479, 512, 2031, 2073, 696, 2997, 1479, 2115, 1333, 2071, 2112, 2857, 1975, 1589, 739, 1865, 1143, 1707, 1359, 878, 2913, 2013, 269, 1244, 218, 2514, 829, 577, 3189, 3005, 1949, 2682, 1797, 927, 551, 1430, 2855, 2441, 1418, 2388, 828, 750, 2561, 2617, 908, 1994, 576, 3117, 701, 3133, 327, 2484, 2193, 3224, 941, 276, 1944, 2895, 2002, 2352, 1759, 1646, 1277, 93, 262, 2000, 755, 3251, 2887, 96, 2626, 2898, 826, 558, 238, 1874, 3065, 2603, 412, 2462, 2709, 216, 2452, 3234, 2320, 2180, 2328, 3309, 2342, 2563, 1471, 1771, 1419, 2533, 684, 1128, 2261, 1698, 245, 1626, 1846, 330, 1136, 3169, 3277, 316, 635, 1532, 672, 6, 2971, 2318, 2494, 1756, 1532, 3120, 888, 1856, 1097, 17, 654, 2313, 2165, 3316, 1952, 73, 254, 2355, 3106, 62, 3157, 2767, 2106, 109, 2500, 454, 2668, 988, 961, 2317, 1731, 480, 346, 2506, 3081, 1855, 1033, 1453, 1419, 2298, 2688, 1949, 966, 2697, 2766, 2787, 2752, 1609, 2440, 1453, 2303, 3002, 2149, 3135, 1694, 100, 2178, 1566, 2395, 485, 1617, 288, 2597, 236, 99, 1462, 1487, 734, 1105, 2786, 3195, 634, 2823, 1219, 539, 2446, 3027, 1322, 3251, 887, 571, 2691, 1538, 3111, 661, 454, 2600, 2306, 1674, 727, 206, 2435, 2979, 1853, 2309, 379, 2419, 196, 2090, 2423, 1876, 2189, 2, 3270, 506, 2055, 1309, 736, 2176, 1070, 633, 1274, 3239]]] r: [[1, 0, 3327, 3328, 0, 0, 0, 3328, 1, 0, 0, 3328, 1, 0, 3328, 1, 0, 0, 1, 0, 0, 0, 3328, 0, 0, 0, 3328, 0, 3328, 3328, 1, 2, 0, 0, 1, 3328, 1, 1, 0, 1, 0, 3328, 0, 3327, 2, 3328, 0, 1, 0, 0, 2, 3328, 2, 1, 3328, 3328, 3328, 3328, 0, 1, 0, 1, 0, 1, 0, 3328, 3328, 0, 0, 0, 2, 2, 3328, 3328, 1, 3328, 2, 1, 0, 1, 1, 0, 1, 1, 3327, 0, 0, 1, 1, 0, 0, 0, 3328, 3328, 3328, 0, 3328, 3328, 3327, 3328, 2, 0, 1, 3328, 0, 0, 0, 3327, 3328, 0, 0, 0, 3328, 1, 0, 0, 0, 3328, 3328, 1, 3328, 1, 1, 1, 3327, 3327, 1, 1, 3328, 3328, 0, 1, 3327, 1, 3328, 0, 1, 1, 0, 0, 0, 3328, 3328, 1, 3328, 3328, 0, 2, 3328, 1, 2, 2, 3328, 1, 2, 3328, 0, 0, 3328, 3328, 1, 3327, 0, 0, 2, 0, 0, 2, 0, 0, 1, 1, 0, 0, 1, 1, 3328, 3328, 0, 3328, 3328, 1, 0, 3327, 2, 3328, 1, 3328, 3328, 3328, 1, 1, 1, 0, 3328, 0, 1, 3327, 1, 0, 0, 1, 1, 1, 0, 0, 0, 0, 3327, 0, 0, 0, 1, 3328, 0, 3328, 0, 1, 0, 0, 0, 0, 0, 0, 3328, 3327, 2, 0, 3328, 0, 0, 3327, 3328, 1, 3328, 3327, 1, 3327, 0, 0, 3327, 1, 3328, 3328, 0, 2, 3327, 3328, 0, 0, 0, 2, 0, 3328, 0, 3328], [2, 3327, 0, 1, 3328, 3328, 0, 2, 3328, 1, 2, 1, 1, 1, 0, 3328, 2, 3328, 0, 3327, 3328, 1, 2, 0, 0, 0, 1, 0, 1, 3328, 1, 0, 3328, 0, 3327, 1, 0, 0, 3328, 3328, 3327, 0, 1, 3328, 0, 1, 3328, 1, 2, 3328, 1, 0, 3328, 1, 1, 3328, 3328, 1, 0, 1, 3328, 3328, 0, 3328, 0, 0, 1, 3328, 3328, 2, 1, 0, 0, 0, 1, 0, 2, 0, 3328, 0, 0, 0, 2, 0, 2, 3328, 0, 3328, 0, 1, 0, 1, 3328, 0, 0, 0, 1, 0, 0, 0, 0, 0, 3328, 3328, 0, 3328, 3328, 3328, 0, 2, 3328, 0, 0, 0, 2, 3328, 0, 0, 1, 0, 3327, 0, 3328, 0, 1, 1, 0, 0, 1, 0, 1, 0, 3327, 0, 3327, 0, 1, 1, 3327, 0, 1, 1, 1, 3328, 3328, 1, 3328, 1, 0, 1, 1, 1, 3328, 0, 0, 1, 3328, 0, 1, 0, 1, 0, 3328, 1, 0, 1, 1, 3328, 1, 1, 1, 1, 3328, 1, 0, 3328, 3327, 0, 1, 1, 0, 3328, 3328, 3327, 0, 0, 2, 0, 0, 1, 1, 0, 0, 3328, 0, 0, 1, 3327, 1, 2, 3327, 0, 1, 0, 1, 1, 0, 0, 0, 0, 2, 0, 0, 3328, 3328, 1, 0, 1, 0, 0, 1, 0, 0, 3328, 0, 0, 3328, 0, 0, 0, 3328, 0, 0, 1, 0, 1, 0, 1, 0, 3328, 1, 0, 2, 3328, 3328, 3328, 0, 3327, 0, 0, 1, 1, 3328, 0, 0, 2], [0, 3328, 3328, 0, 3328, 1, 0, 0, 0, 3327, 3327, 0, 3328, 0, 3328, 0, 3328, 0, 3328, 3328, 3328, 1, 3327, 0, 1, 0, 1, 0, 0, 1, 3328, 1, 1, 3327, 3328, 3328, 0, 3328, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 3328, 0, 1, 3327, 3328, 3328, 0, 0, 3328, 3328, 3328, 3328, 0, 1, 1, 0, 2, 3327, 3328, 0, 0, 0, 3328, 3328, 1, 3327, 1, 1, 3327, 1, 3328, 3328, 1, 1, 2, 2, 3328, 3328, 1, 0, 0, 0, 0, 3328, 2, 1, 3327, 0, 0, 3327, 0, 1, 0, 1, 3328, 3328, 1, 2, 3328, 2, 1, 0, 1, 0, 3328, 3328, 0, 3327, 1, 1, 1, 0, 1, 0, 1, 3328, 0, 0, 2, 0, 2, 0, 0, 1, 0, 0, 1, 1, 0, 1, 2, 0, 1, 0, 1, 1, 3327, 0, 0, 3328, 3328, 0, 2, 1, 3328, 3328, 1, 3328, 3328, 0, 3328, 1, 1, 1, 1, 3328, 1, 0, 0, 0, 0, 3328, 3328, 0, 3328, 1, 3327, 1, 3328, 0, 0, 0, 3327, 0, 3328, 3328, 3328, 3328, 0, 3328, 0, 1, 0, 0, 0, 1, 0, 2, 0, 0, 1, 0, 3327, 3328, 1, 0, 1, 0, 0, 0, 2, 3328, 3328, 1, 0, 1, 1, 0, 3327, 1, 3328, 0, 3328, 3328, 3328, 1, 0, 1, 1, 0, 1, 0, 1, 0, 3327, 3328, 0, 3328, 3328, 0, 3328, 2, 1, 0, 3328, 0, 3328, 3328, 0, 3327, 0, 0, 3327, 0, 3328, 0, 2]] e1: [[0, 2, 0, 0, 1, 3328, 0, 0, 1, 3328, 3328, 0, 0, 3327, 3327, 3327, 3328, 3328, 1, 1, 3327, 0, 1, 0, 1, 0, 3327, 0, 1, 1, 3327, 1, 2, 1, 1, 0, 3328, 1, 0, 0, 2, 3328, 0, 0, 2, 0, 3328, 0, 0, 0, 0, 3328, 1, 2, 1, 3328, 0, 1, 3328, 0, 0, 0, 0, 1, 3328, 0, 3327, 1, 0, 1, 0, 3328, 0, 0, 2, 2, 3328, 1, 0, 0, 3328, 1, 0, 0, 1, 3328, 0, 1, 3327, 3328, 3328, 2, 3327, 1, 3328, 3328, 0, 3328, 0, 3328, 3328, 3327, 1, 3328, 3328, 1, 3328, 0, 0, 3328, 0, 3328, 3327, 2, 3328, 0, 3328, 0, 1, 1, 0, 1, 1, 3328, 0, 3328, 3328, 3328, 0, 0, 3327, 0, 2, 1, 3327, 1, 3328, 1, 0, 0, 1, 1, 2, 3328, 1, 0, 0, 3328, 1, 1, 1, 0, 3328, 0, 0, 3328, 0, 3328, 0, 3328, 0, 1, 0, 1, 0, 0, 3328, 1, 1, 0, 1, 0, 1, 3328, 0, 2, 0, 0, 2, 0, 0, 0, 1, 1, 3328, 3328, 3328, 0, 3328, 3327, 3328, 0, 0, 0, 3328, 0, 1, 2, 3328, 3327, 3328, 0, 3328, 0, 3328, 0, 0, 1, 0, 0, 0, 1, 3328, 0, 0, 0, 1, 0, 3327, 3327, 0, 3328, 1, 1, 3328, 3327, 0, 3328, 3327, 1, 3328, 0, 3328, 0, 1, 0, 0, 1, 3327, 0, 0, 0, 2, 0, 0, 0, 1, 0, 2, 0, 3328, 0, 1, 0, 3327, 0], [1, 0, 0, 3328, 3328, 3328, 0, 0, 3328, 0, 3328, 0, 1, 1, 3328, 0, 0, 3328, 3328, 0, 0, 1, 3327, 0, 2, 3327, 3328, 0, 0, 0, 1, 1, 0, 0, 3328, 0, 1, 3328, 3327, 0, 1, 3328, 0, 1, 0, 1, 0, 0, 1, 3328, 3327, 3327, 3328, 1, 3328, 0, 0, 0, 0, 3328, 0, 1, 1, 1, 3327, 1, 1, 0, 0, 0, 1, 2, 3328, 3328, 0, 0, 3328, 0, 1, 1, 3328, 0, 2, 3328, 2, 3328, 0, 0, 3328, 0, 3328, 3327, 1, 2, 1, 0, 1, 3328, 3328, 0, 3328, 3328, 1, 0, 0, 3327, 3327, 0, 2, 1, 2, 0, 2, 1, 0, 3328, 1, 1, 3328, 1, 0, 0, 1, 1, 0, 0, 0, 3328, 0, 3328, 0, 0, 1, 2, 2, 3328, 0, 0, 1, 3328, 3328, 3328, 0, 3328, 3328, 0, 3328, 1, 1, 3327, 3328, 1, 0, 0, 3328, 1, 1, 0, 3328, 0, 3328, 0, 3327, 1, 1, 1, 3328, 3328, 3328, 0, 1, 0, 3328, 1, 1, 3328, 1, 0, 2, 0, 0, 3328, 1, 3328, 0, 3327, 3328, 3328, 2, 0, 3328, 1, 3328, 1, 2, 1, 1, 0, 1, 3328, 1, 0, 0, 1, 3328, 1, 0, 1, 0, 3327, 0, 0, 3327, 1, 3328, 3327, 1, 3328, 1, 0, 0, 3328, 0, 3327, 1, 0, 1, 0, 1, 3328, 0, 3327, 1, 0, 1, 2, 3328, 0, 1, 1, 0, 3328, 0, 1, 3328, 3327, 0, 1, 1, 3327, 3328, 1, 3328, 1, 3328, 3328], [3328, 3328, 1, 0, 3328, 0, 1, 0, 3327, 1, 0, 0, 1, 0, 0, 2, 0, 3328, 0, 3328, 0, 3328, 0, 2, 0, 3327, 2, 1, 1, 0, 3328, 1, 0, 0, 3327, 3327, 0, 3327, 0, 3328, 1, 0, 2, 1, 3328, 0, 1, 1, 3328, 3328, 0, 1, 1, 0, 1, 1, 1, 0, 0, 0, 3328, 3328, 3328, 1, 3327, 1, 0, 1, 1, 3328, 0, 0, 0, 3328, 0, 1, 3328, 0, 1, 0, 0, 0, 1, 0, 0, 1, 3328, 0, 1, 2, 3328, 3328, 0, 3328, 3328, 1, 3328, 0, 3327, 1, 0, 3328, 0, 0, 0, 1, 0, 0, 3327, 1, 3327, 0, 0, 1, 2, 2, 1, 0, 1, 1, 3328, 3328, 3328, 0, 0, 0, 1, 2, 0, 0, 2, 1, 1, 2, 0, 2, 0, 3327, 3327, 1, 0, 1, 0, 0, 1, 0, 0, 1, 3328, 3328, 1, 0, 1, 0, 2, 0, 3328, 0, 3328, 0, 3328, 3328, 0, 3328, 1, 3328, 0, 1, 2, 3328, 1, 3327, 1, 0, 3328, 1, 3328, 3328, 1, 0, 0, 3328, 2, 1, 0, 3328, 0, 0, 0, 3328, 0, 2, 0, 1, 2, 1, 3328, 1, 1, 0, 3328, 1, 3327, 1, 0, 2, 0, 0, 0, 1, 3327, 3327, 3328, 3327, 3327, 1, 0, 0, 1, 0, 2, 0, 3327, 3328, 3328, 1, 2, 1, 0, 3328, 1, 3328, 1, 1, 0, 3328, 3328, 0, 0, 0, 0, 0, 3328, 1, 0, 1, 3328, 3328, 3328, 1, 0, 0, 1, 0, 3328, 3328]] e2: [0, 3328, 1, 3328, 1, 0, 2, 3328, 0, 0, 1, 0, 1, 1, 0, 2, 0, 3328, 0, 2, 2, 0, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 2, 3328, 0, 1, 0, 0, 1, 3328, 2, 1, 0, 3328, 3327, 0, 1, 0, 0, 1, 3328, 3328, 0, 1, 1, 0, 3328, 3328, 3327, 0, 3327, 3328, 1, 1, 0, 1, 0, 0, 0, 3328, 0, 3327, 0, 0, 0, 0, 0, 1, 3328, 0, 0, 1, 0, 0, 0, 1, 3327, 3328, 0, 0, 0, 3328, 3328, 3327, 3328, 1, 3328, 0, 0, 0, 2, 0, 1, 3328, 3328, 3328, 1, 3328, 3328, 0, 1, 0, 3328, 0, 3328, 1, 0, 0, 0, 3327, 0, 1, 0, 3328, 0, 3328, 1, 0, 1, 3328, 1, 0, 1, 0, 1, 2, 1, 0, 2, 3328, 3328, 1, 3327, 0, 1, 0, 2, 3328, 3328, 3328, 3328, 1, 0, 0, 3328, 0, 0, 1, 0, 3328, 0, 0, 3328, 3328, 0, 0, 3328, 1, 0, 0, 1, 3327, 0, 1, 2, 1, 0, 1, 0, 0, 0, 0, 1, 3328, 0, 0, 0, 0, 1, 0, 1, 0, 1, 2, 3328, 3328, 0, 3328, 0, 0, 0, 2, 1, 1, 3328, 1, 0, 0, 0, 1, 3328, 0, 0, 3328, 0, 0, 1, 3327, 0, 2, 1, 0, 1, 0, 1, 0, 3327, 0, 3327, 1, 3328, 0, 0, 0, 0, 0, 3327, 2, 0, 0, 0, 1, 3328, 3328, 3328, 0, 1, 1, 0, 0, 3328, 3328, 3328, 3328, 0, 3328] rHat: [[1307, 1115, 2843, 2750, 53, 3232, 564, 1601, 2979, 2813, 1924, 1256, 1363, 633, 2606, 249, 2826, 2564, 2747, 1538, 2332, 21, 893, 2167, 611, 3127, 2608, 1426, 1081, 1514, 1018, 510, 1079, 399, 1279, 509, 1997, 1460, 2516, 2053, 1757, 3107, 2995, 277, 1354, 446, 322, 2854, 419, 2019, 1109, 335, 869, 2546, 3265, 2635, 1718, 1225, 3045, 2903, 803, 2065, 999, 516, 2535, 320, 933, 3171, 1749, 1406, 2421, 1363, 1268, 586, 1371, 1555, 497, 496, 699, 3237, 1947, 2316, 804, 831, 3009, 1795, 2522, 2963, 1788, 785, 373, 1016, 2314, 2753, 2892, 3128, 246, 2345, 2091, 1837, 2095, 2036, 1994, 1765, 883, 1531, 209, 2778, 1779, 676, 205, 2197, 806, 2525, 2371, 3288, 158, 531, 2376, 8, 2869, 1665, 2627, 2850, 221, 2139, 1131, 1301, 2577, 80, 1259, 203, 1327, 3149, 1171, 2194, 2991, 2128, 2983, 1248, 1251, 1904, 1525, 351, 2595, 1305, 1386, 2865, 1327, 1410, 650, 1645, 1282, 1884, 52, 308, 1745, 2224, 212, 1390, 2506, 1300, 180, 1271, 1145, 1839, 725, 237, 2801, 2338, 361, 2214, 30, 907, 1822, 380, 2219, 1293, 894, 160, 1426, 2145, 653, 2098, 86, 1136, 1388, 3070, 602, 712, 208, 1233, 2304, 1531, 255, 579, 2002, 197, 1904, 328, 854, 126, 18, 2581, 1522, 2321, 3212, 2555, 792, 1870, 913, 1792, 55, 2535, 797, 863, 953, 165, 1324, 3024, 43, 69, 716, 965, 2489, 1861, 256, 1146, 686, 2695, 1081, 1053, 552, 2553, 2344, 808, 850, 791, 2257, 1480, 748, 1285, 1412, 154, 3276, 1722, 2047, 87, 76, 140, 22, 1221, 857, 774, 2763, 1461], [1606, 193, 658, 2035, 830, 1434, 2887, 2937, 1435, 750, 371, 486, 1389, 3313, 1789, 356, 1508, 331, 1781, 3270, 1515, 1980, 465, 130, 1415, 3281, 2759, 2523, 2849, 2101, 2599, 2120, 2625, 1888, 2754, 1413, 2725, 2188, 1204, 80, 664, 1229, 168, 3045, 83, 1983, 1496, 697, 955, 2869, 2222, 3294, 1102, 549, 370, 1293, 1899, 430, 2203, 3234, 1947, 2397, 461, 651, 803, 1038, 2293, 1020, 3296, 2577, 306, 1966, 2308, 2718, 1657, 2698, 2867, 1522, 558, 292, 3009, 1182, 2047, 1330, 1802, 257, 1514, 31, 1540, 1028, 76, 2765, 421, 774, 530, 1433, 294, 879, 3102, 2394, 2190, 1496, 1356, 1777, 3044, 2226, 39, 3260, 2623, 2750, 1977, 2371, 805, 1154, 2686, 1858, 2028, 1393, 1022, 1547, 1241, 1322, 1216, 2805, 2162, 3026, 1251, 2360, 646, 641, 3200, 1178, 1950, 2938, 613, 318, 2880, 2281, 1880, 2294, 2750, 849, 3268, 1666, 1833, 1310, 418, 3191, 721, 1925, 1152, 2260, 2448, 874, 1347, 11, 1614, 2288, 2603, 1244, 2736, 662, 1146, 88, 1941, 1015, 414, 2587, 3298, 3023, 3154, 413, 1499, 1620, 992, 925, 1058, 334, 2122, 1282, 652, 2395, 2905, 443, 966, 1127, 2259, 3137, 1184, 2542, 2273, 346, 3271, 2285, 100, 2988, 704, 2947, 3197, 1133, 283, 1698, 714, 3, 2664, 2180, 1280, 401, 2419, 2301, 1578, 1876, 199, 627, 2908, 940, 226, 780, 1597, 964, 115, 155, 1280, 3325, 3019, 460, 1876, 2699, 2839, 2161, 1179, 2061, 3257, 1889, 2580, 3259, 1888, 2110, 987, 180, 1521, 3077, 2340, 1854, 91, 1039, 1621, 1250, 169, 1894, 1936, 927, 992, 1705, 2434, 1367], [2587, 820, 2401, 2720, 764, 2141, 1899, 2778, 135, 3105, 1553, 3121, 2658, 633, 395, 974, 1703, 1573, 129, 276, 2071, 1564, 2379, 2705, 1804, 243, 980, 2120, 691, 3200, 494, 2145, 2791, 1635, 373, 991, 2625, 2728, 3050, 848, 1414, 1703, 1755, 1962, 1299, 386, 1507, 2018, 3197, 2260, 1397, 1340, 3120, 351, 3280, 421, 1643, 375, 1710, 974, 942, 2396, 518, 2195, 1439, 2069, 1251, 2831, 2416, 1189, 2869, 1659, 3100, 1962, 2662, 2289, 1946, 1021, 1254, 1971, 1156, 1955, 445, 1211, 135, 2617, 3239, 820, 1338, 2348, 690, 406, 763, 1621, 89, 866, 3324, 89, 822, 2244, 566, 1003, 2011, 1258, 335, 2550, 755, 901, 1904, 541, 41, 1246, 1841, 939, 2912, 531, 2272, 1474, 2719, 2344, 794, 3234, 280, 2473, 1947, 2513, 2620, 1857, 615, 3190, 625, 2697, 3189, 3219, 1279, 481, 1864, 3168, 3040, 2774, 2037, 2584, 2972, 2375, 382, 537, 1543, 998, 705, 1351, 1718, 3261, 1764, 2789, 2223, 1768, 3227, 1644, 3010, 2718, 2505, 315, 1174, 2729, 974, 2857, 2621, 186, 1992, 1278, 2543, 2680, 125, 323, 3078, 2591, 85, 2116, 1580, 1807, 2817, 2867, 679, 2415, 1596, 1879, 2695, 2730, 2359, 1791, 2906, 2400, 1099, 827, 2784, 110, 295, 1134, 859, 2748, 1282, 654, 929, 2850, 2781, 3132, 2707, 175, 738, 1896, 1218, 288, 1496, 3163, 1920, 3298, 2708, 1040, 1738, 3097, 3030, 2954, 686, 1682, 269, 1011, 1271, 3295, 816, 2693, 3173, 2675, 2277, 1242, 2829, 1963, 1314, 2069, 1233, 3188, 249, 661, 1787, 920, 3266, 70, 2834, 37, 656, 2035, 243, 1184, 2410, 2491, 2367, 411]] BHat * rHat: [[1, 127, 2252, 1774, 1319, 216, 2740, 506, 2897, 1644, 1067, 272, 434, 1016, 25, 1865, 3075, 443, 73, 142, 1652, 1257, 2977, 353, 1340, 2123, 1191, 655, 883, 1513, 2253, 274, 2589, 20, 2457, 2532, 2608, 402, 2513, 286, 1696, 2329, 2459, 875, 2707, 2484, 2913, 1826, 2816, 1611, 16, 415, 1928, 337, 2103, 2763, 1296, 2036, 2062, 2354, 101, 584, 2008, 3280, 2525, 1548, 246, 1703, 1568, 472, 1609, 349, 1357, 959, 3200, 2951, 2227, 782, 2490, 2235, 1387, 1622, 1661, 990, 1976, 1582, 1407, 3172, 1473, 2834, 2960, 75, 1568, 3224, 1296, 1940, 1550, 1713, 2506, 536, 1045, 2653, 1081, 2949, 3005, 1827, 609, 2200, 1382, 2198, 1180, 1562, 2810, 49, 1645, 2656, 3067, 3038, 981, 897, 1083, 2694, 642, 400, 523, 2424, 527, 1242, 1739, 546, 2235, 2736, 1763, 2130, 1377, 2308, 1538, 1232, 2629, 929, 2115, 1378, 1060, 3099, 806, 432, 2297, 2946, 2275, 1134, 1453, 232, 2713, 291, 1665, 1074, 1044, 255, 2862, 2514, 83, 330, 62, 2434, 2266, 683, 3256, 1522, 840, 3000, 1333, 3187, 3085, 458, 3256, 3316, 1038, 1171, 2442, 493, 2839, 1183, 1600, 1313, 2039, 526, 3072, 349, 949, 1199, 2694, 2752, 1395, 3207, 28, 1796, 595, 949, 3083, 294, 93, 1699, 3004, 3208, 485, 2079, 1355, 3306, 2745, 1964, 2455, 146, 2867, 172, 3275, 2714, 1099, 613, 1441, 3172, 2834, 1475, 1921, 2885, 1165, 2685, 1536, 1784, 2594, 141, 1216, 3145, 3277, 2496, 599, 1651, 2438, 2737, 2311, 3269, 2152, 2195, 481, 218, 2828, 1972, 2310, 382, 1456, 140, 3067, 3229, 2774, 842, 1012, 2412], [553, 3304, 606, 2390, 2439, 2992, 902, 713, 2388, 2438, 132, 1771, 3202, 1334, 490, 2721, 2671, 1012, 2173, 938, 1959, 1191, 1677, 2515, 1574, 836, 1836, 3183, 2296, 2289, 3179, 2232, 2928, 197, 166, 332, 2753, 2646, 2298, 2711, 1350, 490, 2870, 2235, 2918, 2828, 1561, 2357, 2159, 184, 2253, 640, 2873, 2394, 2230, 865, 2393, 2503, 391, 3100, 1793, 1546, 397, 3085, 851, 97, 1301, 2233, 3314, 2698, 3251, 2196, 1593, 803, 1605, 994, 1418, 746, 3196, 729, 1403, 1298, 643, 1675, 1787, 534, 370, 3232, 1686, 2598, 1886, 3283, 445, 854, 3323, 949, 2849, 2782, 1617, 443, 1948, 3086, 2953, 3100, 2336, 111, 1765, 413, 1124, 286, 338, 2339, 2850, 1587, 3280, 2864, 1172, 3075, 1997, 1997, 338, 1024, 274, 91, 890, 1989, 404, 1888, 127, 2298, 2886, 2757, 2279, 2150, 3016, 2494, 1390, 2966, 1358, 563, 2247, 456, 1157, 2369, 250, 3309, 1777, 3320, 3272, 306, 413, 102, 351, 3053, 1085, 969, 2087, 1190, 634, 1079, 2126, 696, 1167, 297, 494, 3040, 2000, 2614, 1999, 802, 1963, 923, 34, 964, 190, 3115, 647, 1547, 2607, 218, 1690, 2456, 2504, 2319, 1393, 593, 3071, 1446, 3062, 1412, 2611, 3195, 2298, 781, 1046, 2504, 1785, 2999, 2703, 979, 1129, 2581, 2207, 1750, 485, 1886, 1583, 3132, 1742, 1903, 762, 1963, 1239, 1563, 1124, 1270, 1507, 866, 782, 182, 2914, 3017, 336, 2441, 2254, 2512, 52, 999, 174, 464, 2492, 2199, 1438, 2773, 2897, 1467, 2074, 501, 1194, 2547, 2249, 2446, 677, 1997, 2216, 2948, 2732, 834, 586, 2992, 2472, 1905, 859, 2921, 1055, 2004], [2316, 944, 2344, 1074, 2292, 2320, 467, 469, 1195, 2346, 412, 1069, 112, 429, 109, 3279, 424, 2370, 1830, 2462, 2954, 1978, 510, 3030, 967, 3129, 701, 58, 1276, 3243, 1783, 3303, 2591, 1043, 2943, 665, 1894, 2510, 2957, 1146, 214, 178, 3231, 2723, 2173, 2074, 1816, 1938, 428, 3113, 3295, 1175, 964, 3138, 523, 2481, 296, 378, 2010, 472, 421, 499, 2116, 1005, 285, 2464, 796, 2584, 2057, 1346, 1797, 331, 45, 1603, 274, 1827, 1079, 302, 168, 2187, 397, 2744, 249, 2563, 1121, 909, 3018, 956, 2470, 1813, 1820, 2624, 2874, 2647, 2890, 3127, 3067, 1529, 1147, 3230, 2408, 2763, 2696, 2800, 1711, 1506, 3190, 965, 298, 2594, 565, 1539, 2807, 2217, 2391, 1869, 537, 2180, 81, 2321, 1763, 484, 669, 1392, 2916, 2131, 129, 789, 3127, 399, 1187, 3191, 1979, 935, 1935, 1044, 2655, 727, 2522, 344, 2430, 1110, 3295, 611, 2187, 2144, 2455, 1458, 2139, 1893, 2289, 704, 1122, 623, 906, 1144, 2343, 2466, 3269, 2820, 1224, 1022, 2068, 709, 2582, 249, 184, 1551, 2515, 2369, 1128, 310, 3080, 27, 1050, 2871, 2122, 3066, 2109, 2875, 2461, 719, 379, 2049, 35, 854, 459, 2540, 2163, 3142, 1070, 3305, 2288, 396, 2493, 3197, 2796, 1991, 1830, 1198, 1239, 775, 1419, 2608, 2478, 1745, 847, 2966, 781, 2721, 1248, 2899, 1616, 492, 815, 70, 3100, 2110, 3179, 1690, 3144, 3051, 1373, 2483, 1489, 2908, 2671, 780, 2532, 577, 1460, 640, 3120, 1128, 1857, 1752, 807, 2342, 557, 2649, 1119, 2044, 2522, 1365, 964, 922, 2027, 1282, 1771, 857, 3212, 695, 853, 996, 1613, 15]] NTTInverse(BHat * rHat): [[2390, 2004, 1233, 557, 320, 148, 2920, 2049, 722, 1522, 1714, 2781, 2853, 1623, 2266, 3309, 1643, 2616, 2182, 372, 459, 3152, 1994, 3049, 1436, 781, 805, 2808, 1217, 2963, 572, 2798, 1738, 559, 1794, 395, 1779, 1110, 171, 1532, 403, 943, 769, 1283, 790, 2306, 2907, 3058, 1342, 2956, 1792, 2051, 0, 2293, 2935, 233, 2541, 2358, 401, 2622, 846, 1476, 2393, 2262, 2512, 1515, 1767, 1711, 2355, 878, 2631, 1296, 970, 1380, 478, 1263, 506, 921, 1113, 437, 1444, 1475, 478, 857, 776, 715, 2336, 680, 2316, 1196, 895, 3098, 2537, 2212, 942, 2731, 392, 1222, 2391, 741, 3269, 219, 3306, 1823, 1789, 236, 3076, 477, 148, 2791, 2236, 634, 2897, 1875, 325, 2339, 480, 3257, 2021, 3226, 2237, 3178, 2113, 1556, 1433, 2354, 1022, 3195, 495, 561, 3054, 2300, 256, 2607, 33, 747, 2928, 1660, 1829, 3314, 2874, 1443, 1176, 2772, 1822, 685, 2116, 501, 804, 1759, 2335, 2755, 538, 2785, 231, 1924, 2632, 3191, 47, 1962, 2679, 2760, 1, 2205, 726, 675, 1234, 1130, 926, 878, 2055, 1828, 1633, 1627, 887, 119, 1687, 651, 295, 2055, 854, 2568, 211, 2117, 3268, 125, 1490, 3040, 1336, 1230, 2439, 1220, 2263, 1836, 706, 3065, 285, 1055, 1427, 2205, 1220, 161, 2966, 2696, 970, 1037, 2957, 81, 1340, 2147, 1675, 118, 1749, 2749, 67, 220, 1567, 37, 2337, 2306, 1058, 3070, 1780, 2105, 2564, 1620, 631, 1685, 270, 1805, 1426, 2626, 831, 1107, 978, 2357, 2736, 2577, 683, 3304, 1634, 1552, 303, 1038, 777, 1201, 2937, 1353, 1484, 1524, 1382, 2458, 2223, 1280, 2159, 572], [662, 2876, 1504, 1457, 1182, 1351, 1049, 272, 2986, 1962, 1243, 2325, 1333, 3155, 1830, 706, 990, 1491, 1815, 398, 2081, 1293, 796, 506, 2560, 599, 1348, 445, 2054, 631, 151, 1136, 665, 1057, 2318, 2725, 1561, 22, 1850, 1838, 2460, 1152, 3175, 2223, 2519, 1232, 399, 3014, 2113, 3296, 1861, 330, 1944, 2668, 707, 2089, 1196, 1094, 2110, 2461, 1343, 427, 1019, 982, 2338, 640, 3133, 1997, 1891, 1770, 892, 148, 102, 3008, 3077, 786, 2506, 3291, 1068, 1205, 1649, 2189, 2532, 2055, 965, 2468, 1485, 2773, 1144, 3016, 393, 545, 817, 2428, 1535, 1488, 1968, 2130, 3253, 2893, 1908, 1730, 2108, 1320, 2958, 1639, 103, 2295, 668, 2581, 3077, 1501, 1001, 1620, 2460, 2950, 1769, 3180, 1328, 1509, 2725, 381, 633, 2849, 1624, 158, 666, 2659, 210, 1868, 1196, 2655, 1316, 2379, 3115, 1883, 312, 1534, 1764, 1624, 2954, 3314, 2027, 962, 3328, 728, 1035, 2306, 2805, 1077, 497, 2100, 188, 2695, 2950, 2929, 1182, 1428, 1866, 1262, 3195, 2750, 496, 47, 593, 217, 1872, 685, 913, 165, 941, 275, 1702, 1623, 1326, 3200, 2595, 3317, 521, 2019, 1600, 2351, 768, 2520, 3304, 3116, 3077, 3170, 2900, 2285, 675, 1654, 769, 3048, 2377, 1277, 1178, 413, 2425, 3009, 857, 174, 2088, 261, 3023, 1856, 288, 486, 1146, 2158, 480, 2480, 313, 2400, 170, 2225, 1605, 746, 2220, 1209, 2261, 1309, 913, 2004, 1240, 2096, 2992, 2037, 2369, 1779, 2210, 3133, 1347, 1675, 749, 1609, 1243, 2392, 739, 1774, 585, 408, 1659, 2148, 1071, 123, 2331, 2429, 3183, 1027, 2186, 952, 2730, 1858, 3010, 3010], [223, 863, 472, 2398, 1684, 1037, 80, 3005, 2951, 1804, 2121, 1700, 2420, 171, 2540, 196, 371, 10, 1873, 3006, 1541, 1308, 1457, 1207, 1742, 136, 2708, 54, 30, 154, 158, 415, 47, 1212, 1841, 300, 2988, 2199, 2393, 546, 1368, 1247, 464, 1277, 1552, 131, 1049, 2198, 1349, 544, 2507, 2212, 2133, 2388, 3323, 2846, 1660, 1280, 3, 2900, 2597, 1957, 2092, 976, 2554, 1430, 2889, 173, 1266, 1035, 937, 3025, 973, 2088, 1959, 1249, 401, 1673, 2449, 2447, 855, 415, 2313, 1540, 812, 1139, 1380, 2282, 3255, 313, 2187, 3087, 2608, 158, 1374, 511, 1279, 961, 3008, 3290, 2954, 742, 114, 2838, 1428, 680, 1958, 1049, 3250, 2669, 77, 2159, 2610, 2139, 3213, 1392, 1407, 2000, 1571, 1316, 312, 1870, 3013, 1442, 2298, 160, 461, 3087, 1143, 614, 2907, 263, 1735, 2474, 1933, 2480, 2726, 868, 229, 1872, 1182, 1572, 1553, 2002, 2100, 714, 882, 108, 1009, 2359, 3205, 185, 1474, 3104, 360, 1568, 2173, 2472, 1770, 3053, 2133, 2659, 172, 270, 2566, 1036, 579, 2284, 2144, 1010, 2082, 3309, 2836, 2788, 2797, 477, 1237, 1653, 576, 3041, 167, 1301, 542, 1361, 2153, 1393, 1713, 293, 3073, 1656, 2900, 519, 417, 1762, 1277, 2309, 1330, 2590, 2254, 129, 1359, 2966, 1429, 1026, 387, 900, 1235, 1407, 746, 1329, 1058, 3044, 900, 3071, 2114, 2289, 2977, 397, 3128, 1591, 1228, 676, 1101, 1543, 2327, 1840, 736, 2991, 2936, 728, 2042, 626, 2227, 2987, 3314, 1057, 2360, 3273, 2520, 553, 3078, 99, 516, 1387, 3056, 2622, 2975, 134, 912, 2040, 1994, 2428, 1437, 2588, 463, 2517]] u = NTTInverse(BHat * rHat) + e1: [[2390, 2006, 1233, 557, 321, 147, 2920, 2049, 723, 1521, 1713, 2781, 2853, 1621, 2264, 3307, 1642, 2615, 2183, 373, 457, 3152, 1995, 3049, 1437, 781, 803, 2808, 1218, 2964, 570, 2799, 1740, 560, 1795, 395, 1778, 1111, 171, 1532, 405, 942, 769, 1283, 792, 2306, 2906, 3058, 1342, 2956, 1792, 2050, 1, 2295, 2936, 232, 2541, 2359, 400, 2622, 846, 1476, 2393, 2263, 2511, 1515, 1765, 1712, 2355, 879, 2631, 1295, 970, 1380, 480, 1265, 505, 922, 1113, 437, 1443, 1476, 478, 857, 777, 714, 2336, 681, 2314, 1195, 894, 3100, 2535, 2213, 941, 2730, 392, 1221, 2391, 740, 3268, 217, 3307, 1822, 1788, 237, 3075, 477, 148, 2790, 2236, 633, 2895, 1877, 324, 2339, 479, 3257, 2022, 3227, 2237, 3179, 2114, 1555, 1433, 2353, 1021, 3194, 495, 561, 3052, 2300, 258, 2608, 31, 748, 2927, 1661, 1829, 3314, 2875, 1444, 1178, 2771, 1823, 685, 2116, 500, 805, 1760, 2336, 2755, 537, 2785, 231, 1923, 2632, 3190, 47, 1961, 2679, 2761, 1, 2206, 726, 675, 1233, 1131, 927, 878, 2056, 1828, 1634, 1626, 887, 121, 1687, 651, 297, 2055, 854, 2568, 212, 2118, 3267, 124, 1489, 3040, 1335, 1228, 2438, 1220, 2263, 1836, 705, 3065, 286, 1057, 1426, 2203, 1219, 161, 2965, 2696, 969, 1037, 2957, 82, 1340, 2147, 1675, 119, 1748, 2749, 67, 220, 1568, 37, 2335, 2304, 1058, 3069, 1781, 2106, 2563, 1618, 631, 1684, 268, 1806, 1425, 2626, 830, 1107, 979, 2357, 2736, 2578, 681, 3304, 1634, 1552, 305, 1038, 777, 1201, 2938, 1353, 1486, 1524, 1381, 2458, 2224, 1280, 2157, 572], [663, 2876, 1504, 1456, 1181, 1350, 1049, 272, 2985, 1962, 1242, 2325, 1334, 3156, 1829, 706, 990, 1490, 1814, 398, 2081, 1294, 794, 506, 2562, 597, 1347, 445, 2054, 631, 152, 1137, 665, 1057, 2317, 2725, 1562, 21, 1848, 1838, 2461, 1151, 3175, 2224, 2519, 1233, 399, 3014, 2114, 3295, 1859, 328, 1943, 2669, 706, 2089, 1196, 1094, 2110, 2460, 1343, 428, 1020, 983, 2336, 641, 3134, 1997, 1891, 1770, 893, 150, 101, 3007, 3077, 786, 2505, 3291, 1069, 1206, 1648, 2189, 2534, 2054, 967, 2467, 1485, 2773, 1143, 3016, 392, 543, 818, 2430, 1536, 1488, 1969, 2129, 3252, 2893, 1907, 1729, 2109, 1320, 2958, 1637, 101, 2295, 670, 2582, 3079, 1501, 1003, 1621, 2460, 2949, 1770, 3181, 1327, 1510, 2725, 381, 634, 2850, 1624, 158, 666, 2658, 210, 1867, 1196, 2655, 1317, 2381, 3117, 1882, 312, 1534, 1765, 1623, 2953, 3313, 2027, 961, 3327, 728, 1034, 2307, 2806, 1075, 496, 2101, 188, 2695, 2949, 2930, 1183, 1428, 1865, 1262, 3194, 2750, 494, 48, 594, 218, 1871, 684, 912, 165, 942, 275, 1701, 1624, 1327, 3199, 2596, 3317, 523, 2019, 1600, 2350, 769, 2519, 3304, 3114, 3076, 3169, 2902, 2285, 674, 1655, 768, 3049, 2379, 1278, 1179, 413, 2426, 3008, 858, 174, 2088, 262, 3022, 1857, 288, 487, 1146, 2156, 480, 2480, 311, 2401, 169, 2223, 1606, 745, 2221, 1209, 2261, 1308, 913, 2002, 1241, 2096, 2993, 2037, 2370, 1778, 2210, 3131, 1348, 1675, 750, 1611, 1242, 2392, 740, 1775, 585, 407, 1659, 2149, 1070, 121, 2331, 2430, 3184, 1025, 2185, 953, 2729, 1859, 3009, 3009], [222, 862, 473, 2398, 1683, 1037, 81, 3005, 2949, 1805, 2121, 1700, 2421, 171, 2540, 198, 371, 9, 1873, 3005, 1541, 1307, 1457, 1209, 1742, 134, 2710, 55, 31, 154, 157, 416, 47, 1212, 1839, 298, 2988, 2197, 2393, 545, 1369, 1247, 466, 1278, 1551, 131, 1050, 2199, 1348, 543, 2507, 2213, 2134, 2388, 3324, 2847, 1661, 1280, 3, 2900, 2596, 1956, 2091, 977, 2552, 1431, 2889, 174, 1267, 1034, 937, 3025, 973, 2087, 1959, 1250, 400, 1673, 2450, 2447, 855, 415, 2314, 1540, 812, 1140, 1379, 2282, 3256, 315, 2186, 3086, 2608, 157, 1373, 512, 1278, 961, 3006, 3291, 2954, 741, 114, 2838, 1428, 681, 1958, 1049, 3248, 2670, 75, 2159, 2610, 2140, 3215, 1394, 1408, 2000, 1572, 1317, 311, 1869, 3012, 1442, 2298, 160, 462, 3089, 1143, 614, 2909, 264, 1736, 2476, 1933, 2482, 2726, 866, 227, 1873, 1182, 1573, 1553, 2002, 2101, 714, 882, 109, 1008, 2358, 3206, 185, 1475, 3104, 362, 1568, 2172, 2472, 1769, 3053, 2132, 2658, 172, 269, 2567, 1035, 579, 2285, 2146, 1009, 2083, 3307, 2837, 2788, 2796, 478, 1236, 1652, 577, 3041, 167, 1300, 544, 1362, 2153, 1392, 1713, 293, 3073, 1655, 2900, 521, 417, 1763, 1279, 2310, 1329, 2591, 2255, 129, 1358, 2967, 1427, 1027, 387, 902, 1235, 1407, 746, 1330, 1056, 3042, 899, 3069, 2112, 2290, 2977, 397, 3129, 1591, 1230, 676, 1099, 1542, 2326, 1841, 738, 2992, 2936, 727, 2043, 625, 2228, 2988, 3314, 1056, 2359, 3273, 2520, 553, 3078, 99, 515, 1388, 3056, 2623, 2974, 133, 911, 2041, 1994, 2428, 1438, 2588, 462, 2516]] mu: [0, 0, 1665, 0, 1665, 0, 0, 0, 0, 0, 1665, 1665, 0, 1665, 1665, 1665, 0, 1665, 1665, 1665, 1665, 0, 1665, 0, 0, 1665, 0, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 0, 0, 0, 0, 1665, 1665, 1665, 0, 0, 0, 1665, 1665, 0, 1665, 1665, 1665, 1665, 0, 1665, 0, 0, 1665, 1665, 1665, 0, 1665, 0, 1665, 1665, 0, 1665, 0, 0, 1665, 0, 1665, 0, 0, 0, 1665, 0, 1665, 1665, 0, 1665, 1665, 1665, 1665, 0, 1665, 1665, 0, 1665, 1665, 0, 0, 0, 0, 0, 1665, 1665, 0, 1665, 1665, 0, 1665, 1665, 0, 1665, 0, 0, 0, 1665, 0, 1665, 0, 0, 0, 1665, 1665, 0, 0, 1665, 0, 1665, 1665, 1665, 1665, 0, 0, 1665, 1665, 1665, 0, 1665, 1665, 0, 1665, 0, 1665, 0, 0, 1665, 0, 1665, 1665, 1665, 0, 1665, 0, 1665, 0, 0, 0, 0, 1665, 1665, 1665, 0, 0, 0, 1665, 1665, 0, 0, 0, 1665, 0, 0, 1665, 1665, 0, 1665, 0, 1665, 0, 1665, 0, 0, 1665, 1665, 0, 0, 1665, 1665, 0, 1665, 0, 0, 0, 1665, 0, 1665, 0, 0, 0, 0, 1665, 1665, 0, 0, 0, 0, 0, 0, 1665, 1665, 1665, 1665, 0, 1665, 0, 0, 0, 0, 1665, 0, 0, 0, 1665, 1665, 1665, 1665, 1665, 0, 0, 0, 1665, 1665, 0, 0, 0, 1665, 1665, 0, 0, 1665, 0, 0, 1665, 1665, 1665, 0, 0, 1665, 0, 0, 0, 0, 0, 0, 1665, 0, 1665, 0, 0, 1665, 1665, 0, 0, 1665, 1665] tHat^T * rHat: [168, 1978, 1879, 506, 2991, 2549, 1591, 3010, 2292, 3168, 735, 2810, 809, 2276, 173, 2808, 3298, 1969, 368, 1506, 1472, 3275, 292, 590, 3078, 2931, 2675, 2578, 567, 1161, 2015, 3020, 2566, 2296, 860, 1511, 1139, 1161, 3020, 1988, 2403, 1878, 513, 342, 215, 2884, 1115, 1845, 3082, 980, 1395, 1520, 17, 2863, 603, 569, 1322, 715, 1465, 2054, 2488, 2923, 1385, 1926, 2847, 3174, 1309, 44, 2990, 3300, 1894, 2855, 2882, 596, 2113, 2173, 2488, 2587, 2610, 2707, 2338, 2011, 2050, 3181, 2208, 2572, 2347, 955, 3284, 1416, 2106, 1698, 1044, 1087, 2930, 1895, 2493, 2836, 87, 1212, 2012, 660, 377, 1982, 3063, 2234, 1604, 2972, 297, 2607, 185, 3176, 1179, 52, 1105, 2425, 2655, 1992, 571, 329, 3318, 1336, 2715, 2042, 1316, 3046, 435, 141, 2283, 2272, 487, 2767, 1208, 2900, 1355, 1420, 2897, 376, 2389, 193, 1804, 1101, 338, 89, 1510, 2702, 3065, 2652, 983, 2245, 2677, 604, 41, 3037, 3282, 2371, 1804, 747, 1341, 1148, 2174, 2645, 3093, 1297, 508, 137, 3097, 1526, 1875, 2438, 1330, 2284, 72, 932, 2674, 2714, 3005, 2400, 2457, 1273, 3190, 3099, 2290, 1724, 2420, 2006, 34, 1441, 623, 428, 1286, 3175, 44, 311, 198, 2210, 3236, 1936, 2655, 3239, 1190, 3072, 3231, 1773, 970, 1631, 1927, 843, 2192, 3310, 1153, 922, 1770, 246, 1467, 2142, 1566, 931, 870, 2016, 2271, 41, 1153, 128, 254, 1707, 3255, 3297, 2955, 2360, 74, 3061, 1746, 878, 2738, 2738, 409, 247, 247, 611, 162, 3152, 2853, 1623, 2673, 2255, 2709, 3261, 3157, 1628, 2144, 1375, 1998, 555, 526, 1701] NTTInverse(tHat^T * rHat): [3281, 129, 1087, 3110, 2523, 1722, 632, 2517, 1209, 720, 1354, 1061, 665, 2811, 1418, 1765, 1465, 2182, 847, 1799, 3093, 3104, 2223, 1845, 1735, 2124, 1227, 526, 9, 879, 286, 3103, 1395, 1074, 2472, 1474, 2942, 2733, 1516, 1637, 1671, 1449, 305, 1462, 2130, 2158, 3279, 2030, 1895, 578, 537, 3135, 144, 2361, 2423, 335, 2587, 584, 399, 3321, 1770, 2466, 179, 2746, 1488, 124, 2933, 1743, 2206, 2141, 3015, 1149, 2344, 2363, 905, 1195, 779, 44, 626, 1980, 2074, 2113, 2982, 1942, 2032, 1330, 1306, 2907, 2899, 1397, 566, 589, 2703, 1610, 1065, 1844, 2260, 42, 2428, 814, 2948, 31, 64, 1232, 1421, 3124, 1641, 603, 2757, 1572, 141, 1863, 1945, 1253, 2403, 769, 1022, 1458, 2067, 3079, 3245, 703, 131, 882, 2829, 342, 1710, 3145, 1515, 2800, 3129, 2228, 2402, 1083, 555, 192, 1286, 1852, 869, 1145, 1785, 2593, 2297, 957, 3197, 1240, 1109, 1167, 1135, 2977, 689, 1727, 960, 1032, 1854, 381, 1242, 2563, 1172, 2511, 716, 2236, 1036, 1387, 932, 784, 1289, 2397, 2608, 2489, 2185, 2571, 2504, 468, 364, 1779, 2899, 1582, 173, 590, 2530, 3055, 3057, 1668, 2253, 447, 578, 1413, 868, 2620, 1185, 844, 1691, 1330, 2338, 2476, 2030, 310, 2611, 90, 2633, 2180, 552, 59, 2834, 2316, 1761, 2493, 43, 886, 3233, 126, 2940, 1478, 2338, 825, 849, 2553, 562, 2400, 1808, 1090, 2777, 254, 1814, 1772, 3214, 2124, 2556, 303, 2709, 1546, 145, 2220, 2247, 2206, 3113, 65, 2125, 106, 687, 2032, 732, 2960, 3056, 2494, 3084, 358, 1895, 2795, 2621, 1702, 449, 2606, 2886, 816] e2 + mu: [0, 3328, 1666, 3328, 1666, 0, 2, 3328, 0, 0, 1666, 1665, 1, 1666, 1665, 1667, 0, 1664, 1665, 1667, 1667, 0, 1666, 1, 1, 1665, 0, 1665, 1665, 1665, 1666, 1666, 1667, 1664, 0, 1, 0, 0, 1666, 1664, 1667, 1, 0, 3328, 1663, 1665, 1, 1665, 1665, 1666, 1664, 3328, 1665, 1, 1, 1665, 1664, 1664, 3327, 1665, 3327, 1664, 1666, 1, 1665, 1, 0, 1665, 0, 1664, 0, 3327, 0, 1665, 0, 1665, 1665, 1, 1664, 1665, 1665, 1666, 0, 1665, 1665, 1, 1663, 1664, 0, 0, 0, 3328, 3328, 1663, 1664, 1, 1664, 1665, 0, 1665, 1667, 0, 1666, 3328, 3328, 3328, 1666, 3328, 1664, 0, 1, 0, 1664, 1665, 3328, 1, 1665, 0, 1665, 1663, 1665, 1666, 0, 3328, 1665, 1664, 1666, 0, 1666, 1664, 1, 1665, 1, 1665, 1, 2, 1666, 0, 1667, 1664, 1664, 1, 1663, 0, 1666, 0, 2, 3328, 3328, 1664, 1664, 1666, 0, 0, 3328, 1665, 1665, 1, 0, 3328, 1665, 0, 3328, 1664, 1665, 0, 1664, 1, 1665, 0, 1666, 3327, 0, 1666, 1667, 1, 0, 1666, 1665, 0, 1665, 0, 1, 3328, 1665, 0, 1665, 0, 1, 0, 1, 1665, 1666, 2, 3328, 3328, 0, 3328, 0, 1665, 1665, 1667, 1666, 1, 1664, 1, 0, 0, 0, 1666, 3328, 0, 0, 1664, 1665, 1665, 1666, 1663, 0, 2, 1, 1665, 1666, 0, 1, 0, 1663, 1665, 3327, 1, 1664, 0, 0, 1665, 1665, 1665, 3327, 2, 1665, 0, 0, 1, 3328, 3328, 3328, 1665, 1, 1666, 0, 0, 1664, 1664, 3328, 3328, 1665, 1664] v = NTTInverse(tHat^T * rHat) + e2 + mu: [3281, 128, 2753, 3109, 860, 1722, 634, 2516, 1209, 720, 3020, 2726, 666, 1148, 3083, 103, 1465, 517, 2512, 137, 1431, 3104, 560, 1846, 1736, 460, 1227, 2191, 1674, 2544, 1952, 1440, 3062, 2738, 2472, 1475, 2942, 2733, 3182, 3301, 9, 1450, 305, 1461, 464, 494, 3280, 366, 231, 2244, 2201, 3134, 1809, 2362, 2424, 2000, 922, 2248, 397, 1657, 1768, 801, 1845, 2747, 3153, 125, 2933, 79, 2206, 476, 3015, 1147, 2344, 699, 905, 2860, 2444, 45, 2290, 316, 410, 450, 2982, 278, 368, 1331, 2969, 1242, 2899, 1397, 566, 588, 2702, 3273, 2729, 1845, 595, 1707, 2428, 2479, 1286, 31, 1730, 1231, 1420, 3123, 3307, 602, 1092, 1572, 142, 1863, 280, 2918, 2402, 770, 2687, 1458, 403, 1413, 1581, 2369, 131, 881, 1165, 2006, 47, 3145, 3181, 1135, 3130, 564, 2403, 2748, 556, 194, 2952, 1852, 2536, 2809, 120, 2594, 631, 957, 1534, 1240, 1111, 1166, 1134, 1312, 2353, 64, 960, 1032, 1853, 2046, 2907, 2564, 1172, 2510, 2381, 2236, 1035, 3051, 2597, 784, 2953, 2398, 944, 2489, 522, 2569, 2504, 2134, 2031, 1780, 2899, 3248, 1838, 590, 866, 3055, 3058, 1667, 589, 447, 2243, 1413, 869, 2620, 1186, 2509, 28, 1332, 2337, 2475, 2030, 309, 2611, 1755, 969, 518, 2218, 60, 1169, 2317, 1761, 2493, 43, 2552, 3232, 126, 2940, 3142, 674, 2490, 2515, 887, 562, 2402, 1809, 2755, 1114, 254, 1815, 1772, 1548, 460, 2554, 304, 1044, 1546, 145, 556, 583, 542, 3111, 67, 461, 106, 687, 2033, 731, 2959, 3055, 830, 3085, 2024, 1895, 2795, 956, 37, 448, 2605, 1222, 2480] KBar: 72A437218AD22B2318C371896616F14B6E85EE8CED6FC1D3B87199B9522E59D4 cPrime: DFA6B9D72A63B420B89DDE50F7E0D56ECF876BFEF991FCE91C8D286FA6EABAC1730FD87741FE4AD717B282A21E235A55C3757D88D4CE62F414EB77EB9D357EE29D00087BF8110E5BBBC7C90419072EAE044BF7E183D43A94B2632AA14649619B70649521BC19370942EF70F36C34C8C23591EE0CA71A12D279E0F52D39ED0F913F8C262621FB242E680DEB307B0749C6B393A8EF66F8B04AAFA877B951AB93F598B4B2FAB04F88AC803984FF37E3FE74F3A616D5314EB3A826F874F8ECD3A5647D04942A57EFC09638470DC0A9DF40B317571D3984A78CF7D11751090722B3059E07591CC4A2ED9BA0DCE99BE9E5EE5DB8D698CDEB5814759BA977C90079CF2AFDE478069C513A60091A3A5D0111E22DE06CB145C14E22A214CB278C8152B0681BCAFF54D552B54A671C0DFEF775E7C54FEFC4853868C955971ABDAC2A76292CCCD4FD1C706B7D3614159673E9D7B29A2D3F63363129E7A21E803A460F2714E3E25922780AF38257CD1495ACD1E01980638DF58A153DAB07EFB5C7E78ADACF631956D69CCDA070459568BD9D11A2934BCF1643BC99468238910B1F742EBB3C03D39FD45CFB85BA309E29DD9B5CD560819EC729FCAC8B9D725E3E8ABEDE4B5298A8658EE3F781B0CE683CBB7335CD57EFE2204A8F197446D7314CDBF4C5D08CCC41F80857CC9571FBFB906060F7E17C8CEF0F274AFF83E393B15F2F9589A13AF4BC78E16CDDE62361D63B8DC903B70C01A43419CD2052150BD28719F61FF31F4A9BEC4DDBCEC1F8FB2EFBF37DFFFA4C7FECA8CE6D626BFDA16EE708D9206814A2EF988525615D4AC9BE608C4B03ABEE95B32A5DB74A96119A7E159AF99CD98E88EAF09F0D780E7C7E814B8E88B4F4E15FA54995D0ECBAD3EF046A4947F3E8B9E744241489B806FE9401E78BAFC8E882E9D6D0700F720C0024E7DA49061C5D18A62074040ABC0003200ED465231797930A2E2AA501F64862DDA13014A99F9D3270AA907EEB3FDBFF291600DF1F6B39684B11E396B70D86F90492E82B09BA25607B0C286FBC070182AC76FA7C859AAFEA87016AED22C3605A2789A1D439FD8D933342DAB745A3E550E7D77C01A6234BDA7D6BB19D495E6560FCE8396FC3C6E088ED60F5F2771416EA3BE5BE472B6404906C91E71D9A8672F390083655AB7D0EC6EDFE86789CE20BE2EA90CA5CC31416FB24CBAF94DA1468FE696BCDF5247CF117CBE9334076CA6896B2F6A016B1F7C73728807898D8B199756C2B0AA2457E1B4F7754C4576CE5645614EA15C1AE28B094EB217C7A7A41239576CBDA380EE68783432730AD5EBE7F51D6BE7FB02AB37BE0C96AAC9F3C790A18D159E6BABA71EC88C110FD84C336DF630F271CF79328B6C879DF7CDE0F70712220B1FBB9ACB48248D91F0E2B6E3BE40C2B221E626E7E330D9D83CC0668F7308591E14C7D72B841A6F05F3FDC139EECC1536765650B55A9CEC6BBF54CCEC5C3AC9A0E39F48F237BD4C660CB1A8D250BB6C8C010FEC34CC3D91599271C7531330F12A3E44FAFD905D2C6 Accepted, returning KPrime fips203-0.2.1/tests/nist_vectors/Encapsulation -- ML-KEM-1024.txt000064400000000000000000002217601046102023000217350ustar 00000000000000Encapsulation -- ML-KEM-1024 ek: 27669A667667B8D5466858602260115B6209BC2C45DF7A4E64932B75C78B9F7083F131BCD4E20EFF8CCF69736BDBC88406F9B69AD3CE356A0F5E676DD0A7C4ABB1A1C9D62021BB384A4014FB04CD2F821890D90427C49F4A628ECEC2731FAC025237360D582CD06647B1109AA6C2AC5D433758C1CAA53555FFF577EBB521FBE32D10F790604C53C2F82C17B08EF3625674214844906DB3FB9520031422A13BD7612D4201C27D15B9D194830CC3669BB8BA34C2523764413971C40D84AEE65675D5215309DA8367F001497546ECE07CBF002D781B830682484080AD6F9558B36B6BF610917130B7419B39F85029621264CF2C8AE4D808387B20CC5AA0B969C39BC80E6CB9CA0351A3F60ACEAF12BD41FA0996E39906A9B61697B747C2031C760288364457425BBBB40F4898AD085876608A77A5EB9D124BC9922651B76395881558CAD06F3C4BCF08E45B67BA516038A364B7740E9740EE2B93C5C65F49020AD42B3C0AEA5BF242A4F1B089B5A3458BE8A371CA1F293C53F2780ECE281293D991E6E579042BABC169724F10681FD1C7D2FB1648B0BF80818A7DD3B709734D38972E3E44875AF0927A9AADE82613FCA05EE5B3210647A5632AA170D09E70B56A2F04337A337EE952383A1A8AEEA6CDB90CCD86A818D1BB39465BA313D266BBB10581FA187D926AC3A8B749F64445FAB56C9927555793FB4ACFB039B1AA543B1B87AE6A49AB562933C4C97BD74C07BF29851A469851A982595596FE7ACAE0DB23533028AA34676F7A9B29263E7AA27900104B1BA1B5674739B2FC4ED8A330BBA5A0B6247C63F1153DA01DC8F616F10483A693A634C1BA6AE1AB2F163400BB5771E70171FCB54155ABFCB2044FCB30BAD67F742183861819EDB1AA6C771FC8E11A92E08B71F40D036C15D2896A204725BA90A03B478D98C49084382F1D223FE12980E947A415E55FE67B85DA40441342445B46C2FC42020D04769A2A1C64641F0C36636BA6C4652B267A4B9219E333A06817B5817B6E6CC485E352614169ABC20E1891B7A000C52AF15A7B904C976C1BFD3A2377EB76B55033C7C4C69E7174AAF27715756316CACCCE63A5A22435C7D1020443AA71693BF062303D13331F795424C20D266C1D90305FC8C2536684A93D506DE6329B6162405999BD5CAA7DDB9613C8238CC6D335A1EB4082E7710D079F87A4BFF6478B5F0C587786AF427192D9A34A4FA33BF0D3CC58FB463B4838CA2C337E65397DA15690C52AC0E5468BDC03DF5A62F7020934E267E0F7CF95599435F952FAB74CFEB4308B173F12E073F7F040DB4C63C1C48A7B7A41F4779A6B57A922C970771180008493D4C76805400B7C664D0B92B22C49551B1247E62C85E1E540C82093371013C4676CEAD77C5F3064A37349C7165EB3AA7DEF8731E9D66A56368F195C045B2A50E59786161A630D280089801298C130E4483150CA9152C2A0F247750C062259B84C28236C3FB54625D5CDBECC68DBA22FB1558055FB9B243501C75851E76ABE4847B9B972A73411A6B4282BF5983A82DA7413E54BA35BAB37A9B3C62884B643C134165C9870C6BB390F6B7A1E5745158FB251D6909433551FEBD30BA575A1E2F10958498D9F147ED9531322A16097F55D811795457912912B1C65F38025429B3E764A2E1ABC4E30C288082742995590981C43DBB365966BCB9720B178C5EB963B82934C02814B7525546DB7C96D65822E4942E4A4AC13C99490E7AB4A702371F21316A57906B19258428801192567C2045BF8775CF58C5DB28BA1B05E042A1859E64286B5B114F39FCACC127BE63DFF590BC184B83B168C30199890374100E40D2FC7752B1430355022F3D58925D1991BF3B98A90395F8579646C8413BAB3C0C0707A238A27D09FA57A32FF85392FD08C2F2286ABDB2B6936B9D3503802C6B51E415B81673CC78054F1B2C4BDFA733E5264C55A7C4DA5B73944402462033D08AE620BD05644B477AB315E936D3F25B5BA7AC19EB559A5C1195F568B313C2675092E6DF58FF399C42CAB6363AA033691CB8CE06699E701F2B92597CB8FC23516E9F40CE75B7BC1E0520A5A3895EB7D8D474009A0CB0ADC2DF476B5164112C3B600B6776DAB49B20381A4014691652A3C3161AAC6616CFAA265638C6C665A8454F36780B789CFA35D2AF49E6D5F482BFA3C864B0EF29E18D2EFFF92DB1876A22076AB1AAC0A7393ED9E5A48 m: 034FF14A56249C2521D4279EBA3D04931CC892BBC45002B5B33D9F0188ACBAF6 K: 46C200F3F6EE8E11D47653801E3482241CB783B9D794EB116A4BDA085AEB6BB7 r: 8A6BF0ABC0660F5EAF82FC503DA73AA76A2BD0D8E85424D27F4F750AC3CCE15E tHat: [[1575, 2470, 1638, 1655, 1464, 1133, 2152, 1541, 34, 278, 603, 150, 3260, 1106, 2783, 1255, 868, 697, 1909, 2236, 159, 2103, 497, 3011, 724, 238, 3327, 3320, 873, 1719, 2267, 2124, 2310, 2927, 922, 3309, 2613, 246, 1886, 1750, 2000, 3146, 427, 2587, 1737, 525, 2849, 907, 74, 324, 1275, 3280, 559, 392, 2448, 77, 1063, 2556, 586, 2278, 718, 1852, 3103, 42, 1874, 867, 2061, 709, 1744, 1142, 177, 2465, 678, 2764, 861, 884, 344, 3244, 1445, 1363, 1535, 1919, 1515, 539, 1019, 734, 1808, 2319, 3168, 1332, 2242, 719, 23, 2283, 755, 1382, 372, 1154, 68, 1753, 2995, 2399, 800, 320, 290, 954, 471, 726, 322, 3104, 1405, 2961, 1233, 2105, 780, 1644, 2203, 2987, 564, 1324, 1079, 1046, 313, 3143, 1037, 2792, 1766, 1877, 469, 1330, 2569, 2109, 103, 31, 1353, 1127, 236, 1998, 191, 720, 2936, 2097, 518, 1160, 64, 2776, 1391, 1417, 2995, 1718, 246, 2321, 113, 2931, 2881, 921, 248, 661, 610, 1601, 3279, 2210, 2276, 141, 2872, 519, 2764, 2565, 2489, 3126, 2203, 236, 2412, 3243, 259, 2613, 2806, 3296, 687, 3025, 2625, 159, 918, 2462, 2310, 2922, 1814, 2937, 583, 60, 1564, 39, 1672, 1091, 599, 1460, 1211, 251, 2120, 2777, 2056, 1893, 2656, 1912, 2981, 2526, 2834, 3220, 1682, 1298, 951, 2390, 1416, 1409, 202, 1789, 2876, 3316, 1032, 1470, 2663, 1307, 2144, 2611, 1892, 1867, 1806, 1033, 3054, 2354, 1733, 1532, 585, 160, 3028, 962, 2570, 1470, 754, 2628, 241, 2203, 949, 1114, 2187, 2622, 2673, 508, 3113, 1331, 2290, 231, 2254, 290, 2451, 2333], [1510, 1950, 2820, 2738, 2497, 1830, 79, 1665, 287, 3197, 3026, 367, 72, 3067, 384, 2216, 893, 2941, 777, 1239, 1848, 745, 1086, 2164, 90, 2351, 2682, 2777, 1768, 306, 252, 1514, 997, 539, 1798, 2644, 2659, 2578, 112, 2541, 1392, 1707, 1071, 816, 890, 2019, 745, 901, 2618, 2209, 1774, 3290, 3257, 3280, 2182, 394, 3025, 923, 2886, 2613, 531, 1645, 443, 91, 2689, 399, 637, 1705, 2243, 2938, 1609, 1103, 2629, 2911, 2412, 633, 1877, 2357, 2811, 3316, 2480, 2835, 1194, 949, 1819, 2792, 2410, 2740, 2390, 818, 2500, 1980, 3287, 116, 2495, 2130, 1562, 2436, 2385, 2090, 1369, 2405, 2814, 3239, 3040, 573, 83, 643, 1194, 1651, 2671, 2487, 1577, 994, 634, 1946, 0, 1201, 283, 2906, 1895, 916, 3250, 1263, 984, 778, 1467, 2570, 1206, 1986, 355, 351, 61, 474, 1736, 367, 1265, 2096, 934, 2665, 308, 2988, 362, 2750, 1583, 833, 2816, 1403, 1905, 30, 3185, 2911, 1345, 2741, 764, 75, 2895, 780, 1722, 2045, 372, 2098, 2182, 401, 493, 2731, 1900, 503, 456, 430, 146, 2238, 1137, 223, 3075, 342, 2514, 1704, 1824, 596, 186, 2569, 1851, 2260, 1176, 2316, 2180, 755, 541, 1010, 2529, 2050, 2025, 2628, 1301, 1534, 3046, 2135, 218, 1092, 531, 1092, 1627, 3108, 764, 36, 1037, 1888, 2714, 450, 1124, 502, 1548, 1587, 1643, 3146, 2917, 610, 2938, 2340, 793, 830, 2208, 374, 437, 1976, 3182, 3142, 901, 1326, 353, 1684, 683, 236, 280, 2937, 160, 3152, 298, 1455, 123, 1225, 3223, 438, 2813, 563, 2935, 1902, 181, 821, 1223, 3180, 414, 1863, 682, 1919], [1301, 1591, 2582, 3276, 974, 2646, 1186, 850, 455, 45, 772, 2724, 2417, 950, 752, 774, 829, 817, 2335, 1351, 548, 220, 3110, 470, 144, 1523, 712, 1340, 1126, 2712, 61, 1749, 742, 2483, 609, 1030, 2393, 3033, 2652, 2010, 1755, 313, 968, 2242, 966, 861, 2977, 1038, 1922, 1822, 1805, 2544, 1159, 3066, 2038, 2228, 3167, 1408, 1655, 2808, 322, 2343, 985, 1194, 847, 954, 1008, 3277, 2904, 1135, 2107, 900, 3274, 818, 1406, 918, 381, 1386, 1424, 684, 1472, 1134, 3211, 61, 2783, 1573, 759, 144, 564, 1662, 2016, 3327, 2453, 2373, 2357, 1327, 2042, 1227, 1278, 779, 1931, 1009, 18, 1854, 247, 1039, 3291, 1588, 1217, 2220, 2683, 1047, 2036, 2471, 1899, 2709, 2338, 1804, 375, 2049, 1024, 2360, 2004, 1676, 5, 180, 1660, 1238, 523, 2857, 2348, 1364, 539, 1137, 3302, 2130, 1505, 1038, 200, 2354, 55, 305, 1988, 1734, 2026, 1997, 95, 1603, 931, 1175, 1735, 1505, 2739, 2010, 2031, 792, 1769, 1709, 1622, 2291, 3097, 69, 2651, 1282, 2021, 2153, 2582, 1585, 2061, 2, 137, 296, 408, 780, 2276, 788, 2640, 2332, 594, 2572, 2034, 1876, 1548, 544, 2137, 1227, 808, 1730, 1343, 1131, 1317, 3293, 3262, 1676, 731, 762, 1457, 2053, 2901, 2495, 1316, 19, 2247, 1301, 2791, 3046, 1864, 2964, 697, 2679, 308, 2657, 2228, 690, 2293, 937, 2690, 1869, 1299, 1214, 2979, 2741, 2359, 2874, 2246, 2114, 950, 3092, 1588, 1473, 152, 3175, 2491, 243, 2667, 487, 1367, 340, 655, 1307, 214, 2377, 1331, 501, 1003, 189, 1445, 2583, 482, 159, 2392, 2260, 1183, 2017, 985, 309], [290, 1546, 1431, 1503, 1921, 2385, 2373, 295, 2961, 450, 869, 2063, 549, 2484, 1598, 1191, 2606, 3009, 78, 3107, 2184, 624, 2370, 1369, 2192, 457, 2883, 2877, 1637, 1721, 1995, 521, 2225, 3159, 1771, 953, 898, 1225, 258, 1208, 1397, 1346, 1901, 3227, 1389, 2086, 2350, 1060, 1252, 2762, 2323, 2380, 1936, 2750, 74, 567, 625, 319, 1302, 1946, 262, 2347, 600, 2180, 2305, 593, 615, 76, 2139, 1919, 1372, 2255, 605, 2235, 161, 1515, 2564, 386, 1625, 1070, 1414, 2843, 788, 2559, 3274, 300, 1659, 990, 2559, 181, 1217, 2952, 1595, 2241, 2352, 2433, 1936, 1043, 1024, 222, 1839, 1884, 1067, 769, 53, 549, 1523, 2205, 293, 2461, 795, 2975, 138, 921, 1375, 1944, 3172, 2118, 2579, 2875, 192, 1804, 890, 2210, 39, 2557, 2725, 807, 1535, 920, 47, 2253, 559, 2146, 2987, 701, 1641, 2963, 211, 901, 1538, 2908, 286, 1460, 1921, 966, 199, 1352, 753, 3147, 2749, 1855, 574, 1605, 2757, 1989, 1357, 2938, 1081, 1028, 548, 54, 2109, 2784, 2914, 3328, 1110, 2884, 2935, 794, 862, 1753, 1343, 2898, 2746, 3095, 1438, 1435, 421, 412, 1631, 2229, 3121, 611, 2421, 736, 1389, 2303, 2547, 3145, 2860, 1594, 2659, 58, 310, 3257, 140, 1646, 1945, 30, 2546, 603, 2967, 2300, 1474, 355, 1257, 207, 3047, 1973, 193, 1326, 2570, 901, 2965, 2014, 1933, 1028, 9, 3258, 3082, 733, 1780, 2903, 278, 292, 1731, 11, 1974, 1751, 2475, 2852, 259, 2632, 1537, 2324, 2661, 962, 305, 2726, 454, 1734, 762, 1626, 3171, 1736, 2662, 2117, 852, 1663, 1920, 2203, 975, 1498, 1066, 2543]] bHat = aHat^T: [[[1596, 166, 2137, 2913, 2171, 2784, 98, 1417, 3000, 1618, 389, 1082, 698, 2456, 1546, 1879, 1476, 1505, 253, 1946, 2617, 1049, 1030, 843, 1737, 1130, 1534, 2075, 333, 2836, 3098, 2545, 1405, 1599, 875, 934, 1448, 2461, 2195, 1386, 934, 390, 2440, 1968, 2256, 960, 733, 901, 3052, 266, 1081, 2479, 232, 1555, 1694, 3051, 1877, 65, 2794, 524, 627, 1155, 2873, 2252, 2479, 3087, 433, 2665, 431, 2806, 3032, 2107, 2170, 747, 2505, 3199, 1197, 1621, 263, 694, 2398, 622, 1469, 1509, 794, 2227, 1861, 1426, 2700, 99, 2717, 2351, 396, 1696, 882, 1892, 1147, 1040, 479, 2515, 2940, 259, 2745, 399, 1364, 1103, 410, 781, 2815, 2477, 1635, 2780, 1096, 3064, 785, 484, 2168, 2426, 1858, 3117, 1632, 543, 369, 3113, 3030, 2921, 758, 3176, 609, 2454, 3051, 2209, 1112, 1291, 2055, 3136, 3007, 995, 2647, 3179, 731, 1932, 276, 2695, 849, 3325, 1137, 2638, 2292, 1922, 1928, 3284, 1123, 2278, 2721, 1556, 1571, 2421, 2737, 578, 656, 2725, 3105, 1246, 217, 2019, 752, 3150, 310, 3241, 1335, 34, 220, 629, 2425, 2803, 439, 2208, 2398, 3001, 1840, 1937, 1472, 1139, 1431, 2934, 519, 1539, 554, 94, 273, 1015, 2142, 3198, 1325, 791, 2864, 1562, 685, 1097, 1253, 2870, 2492, 2970, 2159, 401, 2843, 3250, 2194, 211, 2734, 1246, 2450, 2960, 1153, 929, 1165, 2438, 3145, 381, 2831, 1063, 436, 2205, 362, 2615, 1057, 2712, 1897, 1491, 893, 869, 404, 490, 3205, 1272, 2492, 904, 1765, 1996, 92, 1555, 885, 1577, 530, 1226, 1824, 1342, 3315, 2765, 2350, 1384, 713, 2605, 3294, 2813], [326, 286, 474, 255, 188, 2276, 1226, 3148, 1420, 880, 812, 1837, 1553, 263, 2959, 3060, 54, 355, 2367, 820, 2668, 2969, 1728, 408, 3122, 1251, 1078, 1983, 938, 2492, 3315, 877, 321, 2522, 3057, 252, 2960, 1050, 3230, 1128, 3131, 1411, 2373, 3050, 1821, 3191, 1236, 2236, 3048, 106, 1559, 925, 116, 1976, 2069, 2884, 2308, 1281, 2983, 599, 3045, 369, 227, 2771, 1683, 2977, 2722, 1788, 535, 2751, 1272, 1407, 1059, 1642, 2166, 1776, 2215, 3251, 1673, 2074, 1810, 487, 364, 2356, 2234, 1012, 2346, 270, 82, 3190, 810, 1349, 161, 2091, 1671, 677, 1888, 1560, 2664, 1684, 1044, 232, 356, 2750, 188, 132, 426, 449, 2983, 1903, 1253, 1802, 864, 222, 2370, 3251, 989, 1291, 3073, 854, 1200, 2325, 2939, 1221, 205, 1373, 1102, 921, 1115, 1733, 1187, 3209, 1318, 970, 1062, 1972, 2525, 1966, 3230, 448, 2847, 522, 3156, 855, 2078, 1390, 461, 642, 1760, 568, 212, 2529, 665, 2532, 2451, 293, 352, 1344, 740, 1848, 2749, 857, 602, 172, 232, 1064, 1615, 3010, 1848, 2265, 210, 1008, 2368, 2876, 2552, 2055, 2123, 2095, 2164, 2177, 3147, 948, 50, 1486, 410, 619, 856, 105, 2018, 327, 2979, 806, 700, 2181, 1048, 1069, 2256, 2391, 2265, 874, 1830, 3107, 2170, 2601, 3044, 3109, 128, 3292, 285, 306, 3085, 240, 1101, 2412, 511, 3021, 175, 225, 2269, 1790, 2171, 971, 966, 3096, 1015, 3222, 621, 892, 3227, 1766, 2783, 1026, 1868, 2559, 78, 2655, 2271, 1728, 423, 327, 1603, 1192, 1397, 1368, 216, 2771, 202, 2822, 441, 427, 2315, 1095, 1104, 2640, 939, 954], [2304, 262, 1834, 801, 2275, 286, 2335, 2942, 2851, 2246, 1255, 1520, 1021, 990, 3051, 2949, 2904, 1963, 0, 1581, 910, 795, 2111, 3256, 2929, 531, 136, 28, 123, 2185, 984, 1609, 965, 2068, 742, 119, 1595, 3008, 585, 1428, 400, 2525, 538, 62, 2585, 2448, 277, 2010, 1256, 1090, 3303, 1341, 2800, 1149, 833, 1578, 544, 15, 649, 2807, 2929, 1755, 2170, 3321, 200, 230, 3323, 1134, 1399, 2363, 109, 2979, 1425, 2608, 741, 2765, 887, 2764, 165, 731, 1005, 578, 1297, 259, 105, 77, 3207, 2526, 846, 1758, 1552, 596, 3167, 2723, 202, 1116, 1324, 2725, 3158, 1523, 336, 1042, 414, 1355, 166, 2971, 662, 2018, 174, 1754, 3290, 20, 1458, 719, 2436, 781, 1797, 1759, 2981, 673, 2252, 1515, 1705, 318, 1816, 134, 426, 1564, 1395, 665, 2143, 1311, 2596, 361, 2335, 1660, 1711, 2211, 13, 288, 431, 2911, 1340, 1202, 1594, 205, 1503, 692, 1459, 2459, 1149, 2902, 1524, 1298, 170, 1090, 1635, 549, 2167, 1557, 1673, 437, 2738, 2835, 1004, 1618, 566, 282, 2191, 2888, 1707, 2791, 827, 2242, 1872, 1392, 2516, 829, 1817, 480, 1163, 1400, 1224, 1727, 120, 2934, 3186, 272, 2478, 1131, 1923, 516, 1710, 452, 1418, 2533, 633, 2716, 1925, 1962, 1897, 2446, 3135, 972, 677, 511, 157, 585, 88, 1963, 2920, 2406, 1757, 724, 202, 2989, 30, 1541, 1395, 2772, 1144, 1945, 502, 2765, 1833, 1603, 483, 3286, 2403, 502, 361, 1170, 2061, 1818, 132, 2745, 888, 1152, 1965, 2589, 3064, 1221, 2634, 2914, 2760, 1594, 360, 1302, 2936, 1785, 2229, 846, 1209, 3207, 2837, 1295], [1732, 1508, 1472, 1564, 2690, 2020, 1063, 1683, 3059, 2257, 341, 2097, 1960, 2634, 2680, 1223, 414, 3158, 1673, 2617, 2828, 2012, 778, 2605, 1170, 1119, 2624, 2699, 1294, 1474, 2531, 372, 260, 589, 1173, 776, 2827, 774, 42, 1298, 1190, 1291, 477, 1476, 1692, 956, 635, 2371, 2505, 409, 2380, 2933, 1573, 2256, 3224, 1776, 1203, 65, 2017, 955, 3190, 1453, 3226, 1254, 1568, 1790, 2185, 2714, 2984, 1664, 2394, 576, 2337, 1389, 2900, 33, 317, 2537, 1320, 44, 2510, 2721, 1528, 1742, 574, 2134, 1932, 1913, 1913, 2640, 106, 893, 2061, 2414, 3068, 2916, 286, 1577, 1743, 186, 1028, 1008, 1700, 2693, 790, 725, 2624, 2032, 2988, 2662, 366, 1926, 2331, 252, 1319, 2609, 417, 3189, 37, 1881, 715, 1880, 1865, 1715, 999, 1421, 1715, 592, 2579, 2941, 241, 2139, 1259, 1847, 182, 1395, 3187, 774, 113, 1600, 2914, 1644, 2576, 1651, 27, 837, 994, 340, 1212, 856, 355, 2627, 778, 2191, 976, 2928, 2578, 3237, 2438, 1072, 1523, 267, 1626, 759, 2718, 2606, 2037, 2156, 711, 2793, 2668, 2253, 1973, 2041, 2359, 634, 3294, 1698, 2746, 1496, 1410, 806, 1114, 2795, 1865, 716, 1521, 2974, 1401, 2716, 2752, 970, 2460, 781, 182, 1885, 1162, 3119, 1830, 1659, 2326, 3089, 2101, 1208, 1434, 960, 2832, 2584, 1417, 1407, 3034, 292, 29, 2033, 338, 2005, 92, 1660, 2218, 734, 2689, 275, 3001, 2136, 1209, 1252, 2499, 1742, 1025, 1681, 845, 1519, 121, 2231, 2696, 3273, 362, 3162, 1921, 1214, 3048, 2755, 1035, 2048, 1581, 3204, 2196, 2957, 334, 577, 3051, 2611, 2111, 2173, 583, 841]], [[867, 2459, 154, 2063, 1119, 846, 1765, 1508, 1937, 701, 1350, 640, 884, 1092, 2013, 714, 3044, 413, 1441, 2118, 454, 631, 1334, 2704, 226, 3225, 2277, 1146, 1180, 2535, 3160, 2872, 955, 3215, 886, 838, 2297, 2854, 894, 700, 873, 2878, 2981, 319, 754, 424, 1595, 2704, 2021, 3033, 2257, 1114, 1689, 1960, 2621, 960, 1241, 2022, 960, 1863, 2691, 1909, 1072, 1674, 2215, 1403, 1226, 3141, 657, 2453, 3303, 1435, 557, 2429, 398, 512, 2956, 761, 293, 1278, 2157, 2289, 39, 711, 2458, 2286, 1941, 3024, 495, 1463, 2109, 1163, 3245, 1089, 2667, 3048, 50, 1407, 1976, 2451, 2252, 3074, 334, 538, 1693, 2198, 1061, 425, 2529, 1000, 486, 2651, 985, 1629, 2680, 2429, 399, 2383, 564, 3172, 1523, 1570, 286, 3301, 55, 1652, 2988, 2257, 1400, 1765, 3188, 735, 1280, 2502, 663, 3268, 1716, 2449, 745, 696, 1115, 1318, 3086, 1460, 25, 107, 1773, 2802, 67, 1825, 1804, 2681, 1929, 2862, 2391, 2263, 2796, 41, 1109, 2056, 2459, 369, 399, 1790, 1334, 3038, 1139, 2452, 2600, 2642, 386, 2186, 930, 295, 1388, 1527, 1763, 1280, 2408, 373, 635, 3103, 2968, 3052, 1077, 24, 660, 708, 373, 1459, 2037, 2177, 2796, 1090, 2361, 1908, 1332, 2042, 231, 292, 1150, 3125, 387, 2885, 2637, 3040, 32, 2758, 788, 1011, 814, 2970, 2199, 3164, 1817, 912, 939, 1584, 2101, 389, 1490, 2396, 862, 1985, 2915, 1481, 360, 3100, 347, 3054, 697, 1431, 1456, 1699, 1569, 1110, 952, 3262, 8, 1944, 1744, 830, 120, 2073, 2652, 3023, 1639, 1857, 2185, 1525, 2457, 1910, 3251, 2908, 931, 1854], [1874, 1090, 3206, 1005, 475, 666, 913, 3174, 1808, 1376, 667, 1889, 1375, 3187, 1036, 3131, 2664, 2013, 3310, 2979, 2962, 1128, 1187, 1418, 1050, 1331, 3194, 2413, 2426, 706, 1413, 422, 1899, 2934, 1401, 1515, 1639, 3133, 2137, 2153, 2740, 1582, 744, 3322, 1018, 433, 1769, 2595, 520, 2684, 1155, 723, 2458, 608, 789, 3006, 1109, 1821, 968, 656, 2300, 2276, 1050, 114, 2141, 926, 1235, 152, 104, 1928, 401, 3282, 1368, 971, 2620, 835, 1520, 3124, 2728, 1842, 1710, 50, 398, 2059, 2479, 1755, 622, 977, 734, 2277, 2071, 2450, 129, 2231, 1302, 2176, 2567, 2627, 699, 381, 241, 1124, 2468, 1302, 645, 2050, 1417, 678, 3235, 950, 2007, 1294, 1036, 451, 2822, 968, 2924, 2703, 2804, 610, 2423, 1824, 652, 2482, 1334, 419, 81, 715, 2701, 985, 1572, 641, 1234, 1484, 1282, 296, 1080, 2109, 220, 2492, 2611, 2851, 3133, 1721, 1680, 2433, 204, 2611, 2846, 63, 1690, 1667, 1032, 2461, 627, 1383, 2451, 2928, 3084, 863, 134, 2984, 2133, 2442, 161, 1633, 86, 1255, 2963, 2355, 849, 206, 687, 1150, 1171, 53, 1941, 1195, 2811, 1982, 2038, 736, 2207, 3102, 1497, 328, 1951, 1674, 2774, 1346, 1969, 2278, 295, 2054, 663, 2151, 97, 1712, 2390, 2055, 244, 3152, 1314, 2546, 58, 2298, 588, 2885, 2739, 2158, 1, 2620, 2211, 83, 1974, 2234, 3068, 2247, 1295, 2540, 2471, 1452, 1382, 3210, 335, 1623, 1584, 1249, 954, 88, 1171, 2163, 851, 1195, 2071, 1269, 121, 2415, 1799, 3016, 917, 1659, 158, 231, 416, 117, 2562, 12, 88, 1433, 879, 1166, 884, 3133, 2147, 2039], [2271, 230, 1006, 3028, 1294, 724, 986, 579, 956, 1950, 413, 1686, 281, 1401, 3037, 892, 392, 2394, 2259, 3083, 2181, 2601, 1089, 2263, 2088, 1850, 1037, 84, 488, 1919, 1917, 218, 2996, 1822, 104, 700, 1887, 1139, 2333, 1935, 2619, 223, 2036, 997, 583, 861, 1682, 3171, 2192, 1862, 847, 2573, 1319, 571, 1270, 2048, 2464, 89, 2028, 1239, 1324, 155, 3142, 920, 552, 1401, 3318, 1764, 2750, 445, 2111, 374, 2540, 1644, 2934, 2757, 2848, 1616, 2205, 537, 102, 2501, 591, 514, 2559, 881, 21, 3060, 1093, 1730, 2068, 1055, 2962, 1668, 3314, 1264, 2169, 2915, 1829, 1282, 499, 3241, 1663, 2318, 2401, 1208, 314, 1495, 2705, 1971, 766, 596, 2543, 943, 1701, 2866, 903, 2611, 2997, 1646, 1369, 1593, 817, 2368, 1955, 398, 2318, 231, 2032, 417, 395, 1175, 1298, 1627, 2565, 728, 1643, 310, 2896, 2175, 2508, 968, 1289, 1346, 3046, 765, 3027, 810, 1298, 2880, 2969, 2490, 846, 2373, 340, 624, 1996, 864, 2973, 1603, 2299, 2633, 787, 1015, 1102, 2182, 2817, 1238, 1610, 2315, 28, 546, 804, 1846, 1120, 292, 1022, 2511, 1135, 2848, 3247, 1596, 2510, 451, 115, 797, 570, 567, 2795, 111, 1891, 1183, 827, 1252, 1452, 2230, 1682, 2314, 3140, 965, 2515, 1540, 2546, 2178, 502, 749, 3109, 480, 2765, 1317, 1947, 1016, 899, 1811, 517, 431, 1419, 464, 620, 880, 486, 901, 3101, 1710, 3167, 1540, 3015, 706, 2999, 31, 1862, 1052, 2016, 1410, 2746, 1305, 812, 2694, 2056, 1777, 1149, 1817, 134, 144, 967, 4, 3142, 1919, 281, 2680, 2465, 2122, 1654, 2006, 3153, 2197], [376, 1719, 1024, 2535, 9, 310, 820, 1549, 681, 558, 1868, 1619, 3129, 667, 1773, 2251, 2282, 597, 3153, 965, 3252, 570, 986, 1843, 2876, 1852, 330, 2692, 1698, 1761, 2771, 473, 3008, 193, 1916, 822, 378, 11, 1469, 2309, 1592, 2415, 514, 1417, 2205, 181, 2936, 2740, 3181, 2936, 196, 1409, 237, 1263, 2701, 872, 1810, 3225, 754, 2575, 374, 2608, 952, 226, 1737, 2540, 1567, 55, 2133, 820, 1313, 1181, 1593, 1492, 2597, 1760, 214, 308, 1934, 3224, 1837, 1585, 777, 3071, 1828, 1507, 117, 222, 2348, 416, 76, 3307, 3211, 3220, 1361, 2724, 898, 2848, 2291, 3128, 122, 666, 2519, 1732, 1851, 130, 2713, 1893, 3178, 3038, 1228, 1085, 50, 2596, 1101, 2151, 598, 2753, 1947, 1262, 2542, 530, 57, 2533, 1050, 123, 2318, 577, 2406, 2980, 847, 3213, 1181, 2454, 2843, 631, 3154, 288, 2088, 3208, 744, 2912, 1155, 1996, 1470, 1984, 2877, 3158, 144, 648, 1623, 1088, 2624, 1616, 778, 453, 1983, 989, 3066, 1210, 1142, 877, 791, 1308, 1700, 612, 540, 3147, 2147, 3288, 1416, 2479, 2554, 2494, 2050, 2286, 321, 1621, 487, 1002, 919, 805, 1467, 2796, 2339, 2340, 2847, 554, 2446, 611, 220, 925, 80, 320, 1630, 501, 426, 2344, 3178, 423, 1907, 2347, 662, 2479, 1059, 2696, 2538, 1739, 2114, 3253, 1966, 1467, 748, 985, 2820, 1503, 808, 637, 790, 2782, 2169, 1463, 1904, 311, 1458, 3173, 2455, 2436, 1398, 1587, 458, 593, 101, 2641, 634, 3138, 980, 277, 2731, 904, 1481, 83, 2503, 1800, 3074, 1891, 3035, 3157, 1500, 173, 1, 494, 2493, 144, 3172, 534]], [[3256, 1412, 1157, 2871, 2908, 2935, 2445, 2517, 2735, 1116, 1788, 3322, 2762, 3222, 2304, 292, 903, 2013, 3311, 3298, 970, 2952, 861, 1193, 2507, 1395, 3081, 2610, 1985, 86, 2877, 1762, 2574, 936, 3218, 774, 1892, 642, 717, 1856, 2079, 527, 536, 311, 414, 2034, 997, 705, 1804, 1077, 2754, 2377, 100, 2461, 3083, 2501, 2432, 3044, 2423, 1772, 142, 2924, 2229, 762, 2759, 935, 2169, 1635, 2681, 2744, 1428, 65, 1416, 1752, 796, 276, 1508, 94, 601, 2459, 1748, 2994, 786, 428, 3036, 2504, 723, 782, 1581, 2046, 713, 223, 3094, 2883, 1874, 418, 1198, 947, 557, 2059, 2430, 372, 2942, 1938, 1922, 3085, 795, 2261, 145, 1857, 627, 679, 1909, 1955, 529, 1922, 2364, 226, 1616, 738, 1419, 674, 569, 1850, 1690, 2288, 2886, 2360, 3230, 2850, 2808, 2531, 2421, 2109, 2868, 319, 320, 2518, 1619, 3292, 3179, 2573, 3243, 1720, 1469, 1968, 2157, 857, 1025, 3282, 3259, 2696, 2710, 3124, 982, 859, 2631, 2495, 2897, 2786, 940, 3092, 672, 2539, 3243, 1079, 2257, 434, 2103, 1895, 42, 2653, 3058, 1442, 500, 1732, 298, 1094, 127, 558, 2647, 2609, 1596, 1400, 3142, 1634, 1668, 1326, 1682, 2095, 2939, 2326, 1460, 2679, 122, 2549, 2562, 182, 425, 2006, 82, 2252, 2949, 2174, 2420, 1099, 1024, 424, 2839, 2363, 1480, 2945, 684, 2461, 1981, 2580, 1770, 17, 3251, 1566, 441, 1348, 61, 3189, 2123, 2455, 740, 258, 2773, 11, 1548, 2899, 22, 592, 200, 778, 205, 400, 209, 1526, 2336, 1572, 2424, 537, 3232, 1320, 1035, 1657, 2100, 2873, 125, 1719, 2029, 2009, 1317, 2534], [41, 2034, 256, 1285, 2151, 2067, 834, 2772, 2864, 2380, 3041, 650, 2684, 1687, 2070, 664, 1396, 54, 1558, 1858, 1655, 2529, 731, 171, 1066, 2956, 769, 1889, 2023, 2924, 3020, 3059, 2573, 679, 307, 2741, 244, 576, 774, 683, 1923, 965, 265, 948, 1048, 144, 1044, 1889, 2668, 91, 2877, 982, 1510, 2511, 2868, 1421, 2853, 360, 1066, 2800, 178, 293, 492, 1584, 2456, 2067, 3202, 552, 1032, 2693, 2245, 2361, 3181, 1015, 2903, 529, 3148, 289, 2527, 2146, 537, 3096, 1802, 1849, 1589, 520, 2254, 1125, 1782, 2380, 1335, 1610, 93, 3182, 1628, 82, 3058, 448, 2921, 2190, 476, 35, 1979, 1995, 1330, 1529, 922, 2558, 330, 439, 2626, 1162, 430, 682, 2990, 2644, 2288, 2702, 777, 357, 1091, 3083, 2344, 2753, 972, 2831, 1638, 2527, 2257, 614, 3029, 320, 1685, 1402, 2337, 1816, 498, 2384, 2627, 2739, 1811, 2798, 1517, 3219, 945, 2048, 951, 3043, 767, 366, 2951, 2092, 2022, 1812, 2132, 775, 3075, 3123, 1446, 1355, 1476, 1346, 3200, 3224, 2416, 1049, 1429, 2278, 260, 1510, 2027, 555, 3284, 1502, 1628, 829, 556, 332, 928, 1065, 542, 1527, 1000, 1154, 3271, 1168, 274, 766, 411, 2841, 583, 387, 1050, 1189, 829, 1996, 361, 267, 826, 1635, 647, 3056, 1728, 538, 960, 1568, 3116, 264, 836, 3168, 3144, 2675, 75, 1145, 1467, 962, 2590, 2501, 149, 619, 2218, 1831, 2576, 2960, 3008, 1772, 1341, 2024, 2952, 821, 2780, 3257, 1993, 2869, 1324, 1508, 1002, 1698, 1999, 2538, 2299, 2023, 2695, 3327, 2251, 2527, 262, 3018, 789, 986, 2343, 1497, 1024, 2006, 1576, 228], [1264, 1853, 982, 2897, 1684, 690, 1172, 1929, 1182, 3159, 3154, 1368, 1617, 1250, 612, 93, 768, 2698, 569, 1787, 3097, 2310, 1119, 1412, 307, 2318, 85, 307, 2429, 1069, 3238, 920, 1213, 1841, 1752, 1767, 2365, 676, 2149, 503, 2194, 2359, 890, 1510, 1918, 3212, 1859, 150, 2758, 262, 2057, 3228, 1138, 2854, 1227, 851, 3328, 1438, 1840, 1705, 492, 276, 2365, 1427, 3235, 982, 882, 2752, 894, 1869, 9, 2275, 2468, 1090, 2538, 899, 1845, 2263, 1970, 1521, 1495, 2202, 1582, 222, 1566, 2721, 2368, 1968, 3277, 1674, 1789, 1305, 295, 1487, 501, 1329, 478, 1755, 33, 3178, 2591, 1531, 564, 2475, 2216, 2993, 673, 2616, 2858, 59, 3164, 383, 1217, 3251, 620, 2224, 2821, 1422, 3075, 1128, 2659, 687, 288, 1659, 115, 56, 2523, 242, 2252, 3238, 524, 2490, 2194, 699, 3301, 1566, 2334, 1649, 1198, 3071, 2620, 457, 2365, 795, 335, 1117, 1779, 689, 2771, 46, 1565, 585, 3255, 667, 2094, 1608, 166, 2541, 2497, 1421, 1822, 1990, 229, 2733, 2473, 2004, 1479, 245, 3230, 1609, 2243, 2167, 1504, 2946, 1739, 644, 2403, 2029, 537, 2803, 1610, 593, 2693, 2051, 3027, 314, 737, 697, 166, 3165, 1824, 3216, 64, 1534, 3184, 1012, 1101, 1931, 3298, 411, 3007, 1690, 901, 2191, 739, 953, 2270, 1634, 2873, 1871, 1789, 2677, 1546, 3046, 1429, 469, 1386, 2222, 2229, 1022, 995, 759, 1966, 581, 2820, 973, 416, 2070, 2039, 23, 3164, 1936, 997, 359, 2210, 3327, 3170, 1512, 2912, 2714, 1959, 1431, 1429, 862, 2424, 1198, 2660, 895, 1663, 2420, 2969, 1724, 2479, 2261, 855, 577], [887, 1074, 3018, 81, 1837, 539, 1344, 2879, 2345, 2253, 1725, 1117, 2547, 1307, 3039, 644, 569, 1530, 3152, 3203, 2617, 594, 100, 3251, 1692, 1615, 1624, 211, 3016, 1711, 2315, 2555, 2174, 2397, 1888, 301, 1863, 2502, 3111, 990, 2551, 1333, 3220, 3059, 334, 920, 742, 860, 977, 1518, 432, 1884, 3056, 1457, 2237, 2070, 647, 2503, 1133, 48, 1923, 135, 3110, 3301, 1045, 752, 2466, 3055, 6, 505, 2015, 2858, 2846, 2470, 2887, 1147, 817, 277, 71, 26, 2017, 104, 3231, 2363, 1968, 2968, 3052, 2882, 1247, 2945, 3142, 3090, 2552, 3232, 1585, 863, 793, 808, 944, 514, 2259, 343, 452, 3165, 2686, 1413, 412, 59, 3274, 1230, 2528, 2772, 1233, 2672, 2127, 773, 864, 1860, 1898, 1931, 838, 162, 673, 3152, 1994, 2406, 2283, 2076, 3008, 615, 112, 1365, 2030, 3308, 1574, 2361, 93, 1701, 2380, 1890, 3152, 1971, 1573, 2460, 191, 2241, 674, 3111, 1657, 1557, 982, 1777, 2589, 633, 499, 1273, 2809, 533, 1732, 1129, 563, 33, 1882, 371, 2383, 423, 1643, 376, 1286, 2727, 17, 1822, 2652, 1239, 2159, 2859, 2359, 3048, 2656, 3184, 940, 1203, 719, 88, 1272, 483, 717, 789, 238, 1387, 1330, 1999, 2229, 1214, 1673, 1435, 3057, 1092, 1906, 2316, 960, 830, 1503, 1066, 1051, 340, 1598, 681, 1459, 970, 1421, 3097, 2004, 3258, 2411, 627, 1745, 585, 1316, 649, 1374, 2625, 2042, 2801, 793, 1156, 2998, 3026, 1532, 1216, 1831, 1077, 2314, 2736, 1672, 2440, 819, 2769, 751, 2337, 2606, 1808, 108, 3200, 2220, 1366, 778, 406, 847, 2422, 570, 3207, 705, 1727, 2319, 1485]], [[2956, 2744, 2646, 1052, 2049, 587, 782, 1688, 47, 347, 1187, 2560, 3010, 2052, 580, 2356, 1623, 98, 1400, 960, 2216, 1701, 667, 3230, 474, 3145, 2220, 3283, 3025, 2462, 2293, 2593, 1746, 444, 3186, 2338, 1372, 32, 598, 1387, 169, 1435, 2638, 1518, 1094, 2023, 2598, 2795, 1853, 273, 241, 1158, 1844, 2151, 775, 1477, 2683, 2007, 3143, 562, 3002, 2787, 2843, 887, 2685, 2994, 903, 2383, 1956, 2741, 870, 3128, 1322, 658, 2565, 300, 2834, 2250, 194, 2023, 2595, 2220, 2241, 1336, 661, 1583, 2866, 437, 2487, 2439, 2826, 491, 1575, 1139, 1499, 2996, 2635, 1122, 2239, 237, 2416, 2681, 384, 2224, 3088, 2225, 2121, 1815, 916, 3294, 1581, 2158, 999, 2320, 2150, 1126, 681, 1987, 1384, 641, 3062, 1519, 1166, 2074, 859, 2588, 616, 1220, 1586, 450, 1537, 1400, 2887, 3079, 2944, 1810, 2175, 2691, 1316, 332, 73, 1421, 55, 2032, 254, 1352, 2605, 637, 649, 3220, 1217, 2319, 3061, 535, 2298, 585, 3132, 1129, 1178, 2871, 81, 1808, 2410, 2987, 1663, 1022, 2431, 3049, 625, 1888, 2510, 1925, 900, 2652, 97, 1084, 374, 250, 2444, 3079, 2087, 507, 3115, 1133, 977, 565, 1115, 107, 3030, 2384, 836, 2536, 90, 2678, 518, 1892, 2408, 167, 1662, 320, 2116, 2375, 859, 2159, 2706, 1424, 319, 1316, 2517, 2150, 577, 407, 168, 910, 107, 535, 249, 3112, 388, 839, 510, 2423, 1769, 2288, 2205, 347, 1782, 1000, 2316, 1271, 728, 279, 3327, 542, 1500, 2144, 2622, 1700, 440, 217, 1232, 302, 1187, 206, 1090, 2052, 1927, 407, 527, 3324, 1627, 3151, 1080, 2646, 1280, 2663], [1938, 2889, 762, 3213, 3128, 3238, 3240, 141, 978, 3260, 3073, 2367, 739, 2139, 2363, 1280, 128, 1091, 2084, 52, 3113, 841, 488, 2846, 1234, 940, 981, 1561, 2118, 1290, 2368, 2210, 1683, 1659, 1208, 1072, 1810, 1917, 886, 1873, 1276, 3101, 796, 1854, 613, 814, 1502, 2709, 1534, 357, 1250, 430, 190, 491, 2734, 1635, 1683, 1128, 567, 1347, 592, 1075, 249, 3011, 645, 1917, 2360, 2703, 537, 458, 3076, 1970, 2132, 2019, 2729, 1581, 362, 3230, 2948, 3012, 2422, 974, 440, 2249, 816, 3290, 2347, 2334, 3037, 1572, 1581, 2208, 561, 553, 1830, 1234, 3249, 1115, 838, 36, 2338, 2738, 2080, 3249, 2055, 844, 1813, 3058, 1166, 1112, 2769, 1860, 2391, 2632, 1583, 1527, 1092, 529, 2270, 382, 761, 3053, 2024, 1236, 2909, 3210, 2843, 603, 2655, 2468, 1039, 1251, 1161, 918, 2686, 451, 985, 3229, 2735, 974, 819, 1687, 2820, 61, 743, 887, 2358, 2664, 2544, 1465, 2609, 3175, 1414, 755, 2810, 3030, 1223, 774, 2454, 2843, 2800, 1722, 2966, 1738, 729, 1163, 485, 953, 2028, 1074, 434, 153, 97, 2185, 951, 1683, 1366, 2291, 907, 605, 1722, 1373, 1197, 571, 2974, 2349, 2832, 1674, 2740, 151, 3000, 2163, 727, 1317, 2949, 3034, 2810, 1760, 2929, 3317, 1614, 1390, 1039, 3143, 1137, 2475, 3018, 2063, 2717, 3270, 1995, 224, 2902, 2393, 21, 332, 2490, 1538, 3028, 2626, 2144, 3170, 2540, 1635, 2423, 214, 3165, 3316, 2596, 974, 2135, 804, 1282, 714, 904, 2408, 1086, 374, 722, 2173, 3248, 3161, 600, 963, 946, 327, 868, 1306, 71, 566, 1891, 2864, 100, 970, 536, 1156], [1079, 835, 3192, 2207, 1405, 2431, 2088, 2296, 1745, 1733, 62, 3022, 2033, 1702, 2802, 1572, 1967, 2146, 88, 1099, 3180, 2543, 3281, 415, 2252, 1666, 2565, 1977, 1484, 2383, 191, 2587, 711, 975, 2854, 474, 1083, 2241, 1488, 1336, 473, 2322, 2189, 2977, 73, 1623, 2933, 3089, 1499, 1916, 1261, 1038, 1780, 1375, 417, 2103, 3154, 3212, 1661, 1024, 3249, 2405, 2613, 1845, 769, 1334, 438, 2633, 2698, 803, 164, 2912, 2342, 834, 710, 543, 2478, 1015, 806, 913, 2278, 1453, 543, 1093, 375, 2411, 2800, 582, 2010, 886, 3246, 2816, 96, 2696, 3312, 551, 73, 2224, 1658, 349, 1595, 1965, 9, 814, 1678, 3034, 1168, 1472, 2642, 840, 148, 2025, 1438, 331, 1622, 475, 775, 3311, 466, 21, 941, 1834, 205, 710, 859, 2954, 915, 143, 246, 71, 3325, 1116, 3020, 628, 2015, 637, 2070, 1517, 1728, 2834, 1785, 3001, 2437, 2904, 1174, 1740, 1339, 1089, 1185, 2107, 814, 2432, 1553, 2091, 880, 2052, 1886, 2821, 1352, 2545, 2699, 3137, 842, 2402, 186, 764, 1538, 1857, 1140, 906, 1861, 2120, 463, 854, 58, 368, 1514, 228, 2193, 197, 1535, 2356, 3140, 2935, 376, 1160, 2248, 275, 1532, 1900, 2296, 2437, 2794, 178, 249, 216, 2806, 2043, 993, 1858, 1552, 372, 108, 2362, 2346, 1136, 675, 2095, 1456, 3064, 2680, 2244, 136, 920, 1214, 380, 2802, 1041, 693, 2446, 951, 2764, 355, 2531, 707, 641, 2519, 3144, 674, 1104, 509, 3150, 150, 1889, 858, 70, 1545, 712, 4, 1827, 2627, 1988, 3120, 1808, 2328, 1049, 3071, 455, 3278, 1876, 1446, 1090, 2901, 2976, 1448, 1925], [2192, 2394, 3045, 1041, 2255, 2164, 2168, 1421, 708, 1046, 2571, 2080, 391, 2271, 1998, 772, 251, 1508, 1377, 1610, 1582, 169, 1903, 1253, 2187, 2718, 2638, 2088, 3253, 332, 2647, 2457, 1904, 2140, 1655, 2071, 2489, 3115, 861, 1395, 219, 49, 67, 1335, 983, 820, 1354, 1304, 2208, 1907, 2364, 2977, 885, 2566, 1014, 1253, 414, 1961, 2695, 426, 182, 1505, 1354, 2693, 2580, 3183, 253, 3308, 895, 1761, 983, 1709, 40, 2188, 216, 2172, 1369, 1639, 109, 1916, 718, 177, 1754, 1518, 2487, 1611, 670, 297, 123, 159, 710, 2589, 296, 2863, 1572, 2895, 312, 2306, 2473, 44, 3157, 1761, 1416, 1158, 887, 1745, 1762, 272, 560, 2794, 3228, 373, 715, 2745, 645, 2513, 2256, 903, 1928, 1603, 1365, 110, 2754, 2264, 3062, 3091, 3099, 3234, 166, 49, 459, 483, 1835, 2884, 395, 802, 2690, 1005, 2556, 1318, 1428, 790, 1200, 2239, 430, 1310, 952, 2798, 1767, 3266, 2216, 368, 1127, 899, 2853, 1394, 2395, 561, 2213, 782, 1498, 1533, 364, 2335, 1646, 1239, 931, 2893, 2365, 3123, 346, 1194, 868, 115, 103, 1420, 1851, 938, 1192, 1571, 2394, 2010, 2475, 1281, 124, 1042, 2064, 1391, 3059, 2824, 815, 29, 2758, 2435, 1058, 968, 1324, 1141, 3231, 2260, 1515, 2698, 2040, 1948, 986, 2474, 2428, 1270, 3133, 1347, 1570, 3222, 2877, 2574, 712, 1697, 58, 2862, 2634, 631, 2186, 1915, 1702, 1788, 1987, 3289, 3184, 2398, 726, 775, 1612, 1184, 1064, 3171, 2943, 2840, 3306, 3306, 430, 1675, 263, 956, 7, 2571, 1364, 1553, 124, 2442, 498, 2560, 2977, 944, 10, 268, 1759, 1297]]] r: [[1, 3327, 1, 0, 0, 1, 0, 0, 1, 2, 0, 3328, 2, 1, 0, 1, 2, 1, 1, 1, 0, 0, 3328, 1, 1, 0, 3328, 0, 0, 3328, 0, 3327, 0, 1, 0, 1, 3328, 0, 0, 1, 0, 0, 2, 0, 0, 3327, 1, 1, 0, 3328, 1, 0, 0, 3327, 3328, 1, 3328, 3327, 0, 3328, 1, 0, 0, 3328, 0, 0, 1, 3328, 1, 1, 1, 0, 1, 3328, 0, 1, 0, 0, 1, 3328, 3328, 3328, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1, 0, 0, 3328, 0, 1, 0, 3328, 0, 1, 0, 3328, 1, 3328, 3327, 2, 3328, 0, 0, 0, 3328, 2, 3328, 1, 1, 2, 1, 0, 0, 0, 0, 0, 1, 1, 1, 3327, 3328, 0, 3328, 2, 3328, 2, 0, 1, 1, 1, 3327, 0, 3328, 1, 1, 1, 1, 3327, 0, 1, 0, 0, 0, 1, 1, 0, 3328, 1, 1, 1, 1, 1, 0, 1, 3328, 0, 3328, 1, 2, 0, 3328, 3328, 1, 1, 0, 3328, 0, 0, 3327, 0, 0, 3328, 3327, 0, 1, 1, 1, 3327, 1, 3328, 3328, 3328, 1, 0, 0, 3328, 0, 3328, 0, 3328, 3328, 2, 2, 1, 3328, 0, 0, 0, 1, 3328, 3328, 0, 3328, 0, 0, 0, 3328, 3328, 2, 3327, 2, 2, 1, 3328, 1, 3328, 0, 1, 0, 0, 1, 3328, 1, 0, 1, 3328, 1, 0, 0, 0, 1, 1, 0, 3328, 2, 1, 0, 0, 3327, 0, 0, 0, 3328, 0, 3328, 3327, 3327, 1, 0], [0, 0, 1, 1, 0, 1, 0, 3328, 3328, 1, 3327, 3328, 0, 0, 1, 0, 3328, 3327, 3328, 3328, 1, 1, 0, 0, 3327, 1, 3328, 3328, 3328, 3328, 1, 3328, 0, 0, 1, 0, 1, 1, 0, 0, 0, 1, 3328, 1, 0, 1, 3328, 0, 1, 3328, 0, 3328, 1, 2, 1, 3328, 3327, 3327, 0, 1, 3327, 0, 0, 0, 0, 1, 1, 0, 3328, 0, 1, 1, 0, 0, 3328, 1, 3328, 0, 3328, 3328, 0, 0, 0, 1, 1, 0, 2, 3328, 1, 1, 0, 3328, 0, 3328, 1, 0, 3328, 3328, 3328, 3328, 1, 3328, 0, 3328, 0, 3328, 3328, 0, 0, 0, 3328, 1, 3328, 3327, 3328, 1, 3328, 0, 1, 3328, 3328, 0, 0, 3328, 3328, 1, 3328, 3328, 1, 3328, 1, 0, 3328, 3328, 3328, 3328, 1, 0, 1, 0, 1, 3328, 0, 0, 0, 0, 1, 0, 1, 3328, 3328, 3328, 3327, 0, 3328, 0, 3328, 0, 3327, 1, 0, 3328, 0, 1, 0, 0, 0, 1, 3327, 0, 0, 1, 3328, 0, 1, 3327, 1, 3328, 2, 3328, 1, 0, 2, 3328, 1, 0, 3328, 1, 1, 0, 3328, 2, 3328, 1, 0, 1, 3328, 3328, 0, 0, 1, 1, 0, 1, 3328, 0, 2, 1, 3328, 0, 0, 0, 0, 2, 0, 0, 2, 0, 2, 1, 1, 1, 1, 1, 3328, 0, 0, 1, 1, 0, 1, 1, 0, 0, 1, 0, 0, 3328, 0, 3328, 3328, 0, 0, 1, 3327, 3328, 1, 2, 2, 0, 0, 0, 1, 3328, 1, 0], [2, 1, 3328, 3327, 0, 0, 1, 1, 0, 1, 0, 3328, 0, 3328, 3327, 0, 1, 0, 3328, 1, 1, 0, 2, 0, 3327, 3328, 1, 2, 3328, 3328, 1, 1, 1, 3328, 1, 0, 0, 0, 0, 0, 2, 3327, 3327, 0, 1, 0, 1, 1, 1, 1, 3328, 0, 0, 3328, 2, 0, 1, 0, 1, 0, 0, 1, 0, 3328, 3328, 1, 3328, 0, 1, 2, 0, 0, 3328, 1, 0, 3328, 1, 2, 1, 0, 3327, 1, 1, 1, 3327, 0, 2, 3328, 0, 0, 3327, 0, 0, 1, 1, 3328, 3328, 0, 0, 3327, 3327, 1, 0, 2, 0, 3327, 0, 3328, 3327, 3328, 0, 1, 3328, 3328, 3328, 0, 0, 3328, 0, 3328, 0, 0, 0, 0, 2, 1, 3328, 3328, 1, 0, 3328, 1, 0, 3328, 2, 1, 1, 0, 1, 0, 3328, 0, 3327, 2, 3328, 2, 2, 3328, 3328, 0, 1, 1, 1, 1, 3328, 3328, 1, 3327, 0, 2, 0, 0, 0, 3327, 0, 0, 3328, 3328, 2, 0, 0, 3327, 3328, 0, 0, 1, 0, 1, 3328, 3328, 0, 0, 3328, 3328, 0, 3328, 1, 0, 1, 3328, 0, 3328, 3328, 0, 1, 3327, 0, 0, 0, 1, 1, 0, 1, 0, 0, 0, 1, 0, 3328, 1, 3328, 3328, 3328, 1, 3328, 0, 0, 0, 1, 1, 3328, 0, 0, 0, 3327, 1, 3328, 3327, 3328, 0, 0, 1, 2, 1, 0, 1, 1, 0, 0, 1, 0, 0, 0, 3327, 0, 1, 1, 3328, 1, 1, 0, 1, 0, 0, 3328, 0], [0, 0, 0, 0, 3328, 3328, 1, 3328, 3328, 1, 3328, 3328, 3328, 3328, 1, 0, 1, 3328, 2, 0, 0, 1, 3328, 1, 0, 3327, 2, 3328, 2, 0, 0, 3328, 3328, 0, 0, 3328, 3327, 3327, 1, 2, 0, 1, 2, 3328, 0, 0, 0, 0, 0, 0, 0, 0, 3328, 1, 1, 0, 1, 3328, 3328, 2, 0, 3328, 2, 0, 0, 2, 3327, 0, 0, 3327, 3328, 0, 0, 0, 0, 3327, 1, 0, 3327, 3328, 2, 3328, 3327, 1, 3328, 0, 3328, 0, 1, 1, 3328, 2, 1, 1, 3327, 0, 1, 0, 0, 0, 3328, 3328, 3327, 3328, 0, 1, 1, 1, 3327, 2, 1, 3328, 0, 3328, 1, 0, 2, 3328, 0, 3328, 0, 3328, 3327, 3327, 0, 0, 0, 0, 3328, 0, 1, 0, 0, 3328, 1, 0, 3328, 3327, 3328, 3328, 3328, 1, 2, 3328, 1, 3328, 3328, 0, 1, 3328, 3328, 1, 3328, 1, 0, 3328, 0, 0, 3327, 0, 0, 3328, 2, 1, 3328, 1, 1, 0, 3327, 3328, 3328, 1, 0, 3328, 1, 0, 3328, 1, 0, 0, 0, 1, 3328, 0, 3328, 0, 1, 3328, 3328, 3328, 3328, 0, 1, 1, 0, 0, 0, 3328, 0, 1, 0, 1, 2, 3328, 3328, 0, 1, 3328, 3327, 2, 0, 1, 1, 2, 1, 0, 0, 0, 0, 0, 1, 3328, 0, 1, 3328, 2, 0, 0, 1, 2, 1, 3327, 2, 1, 1, 0, 3328, 3327, 0, 3328, 1, 0, 0, 3328, 0, 1, 0, 3328, 2, 1, 0, 3327, 3328, 0, 0, 2]] e1: [[3327, 0, 3328, 0, 0, 0, 0, 2, 3327, 0, 3328, 3328, 0, 0, 0, 3327, 1, 0, 1, 0, 2, 3328, 1, 0, 3328, 1, 3328, 1, 1, 3328, 0, 3328, 1, 3327, 3328, 0, 1, 1, 1, 0, 2, 3328, 2, 3328, 1, 3328, 2, 2, 0, 1, 3328, 0, 3328, 0, 1, 3328, 0, 0, 3328, 1, 3328, 3328, 0, 0, 0, 3328, 3328, 0, 0, 0, 1, 3327, 1, 1, 0, 0, 1, 1, 3328, 0, 3328, 3327, 0, 2, 1, 1, 3328, 1, 1, 3328, 1, 0, 1, 1, 0, 0, 0, 0, 3327, 1, 3328, 0, 1, 3328, 0, 0, 0, 1, 1, 1, 0, 0, 1, 3327, 1, 0, 0, 3328, 0, 3328, 3328, 1, 3328, 0, 1, 1, 1, 2, 1, 3328, 3327, 3328, 0, 0, 1, 0, 0, 3328, 1, 0, 3328, 3328, 2, 3328, 0, 1, 3327, 1, 3328, 3328, 3328, 2, 3328, 3328, 2, 0, 1, 0, 0, 0, 0, 1, 1, 0, 0, 3327, 3328, 2, 0, 0, 0, 0, 3328, 3328, 1, 0, 0, 0, 2, 3327, 0, 1, 1, 3328, 0, 3327, 1, 1, 3327, 1, 0, 1, 0, 0, 3328, 0, 1, 3328, 2, 0, 3328, 3328, 3328, 0, 0, 3328, 3327, 0, 2, 0, 2, 1, 3327, 0, 0, 0, 0, 0, 1, 3328, 0, 3327, 3327, 0, 3328, 3328, 3327, 0, 3328, 0, 0, 1, 3328, 3328, 3328, 1, 1, 3328, 0, 1, 0, 0, 3328, 3328, 0, 3328, 3328, 0, 3328, 0, 3328, 1, 0, 0, 3328, 0], [1, 3328, 0, 0, 3328, 0, 0, 0, 3328, 0, 1, 0, 1, 1, 1, 0, 0, 1, 3328, 0, 0, 0, 2, 3328, 0, 1, 0, 2, 0, 1, 0, 1, 3327, 0, 1, 1, 0, 3328, 1, 3328, 1, 3327, 0, 1, 3327, 3328, 3328, 1, 2, 1, 1, 1, 3328, 3328, 3327, 1, 0, 0, 3327, 3327, 0, 3328, 0, 0, 3328, 3328, 3328, 0, 3328, 0, 3328, 1, 3328, 3328, 2, 0, 3328, 1, 0, 1, 1, 0, 1, 2, 3328, 3327, 2, 1, 3328, 0, 0, 0, 0, 3328, 0, 3328, 1, 1, 0, 3328, 3327, 0, 3328, 1, 0, 3328, 3327, 1, 0, 0, 2, 1, 0, 0, 1, 3327, 1, 2, 3328, 1, 3328, 1, 0, 0, 0, 3328, 0, 3327, 0, 3328, 3328, 3328, 3328, 0, 0, 0, 1, 3328, 2, 3328, 1, 2, 3328, 3328, 1, 3328, 1, 3328, 1, 0, 3328, 0, 0, 1, 3328, 3328, 3328, 1, 1, 0, 3328, 3328, 3328, 3328, 0, 3328, 3328, 3328, 0, 2, 0, 0, 3328, 3327, 2, 0, 3328, 1, 3327, 0, 3328, 3328, 0, 3328, 0, 2, 3328, 0, 3328, 1, 0, 1, 0, 3328, 3328, 2, 2, 0, 3327, 1, 2, 0, 1, 0, 0, 1, 2, 3328, 0, 1, 0, 0, 1, 3327, 0, 1, 0, 1, 0, 0, 3328, 3328, 3327, 0, 3328, 2, 1, 1, 3328, 3328, 1, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 3328, 0, 1, 0, 2, 1, 3328, 3328, 0, 0, 1, 0, 0, 0, 1], [2, 3328, 3328, 0, 0, 1, 3328, 3328, 3328, 0, 3328, 2, 1, 1, 0, 0, 1, 0, 3328, 1, 0, 0, 0, 1, 2, 2, 3328, 1, 1, 1, 0, 0, 3328, 1, 0, 3328, 0, 3328, 3328, 1, 1, 0, 1, 1, 0, 3328, 2, 0, 0, 0, 1, 3328, 0, 3328, 0, 3327, 0, 3327, 0, 1, 1, 3327, 3328, 3327, 1, 0, 1, 1, 0, 2, 1, 0, 3328, 1, 0, 3328, 3328, 0, 0, 3327, 2, 3327, 3328, 0, 0, 0, 2, 1, 3328, 3328, 3328, 3328, 3328, 0, 0, 2, 2, 1, 3328, 0, 0, 1, 1, 0, 0, 0, 2, 1, 0, 3328, 0, 0, 1, 3328, 1, 3328, 0, 1, 0, 0, 1, 3328, 3327, 3328, 0, 1, 3328, 0, 1, 1, 0, 0, 3328, 2, 0, 0, 1, 0, 0, 3328, 0, 1, 1, 0, 3328, 3328, 1, 1, 0, 0, 0, 3328, 0, 3328, 2, 0, 3328, 3328, 3328, 0, 1, 1, 0, 2, 0, 1, 3328, 0, 1, 2, 3328, 1, 1, 3328, 1, 0, 3328, 0, 0, 1, 3328, 1, 0, 1, 0, 1, 3328, 1, 3328, 1, 3328, 0, 3328, 1, 1, 2, 3328, 0, 3328, 1, 1, 1, 3328, 0, 0, 3327, 3328, 3328, 2, 3328, 2, 1, 0, 2, 0, 0, 0, 0, 1, 0, 0, 3328, 0, 3328, 0, 1, 3327, 0, 0, 1, 1, 3327, 0, 0, 1, 1, 0, 0, 1, 0, 3328, 0, 1, 0, 0, 3328, 1, 3328, 0, 1, 0, 0, 2, 3327, 2, 3328], [1, 1, 0, 3328, 1, 2, 3328, 3327, 0, 0, 0, 3327, 3328, 0, 3328, 1, 0, 0, 0, 3328, 3328, 0, 0, 0, 0, 0, 0, 3328, 0, 2, 0, 0, 1, 3328, 0, 1, 3328, 0, 3328, 1, 3328, 1, 1, 2, 3328, 1, 0, 2, 2, 0, 3327, 3327, 3328, 2, 1, 1, 0, 3328, 3328, 1, 3328, 3328, 2, 1, 0, 2, 2, 0, 0, 0, 1, 1, 0, 0, 3328, 0, 0, 1, 0, 0, 1, 1, 0, 3328, 0, 1, 0, 3328, 0, 1, 1, 3328, 3328, 3328, 3328, 3327, 0, 3327, 2, 0, 3328, 3328, 1, 3328, 1, 0, 3328, 3328, 0, 3328, 0, 0, 1, 0, 0, 3328, 3328, 0, 1, 2, 3328, 3328, 2, 0, 3328, 1, 1, 0, 0, 1, 3328, 0, 3327, 1, 3328, 1, 3328, 0, 1, 1, 0, 1, 1, 0, 3328, 1, 3328, 1, 1, 0, 3328, 3328, 1, 1, 3328, 0, 0, 3328, 3328, 3328, 0, 1, 0, 2, 1, 1, 2, 1, 1, 0, 0, 0, 1, 3328, 1, 1, 1, 2, 0, 0, 3327, 0, 0, 0, 1, 3327, 0, 2, 3327, 3328, 1, 0, 3328, 3328, 3327, 0, 2, 0, 0, 0, 1, 3328, 1, 3328, 1, 1, 2, 3328, 0, 3328, 0, 0, 3328, 1, 0, 0, 1, 1, 1, 0, 1, 0, 0, 0, 3327, 0, 3328, 3328, 0, 3328, 3328, 0, 1, 3328, 0, 1, 0, 1, 0, 3327, 3328, 1, 3328, 0, 1, 3328, 3328, 0, 0, 0, 0, 1, 2, 2, 2, 0]] e2: [3328, 3328, 0, 2, 0, 0, 0, 0, 3327, 3328, 1, 1, 0, 3328, 2, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 2, 0, 3328, 2, 1, 0, 3328, 3328, 1, 2, 3328, 3328, 1, 0, 3328, 1, 2, 0, 1, 3328, 0, 3328, 1, 3328, 1, 3327, 3327, 0, 0, 0, 1, 3328, 0, 3328, 1, 0, 3328, 0, 1, 0, 3328, 3328, 3328, 3328, 2, 0, 0, 0, 3328, 3328, 0, 0, 0, 1, 3328, 0, 3328, 0, 2, 1, 1, 3327, 2, 0, 0, 2, 3328, 3328, 0, 3328, 3327, 1, 2, 0, 1, 1, 1, 1, 1, 0, 0, 0, 3328, 0, 2, 1, 0, 1, 3328, 3328, 0, 3328, 3328, 3327, 3328, 0, 3328, 0, 1, 3328, 3328, 1, 3328, 1, 0, 3328, 3328, 3328, 1, 0, 2, 0, 0, 0, 0, 3327, 1, 3328, 0, 2, 0, 3328, 3328, 0, 0, 3328, 0, 3328, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 2, 3328, 3328, 1, 3328, 0, 0, 2, 2, 0, 1, 0, 1, 1, 0, 0, 0, 1, 3328, 0, 1, 0, 3328, 3328, 3328, 3328, 3328, 0, 1, 1, 3327, 3328, 3328, 2, 0, 0, 3328, 0, 1, 3328, 0, 1, 3327, 0, 0, 3328, 1, 0, 0, 3328, 3327, 3328, 0, 0, 2, 1, 0, 0, 0, 0, 1, 1, 3327, 1, 1, 3328, 0, 1, 1, 1, 0, 0, 2, 1, 0, 1, 2, 0, 2, 3328, 0, 1, 3328, 3328, 3327, 3328, 0, 0, 3328, 0, 1, 1] rHat: [[1895, 1256, 3, 1874, 570, 1626, 984, 2228, 1975, 1271, 1874, 3151, 2407, 1664, 829, 837, 2011, 1836, 354, 22, 2574, 242, 1950, 2861, 422, 605, 2908, 1886, 3089, 1720, 850, 1391, 1683, 553, 60, 1104, 141, 2392, 2513, 1034, 1697, 3126, 2575, 990, 585, 2978, 2867, 906, 1388, 1830, 727, 569, 1339, 3, 35, 2751, 1124, 950, 1884, 1833, 894, 462, 382, 1856, 1831, 18, 1098, 664, 50, 2252, 1435, 1571, 1038, 456, 914, 1621, 2777, 485, 1985, 2933, 2707, 1244, 2281, 232, 3129, 3160, 2071, 2029, 38, 1456, 2487, 3315, 279, 847, 3032, 2373, 2099, 1161, 775, 290, 1763, 627, 233, 1197, 1314, 2189, 3129, 911, 2609, 2213, 3315, 20, 2409, 798, 1747, 3045, 560, 2377, 2821, 1903, 1233, 2035, 3143, 1506, 839, 2487, 204, 392, 1468, 1339, 1634, 2431, 1955, 3014, 2153, 1803, 732, 541, 530, 1944, 296, 1071, 1050, 3042, 1493, 1520, 465, 1266, 127, 219, 2566, 1483, 480, 2661, 845, 2882, 2498, 1842, 1212, 1217, 2029, 711, 1742, 950, 1819, 196, 791, 2569, 2207, 3100, 1883, 2760, 2133, 1975, 3001, 1120, 2061, 1317, 3295, 1679, 2575, 270, 650, 1020, 1841, 352, 46, 2659, 3077, 2593, 1978, 389, 1677, 1847, 1515, 1507, 1350, 1937, 1182, 1459, 2354, 3272, 1979, 2307, 520, 1133, 541, 1102, 838, 301, 2397, 1001, 3267, 2764, 1768, 544, 3121, 1160, 2344, 169, 2464, 1851, 142, 1810, 876, 874, 961, 147, 2578, 1359, 1511, 1869, 1887, 3328, 2213, 1855, 597, 1925, 278, 1676, 3121, 1837, 2860, 2532, 628, 1050, 2785, 687, 1170, 2906, 431, 2763, 1915, 3082, 1361, 3210], [2457, 3029, 949, 1672, 367, 997, 1951, 2482, 1619, 1181, 2198, 1891, 199, 2458, 757, 1297, 292, 3214, 1235, 15, 2977, 18, 1972, 2941, 1320, 454, 1932, 1981, 3219, 2728, 888, 2779, 2488, 1603, 360, 369, 1261, 1308, 3246, 1767, 1073, 416, 2752, 59, 951, 2852, 2481, 2709, 2187, 1330, 1651, 454, 57, 1531, 2072, 1117, 2897, 2985, 1470, 2352, 2893, 2160, 1108, 435, 697, 1725, 2070, 2925, 838, 877, 398, 2151, 753, 2895, 2648, 727, 1491, 782, 497, 1173, 1962, 1199, 648, 489, 1778, 199, 2526, 1285, 496, 1028, 846, 689, 89, 2127, 2490, 555, 2078, 2968, 2515, 95, 725, 3012, 779, 2917, 191, 60, 3297, 311, 2021, 3161, 895, 2885, 801, 3046, 2914, 2021, 12, 2490, 924, 2795, 92, 2643, 630, 2107, 1291, 2201, 1340, 2936, 1061, 810, 1302, 2217, 2893, 1693, 488, 2710, 1088, 273, 421, 2458, 2793, 195, 373, 3025, 189, 2486, 1842, 3267, 1175, 1778, 596, 484, 480, 2524, 1087, 2875, 2149, 1060, 1904, 3077, 1764, 852, 758, 2313, 3285, 2905, 788, 694, 241, 1333, 1958, 376, 2953, 2951, 2705, 3, 1155, 3322, 2101, 1415, 1118, 1009, 2734, 342, 2301, 1408, 626, 3012, 2295, 1846, 1913, 1999, 184, 1301, 296, 297, 2182, 3225, 654, 3215, 2422, 328, 1267, 582, 1386, 2902, 1732, 1121, 542, 1128, 495, 1054, 1552, 391, 553, 421, 2663, 2768, 1240, 2658, 2572, 479, 1446, 1289, 587, 436, 2096, 452, 1700, 642, 2628, 1044, 2716, 2457, 1934, 1518, 235, 2370, 2194, 1500, 2763, 1672, 1397, 1483, 1402, 2033, 2430, 1435, 2869, 2871, 2873, 1874, 708, 2737, 817, 2932], [3087, 2138, 1880, 2919, 1063, 302, 1, 3033, 2212, 2417, 1770, 830, 2173, 1019, 1782, 2840, 2339, 734, 2303, 421, 917, 2841, 1180, 2575, 2094, 797, 2356, 3048, 2471, 2926, 805, 397, 1850, 2934, 1468, 2111, 639, 2044, 588, 1790, 1995, 851, 1360, 449, 2948, 2876, 803, 3316, 1114, 2633, 1983, 505, 2017, 2868, 1187, 2667, 2356, 1540, 1686, 2466, 2116, 2200, 1465, 2131, 658, 2929, 3204, 1492, 1735, 1149, 1288, 3151, 714, 1685, 3031, 444, 664, 2819, 86, 2149, 2638, 509, 2564, 1848, 1124, 218, 2495, 2862, 431, 1498, 680, 171, 1014, 1754, 2296, 936, 872, 263, 3054, 2106, 2560, 1495, 1807, 3219, 975, 995, 1477, 1758, 1417, 1025, 136, 428, 1206, 1979, 349, 1283, 2556, 281, 1373, 3165, 1778, 260, 3299, 2793, 2687, 610, 3279, 29, 11, 1829, 2817, 672, 1331, 2768, 1722, 2700, 2134, 325, 3032, 1637, 2784, 2451, 1054, 2212, 335, 2390, 40, 210, 606, 3325, 2231, 2519, 539, 3112, 1406, 356, 1259, 1313, 2839, 1220, 2862, 3063, 2641, 3178, 2492, 1254, 744, 1427, 1278, 2631, 28, 2645, 2374, 1838, 1499, 1258, 2927, 2588, 2517, 2803, 1670, 909, 644, 2740, 1823, 1813, 1290, 2202, 3242, 33, 1038, 2582, 2474, 774, 1259, 291, 403, 2092, 333, 824, 2072, 192, 2602, 1489, 1005, 1471, 2752, 2463, 213, 203, 2834, 1970, 1748, 2506, 837, 387, 1298, 2467, 980, 1456, 199, 1623, 826, 2494, 2296, 2928, 3298, 32, 49, 1239, 1917, 2086, 2421, 1834, 2380, 1928, 445, 1990, 166, 676, 3, 2308, 3270, 2992, 830, 3121, 3298, 2950, 443, 868, 2191, 64, 491, 2825, 657, 704], [1723, 2076, 2569, 611, 2206, 800, 2025, 1086, 436, 2132, 1067, 3264, 2429, 3304, 2669, 1826, 251, 2504, 2919, 963, 244, 547, 695, 2239, 3252, 2611, 2828, 1663, 3228, 2228, 892, 1213, 1901, 2900, 2269, 1843, 1662, 2633, 1372, 490, 3148, 308, 236, 1862, 1927, 3091, 1024, 2622, 1517, 386, 861, 3194, 212, 1821, 902, 464, 1589, 487, 373, 216, 1072, 1802, 422, 797, 1708, 1125, 2194, 1550, 896, 2831, 2511, 1609, 2751, 3208, 1825, 3241, 714, 2711, 996, 1824, 2575, 31, 2940, 2250, 1990, 2936, 2432, 879, 1212, 794, 1481, 1342, 1517, 2512, 1091, 2200, 2008, 1905, 459, 1673, 2813, 2762, 2011, 64, 2398, 2636, 2554, 2469, 58, 1729, 627, 1673, 790, 1952, 90, 218, 16, 2133, 1183, 622, 2782, 1637, 597, 95, 2893, 1200, 2368, 2063, 2388, 1456, 639, 765, 1430, 2289, 969, 2459, 1083, 2658, 750, 433, 669, 2648, 1441, 3163, 1661, 2127, 541, 2436, 2380, 1703, 1948, 1491, 540, 829, 364, 2461, 1675, 2389, 1052, 1144, 2657, 344, 406, 1421, 335, 165, 3058, 142, 74, 2050, 774, 1420, 604, 2786, 2928, 477, 699, 1616, 553, 816, 1626, 821, 954, 1198, 2638, 623, 601, 2814, 2120, 272, 1790, 2623, 3264, 500, 2617, 3001, 740, 2774, 2819, 1614, 2403, 1904, 1448, 3058, 2054, 1214, 1328, 2793, 383, 2684, 2156, 2298, 2020, 3057, 379, 421, 1155, 1730, 1048, 377, 207, 2704, 3157, 708, 664, 1454, 2279, 215, 1749, 1234, 2377, 1315, 2755, 2017, 2403, 602, 1, 1526, 281, 618, 2243, 1730, 2396, 1819, 611, 2415, 3018, 1922, 966, 3308, 895, 3189, 2484, 3228, 364, 2389]] BHat * rHat: [[82, 2041, 2174, 3197, 1198, 59, 1197, 724, 722, 183, 1908, 3236, 1348, 3322, 147, 888, 1675, 1639, 228, 2865, 1500, 1884, 1180, 1297, 2251, 2484, 2135, 3169, 1146, 610, 2942, 2932, 2831, 2633, 428, 1384, 3155, 1682, 2699, 946, 1501, 804, 786, 2079, 954, 3242, 3195, 2968, 3071, 2, 2502, 1403, 338, 1282, 867, 2636, 3277, 474, 1238, 924, 1132, 1406, 1788, 3313, 1065, 1319, 2694, 1915, 3053, 106, 1409, 1664, 3328, 122, 329, 1776, 1480, 2284, 741, 1557, 478, 1924, 2182, 202, 2672, 2372, 1520, 2612, 2939, 1174, 2494, 2916, 2011, 3186, 2274, 1795, 2044, 215, 2806, 290, 2319, 2887, 1256, 2323, 392, 2625, 673, 2544, 1519, 2588, 3257, 3233, 2892, 2505, 3123, 580, 604, 879, 2118, 2090, 2535, 1477, 285, 2066, 2555, 2361, 2910, 2097, 498, 35, 108, 2468, 1624, 377, 0, 2519, 155, 2824, 1519, 939, 1746, 2378, 1338, 3282, 1578, 1483, 3283, 871, 1463, 1538, 968, 918, 1126, 1184, 1974, 739, 571, 2895, 245, 1666, 1430, 485, 574, 178, 2452, 2379, 2820, 3270, 1422, 1704, 622, 855, 2569, 2489, 2421, 2137, 3312, 1525, 52, 3286, 2494, 46, 499, 1146, 1661, 1923, 48, 1552, 69, 3193, 1446, 1015, 2550, 898, 3218, 528, 662, 2502, 904, 2250, 1614, 2300, 1220, 691, 2688, 261, 1868, 2408, 1899, 579, 38, 1235, 811, 2947, 1815, 882, 1194, 3134, 3244, 2463, 123, 2440, 183, 3223, 2638, 2617, 823, 1641, 2883, 267, 1488, 2846, 585, 1051, 839, 1750, 3168, 1975, 1896, 2000, 176, 2179, 1439, 2071, 470, 1044, 532, 2035, 1076, 907, 337, 467, 99, 356, 1260, 1036], [298, 1526, 142, 1986, 2985, 844, 2506, 390, 1487, 141, 845, 158, 555, 2913, 0, 482, 1123, 2714, 2716, 1852, 550, 1725, 1852, 1372, 3067, 955, 711, 2558, 654, 3105, 982, 1874, 2222, 2760, 2257, 2276, 597, 2661, 3059, 2634, 2210, 983, 1633, 1721, 2478, 322, 465, 3132, 1179, 434, 461, 2539, 601, 326, 1785, 502, 2981, 3081, 917, 2402, 1680, 472, 2128, 2107, 1216, 2390, 1783, 2839, 1922, 2393, 1673, 93, 3323, 848, 1086, 1501, 3121, 199, 793, 3171, 451, 962, 3070, 1357, 2656, 1624, 1592, 764, 2772, 1352, 577, 2675, 676, 3167, 1150, 1816, 124, 2235, 428, 1068, 425, 1190, 1013, 3192, 3143, 2710, 877, 772, 1167, 2408, 3298, 1007, 1335, 363, 1062, 2914, 2256, 3029, 797, 1221, 1261, 847, 227, 1048, 1977, 2577, 1092, 105, 1577, 1026, 1460, 2642, 1551, 1245, 323, 853, 1261, 993, 1488, 2670, 2731, 2904, 2127, 767, 2958, 192, 3157, 2357, 3275, 3146, 3121, 691, 889, 1734, 1159, 79, 2913, 361, 1733, 2236, 2261, 1616, 2574, 937, 1359, 2632, 1984, 2138, 1544, 3305, 1663, 2564, 1092, 368, 409, 2457, 1254, 3095, 675, 637, 429, 2170, 2007, 3147, 2088, 373, 1007, 946, 1204, 65, 3082, 629, 3246, 2266, 1811, 194, 1179, 1235, 2394, 1746, 143, 2450, 3319, 1631, 1880, 729, 983, 3030, 852, 2381, 1361, 1599, 2272, 1610, 523, 761, 2680, 223, 3322, 457, 324, 2743, 976, 391, 2680, 1389, 499, 2915, 1514, 812, 1659, 1601, 344, 1818, 494, 2935, 3064, 3082, 2173, 298, 3096, 2712, 759, 2050, 1036, 2418, 2616, 2210, 2477, 2855, 1075, 1361, 3115, 3299, 1800, 518], [808, 2799, 2135, 1035, 1245, 2352, 3009, 2676, 81, 3082, 68, 288, 2308, 806, 1503, 2054, 855, 2957, 126, 1364, 758, 1389, 1682, 2971, 38, 678, 2957, 3119, 2161, 1979, 2172, 2695, 1932, 12, 54, 528, 1085, 656, 3044, 2836, 1429, 1030, 914, 523, 2788, 2710, 1520, 2492, 1192, 1703, 115, 2741, 681, 1549, 1915, 2899, 2887, 2954, 366, 3142, 918, 131, 1244, 1908, 2317, 3181, 3327, 372, 2503, 985, 782, 431, 2979, 2682, 2522, 2130, 479, 1660, 3060, 761, 570, 2081, 736, 1596, 827, 976, 1780, 3049, 1652, 2238, 3094, 2675, 2093, 580, 904, 178, 345, 1911, 2005, 1185, 1164, 3242, 2654, 2773, 2036, 2748, 2441, 521, 1805, 1904, 1707, 186, 499, 532, 3319, 1271, 2901, 1806, 2394, 607, 1007, 1662, 864, 2504, 3000, 2140, 1453, 340, 2286, 1843, 1040, 2593, 1180, 997, 1767, 1731, 965, 733, 1538, 286, 1131, 1928, 2516, 2104, 476, 1377, 2356, 1051, 581, 1075, 1170, 1296, 1808, 631, 312, 2110, 1464, 1935, 1475, 2691, 1940, 231, 2629, 716, 2507, 1020, 9, 650, 689, 206, 3249, 202, 2260, 357, 2423, 2499, 2816, 1477, 355, 1152, 2762, 1233, 792, 344, 2927, 3054, 498, 2251, 2073, 2275, 1724, 721, 1751, 2142, 1107, 3311, 580, 3280, 2711, 510, 3235, 2157, 2476, 2486, 430, 948, 19, 503, 1064, 1348, 1645, 3306, 416, 226, 953, 1966, 2836, 573, 1209, 1059, 2356, 1520, 2203, 3164, 3068, 406, 1020, 1643, 2718, 214, 2905, 2134, 485, 2775, 2970, 1952, 994, 2714, 435, 1334, 1180, 1598, 3156, 3226, 1796, 2536, 1249, 2730, 176, 718, 2373, 549, 2033, 235, 725, 533], [899, 558, 2689, 1909, 217, 2327, 807, 877, 878, 308, 3314, 2512, 3053, 363, 2776, 16, 1283, 1961, 1550, 1597, 1435, 2939, 1239, 2402, 466, 1230, 1513, 1521, 3256, 2231, 2511, 2229, 3184, 3118, 717, 531, 1133, 1324, 708, 258, 1526, 683, 1264, 16, 676, 1831, 1585, 1898, 1085, 2092, 1617, 1672, 1454, 2486, 68, 2425, 1679, 2770, 560, 2174, 800, 1183, 2804, 2198, 650, 337, 684, 2774, 3031, 3078, 1187, 140, 277, 3134, 1531, 3319, 1597, 2349, 1120, 1571, 3241, 1979, 408, 1229, 2287, 1043, 1667, 3016, 2042, 92, 965, 738, 2882, 620, 41, 686, 126, 2946, 1414, 903, 2657, 784, 453, 2965, 2157, 2341, 635, 2488, 2855, 947, 788, 1406, 1028, 2582, 1515, 814, 1742, 2088, 113, 2736, 1172, 402, 2119, 2479, 1536, 2638, 1199, 358, 1444, 327, 2826, 1740, 1921, 3185, 270, 2493, 2885, 1837, 2729, 724, 1444, 2469, 1231, 1890, 1711, 2820, 74, 2185, 691, 1263, 2091, 100, 230, 2176, 9, 1258, 1925, 3259, 2583, 2192, 1856, 3181, 10, 2804, 2283, 1201, 2246, 2240, 2654, 192, 799, 1644, 2593, 965, 2413, 1838, 12, 2274, 3018, 470, 2028, 2203, 527, 1869, 2017, 532, 1460, 1766, 892, 3327, 1595, 1101, 1548, 1628, 2418, 1906, 664, 665, 3202, 885, 1965, 1840, 1941, 1125, 1698, 2078, 2610, 181, 3311, 1983, 2378, 812, 1468, 923, 967, 1127, 232, 1618, 2772, 1192, 1107, 574, 2760, 2148, 1880, 337, 3246, 433, 2123, 496, 1443, 2159, 1948, 847, 2625, 1417, 566, 2617, 646, 739, 2192, 2494, 1877, 1939, 997, 3173, 2085, 761, 1253, 1202, 1811, 1050, 2410, 2963, 2355, 22]] NTTInverse(BHat * rHat): [[2728, 2304, 2829, 2833, 2625, 1826, 1467, 2857, 59, 3288, 577, 376, 3174, 1542, 1012, 1689, 926, 1310, 311, 1655, 2244, 3216, 837, 3012, 3150, 2318, 2182, 2567, 824, 1286, 891, 674, 1539, 3002, 175, 3299, 815, 1447, 284, 3224, 353, 257, 1842, 811, 288, 496, 551, 3101, 3221, 1527, 1446, 2279, 498, 1731, 1763, 1165, 568, 953, 2071, 1559, 2967, 1778, 353, 1027, 2928, 3209, 998, 1065, 3066, 2081, 3137, 897, 1825, 2258, 401, 2417, 2783, 1297, 431, 2029, 1012, 1197, 1993, 1339, 1674, 950, 2893, 3028, 3269, 2453, 2228, 2556, 418, 1874, 792, 254, 253, 436, 473, 1571, 1459, 980, 2296, 2527, 547, 2299, 3215, 3220, 3292, 2644, 2939, 3073, 500, 3084, 2883, 138, 1781, 3120, 3129, 1320, 95, 201, 1850, 2622, 2788, 364, 2424, 508, 2011, 689, 2130, 2770, 1817, 938, 3130, 853, 878, 188, 2862, 91, 3055, 2944, 646, 3070, 3264, 145, 1708, 1713, 520, 2190, 283, 472, 1842, 1878, 3277, 1862, 1835, 3317, 818, 1899, 2287, 1418, 2458, 3167, 1572, 3114, 1667, 899, 2027, 528, 2017, 199, 1982, 485, 1139, 3241, 2560, 918, 665, 2345, 1483, 2717, 2134, 3193, 1540, 977, 1919, 2029, 2493, 2140, 242, 2093, 280, 2944, 533, 2427, 2647, 3151, 3039, 1297, 2561, 1283, 2802, 1925, 2968, 1887, 335, 763, 1091, 1953, 665, 1046, 2485, 2470, 1043, 866, 1944, 1177, 1944, 1702, 2378, 3114, 1789, 2269, 810, 1162, 700, 3234, 635, 2606, 438, 2619, 3169, 1240, 1872, 1098, 2608, 654, 1668, 393, 1334, 3322, 2884, 2581, 1959, 2831, 1913, 1758, 1996, 1996, 3163, 3095, 1053, 1390, 1464, 1648], [1569, 2344, 876, 650, 2412, 697, 3077, 236, 1862, 1645, 955, 3257, 920, 1123, 2068, 2601, 463, 1294, 1418, 527, 1123, 88, 106, 839, 2029, 3247, 374, 1607, 2576, 2305, 2402, 333, 2861, 125, 710, 3202, 545, 2265, 1184, 2044, 1172, 2624, 2725, 1821, 3210, 1643, 1265, 1081, 1029, 2086, 1619, 803, 22, 2330, 1617, 220, 2560, 1399, 1994, 2741, 2972, 2750, 2863, 2690, 2273, 1715, 2811, 1293, 2335, 3089, 2287, 2508, 3054, 1353, 1539, 3071, 2950, 56, 3147, 1778, 2417, 340, 404, 2208, 2937, 420, 1936, 2998, 481, 3321, 194, 1111, 71, 999, 450, 496, 3157, 1670, 329, 2883, 594, 1938, 2728, 1713, 2188, 2330, 1174, 427, 1051, 289, 2200, 1509, 1185, 1691, 1206, 2931, 1463, 2824, 1545, 3005, 3123, 1975, 1099, 1683, 1448, 3155, 2111, 2524, 2827, 1125, 179, 1429, 1625, 73, 1843, 2674, 2811, 724, 2916, 1958, 1462, 1449, 2466, 1743, 1130, 1663, 494, 2207, 2234, 2156, 1853, 2817, 570, 3004, 2976, 1272, 670, 2828, 2385, 124, 1714, 486, 2372, 955, 1265, 879, 3079, 2080, 1854, 579, 3218, 1740, 1938, 820, 2064, 1998, 3017, 2329, 797, 1154, 659, 821, 2385, 2181, 3149, 2134, 2848, 1691, 36, 490, 1024, 345, 3211, 1268, 1796, 1216, 17, 2878, 1658, 94, 1077, 3145, 2226, 2840, 945, 1876, 2850, 2053, 2261, 2871, 1835, 171, 2216, 3160, 83, 2986, 1016, 2546, 2772, 1613, 2387, 3108, 2953, 1225, 1296, 858, 2014, 1446, 3243, 2490, 521, 2225, 2228, 1960, 2402, 2603, 2304, 1005, 1025, 1579, 3107, 1329, 1374, 1722, 2064, 3035, 290, 2169, 2141, 2715, 2493, 3259, 610, 1423, 846, 1488], [2425, 529, 3010, 2623, 707, 1719, 1392, 697, 69, 1760, 2602, 841, 2529, 245, 3266, 1397, 406, 2831, 2126, 1601, 1242, 2769, 2400, 1585, 2104, 495, 444, 235, 2172, 1364, 2942, 3237, 1084, 1839, 2895, 1196, 2250, 1591, 573, 2794, 1307, 3, 1620, 2694, 2657, 2972, 1558, 2406, 1405, 2983, 2700, 1915, 2909, 852, 501, 3004, 2775, 1964, 1464, 1304, 2225, 992, 2283, 491, 414, 3224, 2212, 2651, 1239, 1968, 1412, 914, 3300, 2713, 1696, 906, 2662, 2527, 2346, 2321, 3141, 2169, 1518, 1788, 351, 122, 193, 2146, 2173, 1351, 2225, 2633, 1274, 3062, 2549, 2428, 3159, 2925, 2320, 2078, 2999, 2581, 2851, 840, 900, 1349, 92, 440, 2232, 2015, 1139, 2161, 2831, 2480, 2433, 2833, 316, 1182, 3037, 1588, 3197, 758, 687, 596, 1977, 219, 2611, 905, 1864, 234, 44, 2359, 3216, 313, 3142, 829, 662, 728, 12, 1995, 2044, 2098, 3158, 2037, 1008, 3174, 56, 3185, 10, 1905, 1383, 584, 2759, 489, 2213, 2450, 230, 54, 1295, 2158, 3095, 2907, 1937, 2320, 0, 3227, 2886, 1971, 2864, 2748, 1375, 2674, 2281, 1503, 2115, 1325, 288, 795, 3273, 505, 1494, 2495, 368, 3014, 3070, 1503, 1779, 47, 441, 2063, 1099, 2963, 1246, 1129, 1165, 2571, 761, 2194, 906, 1596, 229, 890, 92, 1479, 2960, 665, 1742, 2903, 816, 1997, 22, 1835, 2640, 1128, 2758, 2264, 1035, 1646, 277, 2288, 90, 2978, 922, 2276, 3048, 1626, 2210, 1592, 2268, 2268, 180, 2605, 2660, 786, 37, 2195, 45, 2075, 2490, 2485, 1153, 132, 2656, 619, 883, 237, 1363, 239, 773, 2909, 2026, 829, 606, 2009, 2039, 394], [820, 1829, 641, 967, 2242, 772, 435, 1740, 1911, 1805, 581, 2080, 3116, 22, 2646, 3253, 543, 1048, 1517, 2828, 948, 2801, 1211, 3222, 1466, 2299, 583, 785, 3287, 234, 2877, 1666, 1705, 1421, 414, 1021, 1814, 3027, 452, 323, 2367, 3296, 265, 466, 1450, 895, 1924, 2906, 3168, 92, 6, 3022, 1080, 57, 3115, 1047, 95, 2807, 2773, 1388, 1697, 178, 2042, 2612, 980, 2645, 2253, 1960, 654, 1216, 706, 2110, 1440, 1001, 2487, 251, 2494, 1278, 487, 1936, 1539, 436, 1580, 2042, 2811, 1530, 1239, 2147, 720, 6, 2698, 1710, 1759, 1747, 896, 2876, 1075, 511, 2132, 784, 1956, 2623, 3038, 836, 977, 3066, 1781, 332, 1054, 1937, 2436, 372, 1052, 2296, 2089, 2565, 996, 2935, 3196, 3080, 2166, 2104, 2135, 3025, 438, 2998, 2138, 2857, 2635, 2116, 2009, 1602, 180, 866, 1630, 2814, 722, 3053, 2808, 1552, 1657, 3196, 2219, 3253, 2591, 998, 3144, 985, 1499, 1438, 1052, 1517, 2243, 1454, 1895, 966, 2020, 1742, 2090, 2468, 401, 1129, 2235, 1099, 2836, 1429, 1401, 2931, 2868, 474, 831, 532, 199, 3113, 1515, 3105, 3301, 674, 1224, 977, 2388, 265, 1627, 3146, 3318, 3303, 330, 1566, 1180, 371, 149, 1469, 1678, 1804, 3213, 1902, 1584, 1369, 749, 2116, 1424, 897, 1940, 3255, 1337, 944, 2899, 2317, 471, 777, 808, 2697, 2302, 2191, 2402, 2506, 1003, 2978, 2448, 2896, 2783, 2550, 1963, 857, 2567, 1079, 392, 21, 2708, 3274, 2598, 1661, 2575, 1637, 587, 394, 2874, 2117, 2723, 3065, 565, 40, 1101, 64, 2879, 2464, 2470, 947, 2685, 1563, 1115, 399, 2129, 951, 558, 400]] u = NTTInverse(BHat * rHat) + e1: [[2726, 2304, 2828, 2833, 2625, 1826, 1467, 2859, 57, 3288, 576, 375, 3174, 1542, 1012, 1687, 927, 1310, 312, 1655, 2246, 3215, 838, 3012, 3149, 2319, 2181, 2568, 825, 1285, 891, 673, 1540, 3000, 174, 3299, 816, 1448, 285, 3224, 355, 256, 1844, 810, 289, 495, 553, 3103, 3221, 1528, 1445, 2279, 497, 1731, 1764, 1164, 568, 953, 2070, 1560, 2966, 1777, 353, 1027, 2928, 3208, 997, 1065, 3066, 2081, 3138, 895, 1826, 2259, 401, 2417, 2784, 1298, 430, 2029, 1011, 1195, 1993, 1341, 1675, 951, 2892, 3029, 3270, 2452, 2229, 2556, 419, 1875, 792, 254, 253, 436, 471, 1572, 1458, 980, 2297, 2526, 547, 2299, 3215, 3221, 3293, 2645, 2939, 3073, 501, 3082, 2884, 138, 1781, 3119, 3129, 1319, 94, 202, 1849, 2622, 2789, 365, 2425, 510, 2012, 688, 2128, 2769, 1817, 938, 3131, 853, 878, 187, 2863, 91, 3054, 2943, 648, 3069, 3264, 146, 1706, 1714, 519, 2189, 282, 474, 1841, 1877, 3279, 1862, 1836, 3317, 818, 1899, 2287, 1419, 2459, 3167, 1572, 3112, 1666, 901, 2027, 528, 2017, 199, 1981, 484, 1140, 3241, 2560, 918, 667, 2343, 1483, 2718, 2135, 3192, 1540, 975, 1920, 2030, 2491, 2141, 242, 2094, 280, 2944, 532, 2427, 2648, 3150, 3041, 1297, 2560, 1282, 2801, 1925, 2968, 1886, 333, 763, 1093, 1953, 667, 1047, 2483, 2470, 1043, 866, 1944, 1177, 1945, 1701, 2378, 3112, 1787, 2269, 809, 1161, 698, 3234, 634, 2606, 438, 2620, 3168, 1239, 1871, 1099, 2609, 653, 1668, 394, 1334, 3322, 2883, 2580, 1959, 2830, 1912, 1758, 1995, 1996, 3162, 3096, 1053, 1390, 1463, 1648], [1570, 2343, 876, 650, 2411, 697, 3077, 236, 1861, 1645, 956, 3257, 921, 1124, 2069, 2601, 463, 1295, 1417, 527, 1123, 88, 108, 838, 2029, 3248, 374, 1609, 2576, 2306, 2402, 334, 2859, 125, 711, 3203, 545, 2264, 1185, 2043, 1173, 2622, 2725, 1822, 3208, 1642, 1264, 1082, 1031, 2087, 1620, 804, 21, 2329, 1615, 221, 2560, 1399, 1992, 2739, 2972, 2749, 2863, 2690, 2272, 1714, 2810, 1293, 2334, 3089, 2286, 2509, 3053, 1352, 1541, 3071, 2949, 57, 3147, 1779, 2418, 340, 405, 2210, 2936, 418, 1938, 2999, 480, 3321, 194, 1111, 71, 998, 450, 495, 3158, 1671, 329, 2882, 592, 1938, 2727, 1714, 2188, 2329, 1172, 428, 1051, 289, 2202, 1510, 1185, 1691, 1207, 2929, 1464, 2826, 1544, 3006, 3122, 1976, 1099, 1683, 1448, 3154, 2111, 2522, 2827, 1124, 178, 1428, 1624, 73, 1843, 2674, 2812, 723, 2918, 1957, 1463, 1451, 2465, 1742, 1131, 1662, 495, 2206, 2235, 2156, 1852, 2817, 570, 3005, 2975, 1271, 669, 2829, 2386, 124, 1713, 485, 2371, 954, 1265, 878, 3078, 2079, 1854, 581, 3218, 1740, 1937, 818, 2066, 1998, 3016, 2330, 795, 1154, 658, 820, 2385, 2180, 3149, 2136, 2847, 1691, 35, 491, 1024, 346, 3211, 1267, 1795, 1218, 19, 2878, 1656, 95, 1079, 3145, 2227, 2840, 945, 1877, 2852, 2052, 2261, 2872, 1835, 171, 2217, 3158, 83, 2987, 1016, 2547, 2772, 1613, 2386, 3107, 2951, 1225, 1295, 860, 2015, 1447, 3242, 2489, 522, 2225, 2228, 1962, 2402, 2603, 2304, 1005, 1025, 1579, 3107, 1328, 1374, 1723, 2064, 3037, 291, 2168, 2140, 2715, 2493, 3260, 610, 1423, 846, 1489], [2427, 528, 3009, 2623, 707, 1720, 1391, 696, 68, 1760, 2601, 843, 2530, 246, 3266, 1397, 407, 2831, 2125, 1602, 1242, 2769, 2400, 1586, 2106, 497, 443, 236, 2173, 1365, 2942, 3237, 1083, 1840, 2895, 1195, 2250, 1590, 572, 2795, 1308, 3, 1621, 2695, 2657, 2971, 1560, 2406, 1405, 2983, 2701, 1914, 2909, 851, 501, 3002, 2775, 1962, 1464, 1305, 2226, 990, 2282, 489, 415, 3224, 2213, 2652, 1239, 1970, 1413, 914, 3299, 2714, 1696, 905, 2661, 2527, 2346, 2319, 3143, 2167, 1517, 1788, 351, 122, 195, 2147, 2172, 1350, 2224, 2632, 1273, 3062, 2549, 2430, 3161, 2926, 2319, 2078, 2999, 2582, 2852, 840, 900, 1349, 94, 441, 2232, 2014, 1139, 2161, 2832, 2479, 2434, 2832, 316, 1183, 3037, 1588, 3198, 757, 685, 595, 1977, 220, 2610, 905, 1865, 235, 44, 2359, 3215, 315, 3142, 829, 663, 728, 12, 1994, 2044, 2099, 3159, 2037, 1007, 3173, 57, 3186, 10, 1905, 1383, 583, 2759, 488, 2215, 2450, 229, 53, 1294, 2158, 3096, 2908, 1937, 2322, 0, 3228, 2885, 1971, 2865, 2750, 1374, 2675, 2282, 1502, 2116, 1325, 287, 795, 3273, 506, 1493, 2496, 368, 3015, 3070, 1504, 1778, 48, 440, 2064, 1098, 2963, 1245, 1130, 1166, 2573, 760, 2194, 905, 1597, 230, 891, 91, 1479, 2960, 663, 1741, 2902, 818, 1996, 24, 1836, 2640, 1130, 2758, 2264, 1035, 1646, 278, 2288, 90, 2977, 922, 2275, 3048, 1627, 2208, 1592, 2268, 2269, 181, 2603, 2660, 786, 38, 2196, 45, 2075, 2491, 2485, 1152, 132, 2657, 619, 883, 236, 1364, 238, 773, 2910, 2026, 829, 608, 2007, 2041, 393], [821, 1830, 641, 966, 2243, 774, 434, 1738, 1911, 1805, 581, 2078, 3115, 22, 2645, 3254, 543, 1048, 1517, 2827, 947, 2801, 1211, 3222, 1466, 2299, 583, 784, 3287, 236, 2877, 1666, 1706, 1420, 414, 1022, 1813, 3027, 451, 324, 2366, 3297, 266, 468, 1449, 896, 1924, 2908, 3170, 92, 4, 3020, 1079, 59, 3116, 1048, 95, 2806, 2772, 1389, 1696, 177, 2044, 2613, 980, 2647, 2255, 1960, 654, 1216, 707, 2111, 1440, 1001, 2486, 251, 2494, 1279, 487, 1936, 1540, 437, 1580, 2041, 2811, 1531, 1239, 2146, 720, 7, 2699, 1709, 1758, 1746, 895, 2874, 1075, 509, 2134, 784, 1955, 2622, 3039, 835, 978, 3066, 1780, 331, 1054, 1936, 2436, 372, 1053, 2296, 2089, 2564, 995, 2935, 3197, 3082, 2165, 2103, 2137, 3025, 437, 2999, 2139, 2857, 2635, 2117, 2008, 1602, 178, 867, 1629, 2815, 721, 3053, 2809, 1553, 1657, 3197, 2220, 3253, 2590, 999, 3143, 986, 1500, 1438, 1051, 1516, 2244, 1455, 1894, 966, 2020, 1741, 2089, 2467, 401, 1130, 2235, 1101, 2837, 1430, 1403, 2932, 2869, 474, 831, 532, 200, 3112, 1516, 3106, 3302, 676, 1224, 977, 2386, 265, 1627, 3146, 3319, 3301, 330, 1568, 1178, 370, 150, 1469, 1677, 1803, 3211, 1902, 1586, 1369, 749, 2116, 1425, 896, 1941, 3254, 1338, 945, 2901, 2316, 471, 776, 808, 2697, 2301, 2192, 2402, 2506, 1004, 2979, 2449, 2896, 2784, 2550, 1963, 857, 2565, 1079, 391, 20, 2708, 3273, 2597, 1661, 2576, 1636, 587, 395, 2874, 2118, 2723, 3063, 564, 41, 1100, 64, 2880, 2463, 2469, 947, 2685, 1563, 1115, 400, 2131, 953, 560, 400]] mu: [1665, 1665, 0, 0, 0, 0, 0, 0, 1665, 1665, 1665, 1665, 0, 0, 1665, 0, 1665, 0, 0, 0, 1665, 1665, 1665, 1665, 0, 1665, 0, 1665, 0, 0, 1665, 0, 0, 1665, 1665, 0, 1665, 0, 1665, 0, 0, 0, 1665, 0, 0, 1665, 0, 0, 0, 0, 1665, 1665, 1665, 0, 0, 1665, 1665, 0, 1665, 0, 0, 1665, 0, 0, 1665, 0, 0, 0, 0, 1665, 0, 0, 0, 0, 1665, 0, 1665, 0, 1665, 1665, 1665, 1665, 1665, 0, 0, 1665, 0, 0, 0, 1665, 1665, 1665, 1665, 0, 0, 1665, 0, 1665, 0, 1665, 1665, 1665, 0, 1665, 1665, 0, 1665, 1665, 1665, 1665, 0, 0, 0, 0, 1665, 0, 0, 0, 0, 0, 1665, 1665, 0, 0, 1665, 0, 0, 1665, 0, 0, 1665, 1665, 1665, 0, 0, 0, 0, 0, 0, 1665, 0, 0, 1665, 1665, 0, 1665, 0, 0, 1665, 0, 0, 1665, 1665, 1665, 0, 1665, 1665, 1665, 0, 1665, 0, 0, 1665, 0, 0, 0, 1665, 1665, 0, 0, 0, 0, 1665, 0, 1665, 0, 0, 1665, 0, 0, 0, 0, 0, 0, 1665, 0, 1665, 0, 1665, 1665, 0, 1665, 1665, 1665, 0, 0, 1665, 1665, 0, 1665, 1665, 0, 1665, 1665, 1665, 1665, 0, 0, 1665, 1665, 1665, 1665, 1665, 0, 0, 1665, 1665, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1665, 0, 0, 0, 1665, 0, 0, 1665, 1665, 0, 1665, 0, 1665, 0, 1665, 0, 1665, 1665, 1665, 0, 1665, 0, 1665, 1665, 0, 1665, 1665, 1665, 1665] tHat^T * rHat: [2832, 998, 1041, 112, 1377, 3292, 2245, 2778, 1275, 131, 1065, 1532, 1554, 3218, 321, 64, 713, 2494, 1080, 1187, 1448, 2307, 2085, 600, 1497, 1186, 243, 356, 97, 3068, 2998, 1766, 1245, 1393, 1446, 70, 3167, 1797, 393, 2580, 789, 593, 2041, 422, 1847, 1834, 2425, 3181, 54, 1941, 2527, 1251, 828, 1724, 586, 789, 1630, 721, 2239, 1085, 259, 2515, 217, 3208, 930, 2981, 3085, 3225, 851, 2573, 2518, 609, 2072, 3236, 2034, 2805, 1671, 2242, 3032, 2593, 1943, 176, 895, 196, 885, 920, 3047, 2375, 646, 3039, 2687, 1152, 785, 1572, 207, 2196, 2962, 866, 523, 1363, 2262, 2797, 1400, 1828, 2406, 1579, 680, 1879, 180, 1614, 116, 3168, 2110, 3106, 2738, 3256, 3185, 2813, 2433, 2343, 64, 841, 2623, 3211, 2036, 123, 2832, 2922, 1144, 2110, 2682, 1124, 862, 1205, 524, 3286, 439, 3121, 2484, 1957, 1531, 1002, 2941, 3205, 982, 1679, 1973, 1222, 1430, 1574, 2859, 10, 345, 344, 1108, 1822, 784, 2299, 2135, 2346, 3206, 2656, 2077, 757, 1195, 303, 1971, 706, 993, 1931, 2663, 1192, 3152, 2734, 707, 3013, 242, 2335, 2685, 1550, 1923, 1604, 2041, 2685, 2607, 1429, 2139, 2041, 2099, 1781, 1376, 1258, 2320, 346, 1478, 3321, 572, 1093, 316, 787, 2434, 1114, 1757, 1293, 3051, 1743, 1842, 1527, 2670, 822, 2980, 1818, 2503, 1163, 214, 3061, 1190, 2501, 1650, 180, 64, 2031, 2924, 1525, 3214, 2702, 715, 3050, 1714, 3228, 1269, 155, 11, 1043, 2307, 3294, 3308, 2766, 67, 563, 765, 2037, 125, 1582, 810, 2910, 1856, 2345, 3146, 3039, 3002, 1274, 2109, 2488, 2045, 520] NTTInverse(tHat^T * rHat): [2232, 1324, 153, 262, 1847, 1416, 1179, 704, 88, 3232, 1082, 2292, 1628, 1916, 3032, 2802, 1858, 890, 2481, 1541, 804, 1566, 2553, 2200, 2924, 2688, 0, 2050, 2407, 3241, 2099, 1311, 2358, 528, 1275, 386, 552, 2798, 924, 2192, 1443, 1889, 2438, 2186, 3233, 2258, 1093, 726, 2741, 2431, 651, 870, 1376, 2355, 168, 2366, 692, 2672, 1340, 1489, 1460, 2443, 284, 256, 975, 2416, 2213, 831, 1123, 192, 1765, 530, 1509, 1172, 3312, 2025, 2872, 2944, 1809, 1716, 987, 463, 3269, 2654, 3194, 2944, 1906, 904, 633, 2175, 695, 2662, 2358, 2672, 720, 2781, 1279, 2227, 2303, 2049, 2443, 1296, 1965, 2113, 2468, 1294, 65, 1591, 757, 1164, 3166, 2137, 2708, 1248, 3093, 2018, 2280, 1013, 1610, 2916, 2591, 2842, 1635, 2816, 580, 514, 1221, 2231, 2433, 743, 1694, 707, 19, 896, 2286, 1789, 693, 306, 57, 3257, 1273, 2850, 763, 2603, 1261, 2474, 2133, 2079, 1286, 2860, 1782, 195, 2165, 2808, 1879, 1, 1951, 2754, 2700, 286, 2031, 880, 2542, 25, 2342, 1074, 3036, 1057, 128, 1079, 3282, 1918, 1609, 41, 491, 1524, 2377, 67, 227, 2073, 2509, 1439, 1160, 1490, 1222, 3251, 1901, 1490, 2225, 272, 1737, 1372, 1324, 3310, 226, 2776, 1335, 2768, 1113, 1620, 311, 1735, 160, 443, 1913, 1803, 3181, 1457, 2569, 2543, 148, 974, 2701, 1357, 2180, 1294, 1637, 1155, 709, 2124, 2828, 1059, 1415, 488, 184, 710, 2323, 205, 2977, 2645, 2103, 3014, 1927, 693, 791, 2997, 1509, 2940, 80, 3245, 789, 2218, 2282, 1865, 2319, 941, 3314, 2810, 2836, 715, 741, 1423, 2100, 2656, 3122, 2027] e2 + mu: [1664, 1664, 0, 2, 0, 0, 0, 0, 1663, 1664, 1666, 1666, 0, 3328, 1667, 0, 1665, 0, 0, 0, 1666, 1665, 1666, 1665, 0, 1665, 2, 1665, 3328, 2, 1666, 0, 3328, 1664, 1666, 2, 1664, 3328, 1666, 0, 3328, 1, 1667, 0, 1, 1664, 0, 3328, 1, 3328, 1666, 1663, 1663, 0, 0, 1665, 1666, 3328, 1665, 3328, 1, 1665, 3328, 0, 1666, 0, 3328, 3328, 3328, 1664, 2, 0, 0, 0, 1664, 3328, 1665, 0, 1665, 1666, 1664, 1665, 1664, 0, 2, 1666, 1, 3327, 2, 1665, 1665, 1667, 1664, 3328, 0, 1664, 3327, 1666, 2, 1665, 1666, 1666, 1, 1666, 1666, 0, 1665, 1665, 1664, 1665, 2, 1, 0, 1, 1664, 3328, 0, 3328, 3328, 3327, 1664, 1665, 3328, 0, 1666, 3328, 3328, 1666, 3328, 1, 1665, 1664, 1664, 3328, 1, 0, 2, 0, 0, 1665, 0, 3327, 1666, 1664, 0, 1667, 0, 3328, 1664, 0, 0, 1664, 1665, 1664, 1, 1666, 1666, 1666, 1, 1666, 0, 1, 1665, 1, 2, 3328, 1664, 1666, 3328, 0, 0, 2, 1667, 0, 1666, 0, 1, 1666, 0, 0, 0, 1, 3328, 0, 1666, 0, 1664, 3328, 1664, 1664, 3328, 1665, 1666, 1666, 3327, 3328, 1664, 1667, 0, 1665, 1664, 0, 1666, 1664, 1665, 1666, 3327, 0, 1665, 1664, 1666, 1665, 1665, 3328, 3327, 1664, 1665, 0, 2, 1, 0, 0, 0, 0, 1, 1, 3327, 1666, 1, 3328, 0, 1666, 1, 1, 1665, 1665, 2, 1666, 0, 1666, 2, 1665, 2, 1664, 1665, 1666, 3328, 1664, 3327, 1664, 1665, 0, 1664, 1665, 1666, 1666] v = NTTInverse(tHat^T * rHat) + e2 + mu: [567, 2988, 153, 264, 1847, 1416, 1179, 704, 1751, 1567, 2748, 629, 1628, 1915, 1370, 2802, 194, 890, 2481, 1541, 2470, 3231, 890, 536, 2924, 1024, 2, 386, 2406, 3243, 436, 1311, 2357, 2192, 2941, 388, 2216, 2797, 2590, 2192, 1442, 1890, 776, 2186, 3234, 593, 1093, 725, 2742, 2430, 2317, 2533, 3039, 2355, 168, 702, 2358, 2671, 3005, 1488, 1461, 779, 283, 256, 2641, 2416, 2212, 830, 1122, 1856, 1767, 530, 1509, 1172, 1647, 2024, 1208, 2944, 145, 53, 2651, 2128, 1604, 2654, 3196, 1281, 1907, 902, 635, 511, 2360, 1000, 693, 2671, 720, 1116, 1277, 564, 2305, 385, 780, 2962, 1966, 450, 805, 1294, 1730, 3256, 2421, 2829, 3168, 2138, 2708, 1249, 1428, 2017, 2280, 1012, 1609, 2914, 926, 1178, 1634, 2816, 2246, 513, 1220, 568, 2432, 744, 30, 2371, 1683, 895, 2287, 1789, 695, 306, 57, 1593, 1273, 2848, 2429, 938, 1261, 812, 2133, 2078, 2950, 2860, 1782, 1859, 501, 1143, 1880, 1667, 288, 1091, 2701, 1952, 2031, 881, 878, 26, 2344, 1073, 1371, 2723, 127, 1079, 3282, 1920, 3276, 41, 2157, 1524, 2378, 1733, 227, 2073, 2509, 1440, 1159, 1490, 2888, 3251, 236, 1489, 560, 1936, 1736, 3037, 2990, 1647, 224, 2775, 2999, 1106, 1113, 3285, 1975, 1735, 1826, 2107, 249, 140, 3179, 1457, 905, 878, 1814, 2639, 1037, 1356, 2178, 2958, 3302, 1155, 711, 2125, 2828, 1059, 1415, 488, 185, 711, 2321, 1871, 2978, 2644, 2103, 1351, 1928, 694, 2456, 1333, 1511, 1277, 80, 1582, 791, 554, 2284, 200, 655, 2607, 3313, 1145, 2834, 2379, 2406, 1423, 435, 992, 1459, 364] c: 8D4E2CB39FFDE4311AEEDB2338BF58CE11FADABDC9813A321930F46756DD13A8E7919FAC4F59CC9F8B91C833B3B3F91ADC6F9FBDBDE2F7DAE8841BE5238B9850A5EEBE675DDEF42A9314F690595D51523E8117F22266034F09B77D991EE575802AFE446374EB3D9E1BEB8F25049C6EFA96327366C024CDFBE8DC27EF56492C90409E87139C6088488E17B82D1556C25131ACEE7DAFFE2D437CEC3441BBBBAB80C4BF177E653AE0831C9B4CEB70505727D63C4D474FEDC52019BE411C9A43B87170F5893F06ECD8D782063DF893A1B682246D1C64F8F5A8C6FCDF07927F4D5B7A397FBCBD075045DF2C4A36F5304C95F44AF927AE9166420B39448794F5B3C35227C3C9DF925602A1AC98F851AADB65C93FDD6327AED8AE4129724436A33AA08AA56608855FF80AAA42ACA4562B2D78DBBD2F91AEF251566B8C6F98213784C99DD7D71F495564C908501E35E3BFBB675CCB66635287CB6466E6E38EA8AB11CE7EC60BED8620B3DCD6943D1279A41F93A87FA359E513C81DE918DA88322B1B088140E074BE39BC17E3C51AB719DF6E426D64FF94B8662B9DD26A32A3C3687BF9294C537A2268F9DED380CC8A0F1127EE5A322B4DF24D87FBCE76F560B037C659B6FB15C156071AEDC26EF11140DE88D08D463EA0EAF080A0B2E627D9FF1D56C502335524269727A032DACD16543ADA8342CD6CB40E7228592C3574D982E0B9145EB865DB2EE7810726A916B837CA4F14C2CB9E951BDE76BE16B8B1CDC2EECDC06949B8BEB11786B8F25F4C9AFA5597CEB1D85FC9B9C91DC61966F396091E54C96C97A4300E99FD9F752C0BEF5D88CAFBDCB3993FCF6C7A8C5519FCECB6A79117E9B521680197D8A91AB75F1814DBC58075EF4F07987ABC56A75DA4416EDB9D6F3D771AD340D5CBCFC0E571FA70AAC1C7DBBB5F5C5E1D8B1036F5A6FCFD0625AB5BBDA571839C5835DD6979778F59D348684FA6CFC2A62535B47FAD7F97B5218872D52DCACE9D3C1B11628D352AD821900F44E14B647F6BFA70F646B5C7AF5313177A10954944229153A449FCF89A6263BDBF8556E981E5D6251340F9F43C6692030FB9605BB99F33E96F06D1E4E6ABBE65E14696D530F1B525FFF87D54C1AC2F5E964D46EE37F4045B54E6098F76B28EAF69E998888D25E021A538FD1956A7FC30AE83F8BA9947F864FD59731A6FBB402AF2990E1ED2D56BF62AA6CEAE6F769D2D0C6C313D7AAF974E69DC02CC4318B9457B8CC40656AB7B6134DE3F9801CE019699CE855EBE9C6C02FD08506F004A4EED2CA166C954C7DB8810700CA671EF372A290B00E1BFBB97E3E674D3DCCC57CE59F465B1488FF76F6239008BE3E761EF9C113DF0107B8EEAE3FEBA55B35E4C1DA3B6C87A8D20110E1CD771CCBC30DFF761E603D488E55B853AAE7DAADF2A007B8393DF08AF534F9F53A73757BABE21C86426CF058ECA817EF237BFC58AC298FBF2A1481C4D12DCF1B737FD639769A2531EF931A362A44456EE2CA48598B46259FCC977076C59FA4E2954E9967DA45DA7CBF78633EC59C463FE48A83B801A54DB3FEAB445A357E418B0653F2940B2B71381B2DF9ECF8100848E2912F4BD503AF075AAAF36C136A413C95BE2F25A6D291976CD66A27643537E35E1DF89B1E494B36B08F3D0196CD7E90BA5BB21009F37A843199E08DD95CA4948C533CB263B5D405AF2FA119981A8536EB71C88226C41534C2687BF1EED3475E8488BDE909A93D4DB55B6E834B5E7860AA98FD8BCB13AB077B7BFD75B35FA393E93E3BFB4B9BA1DAA7465FD5B23A5B4CD1716D4BDF7B8D5574B156DB87D8DE1E526C97F8EB287BD97EEEEEF074DBCB2C4DB51A4EFF1FA7FFF328A572D7270017108ACE2ED25093DA535C7A26D3B912AA57FB322E53BB222E94E7CF68CD8A21AD7C06A4AF978ED1DEB10E3F2412AC6543C182068EFFBD87F31765F5AE681EE8B2E9AEB5BC940A94EC0EEF5BEF74874169EABECF1512565C51EA58721DD3AF1690365DB22E1877F2A5C01723F69B7725277AE4E9EFACD3AFA5ADCAF385777E7CE10F956B4642C6FC1C97808993EFD994CA65C75F459AC5872F82488C57FB7AF9AB969D5E369C16D0B2BF7800B938D6784C7F64D0C55CA7794654938949E14217055D34101F9417D370A8ADD72FC0B5766EC1D8ADDD702334A2AC27709C5AC5AE5601DBA952BE258D9336DF3E0F65878A858613258FB5E47941B fips203-0.2.1/tests/nist_vectors/Encapsulation -- ML-KEM-512.txt000064400000000000000000001057001046102023000216510ustar 00000000000000Encapsulation -- ML-KEM-512 ek: A5409718CB72F2438A3555A3C8F18F2671A1F81403DF7B5A4659A51F50827BA6577AA70800D78D8BC5AA86B89E08B58F3480A89E104DC6922EDBC12D06F891027C654E994A22F91A2AF63404CA98D7B67EEA25911B24C70DEB8146A0821F34A302551F2D510C0588C8BCA74EB4DC0CFA4603C1C5A3C5537061789068682C4CC3143FBA9BB5542F9778BDF23B3652F2A7524756FA73909DDAC7E532522659218CBA25F33B6B0458CB03DA7935BA59111955312B15CCE2C0F73466A8006283A2AA7CBB61022ABBC2D19F2920BC302472DC97C4A1788C9BD3BBEDC9122B827B279C074C80443141119F4B1629F62F10D4CE2BE3BB343816CAD16A1C87582F2B70E26635B08BB390C13398FCCDA7E9BB3D9B0B7803750C955C57A028A5D26C270316BB2B815C3B972BA6782DAB02F306821E61285BB072BF79781CABC386142A50C7AAAE66A947585BB0D8288DBCAF4B3B85BB7926987BAF7643AAB5FB02210580A0264352E69C6098989CFB87483395960A3A4F31BEFDA80B5F286ECFDAA555D4390AF6B55D313920929093449CD6729D00218E2D86570ADC0C4F6545FFB5632EFB3AAE2625A6982670FACE8D16126FA607E6D0A1FF616A46ECA642CC6AAC554DBBC43DFCF57F364C190CEA5776C1CEB58B7007505FD79C5F005A4BA218CF0693B058B510A4CA204324602F59BB8F2281C4D7B0BC8625E7881650F57C89E32CF4809144775C9073B673E39412A27C914321CCB6A7CF7C37C5BCBE7CA51BE0C928466A458EB778D6466A892A0ACBC09638784A27739C970CA58BC2595AD6BFA4E52EB438AC97C41623802248E110B074838F31A6E7503737704E7AE4AD91299572A8C13603500F3609B625B4E24CAE332B0D7A5BB47A038512A081BC27CDF0F2923CD3479F5307020B77F149584564060E5083CED55312B6A6A465A82B4577D63A4B49C80B07A9367E39778AF76FA8EC2CF528722856CE7813401A8383BDB7151B9B6D2DD6BFF55401D28AC612818C88C9287347B098A966EB9C0A2DB71F0A75555E1757D3AC4E3D802C8DC6A261521255186ABB98C2480301B8C6B31228B54461BC44EA3C2CF94B86C7A5B82C55167A7606CA9DC8253B7604E44A07F3ED55CD5B5E m: 109A248FE8052F84271FF57BAC156B1BA6A509CDCDBCC96CCDB1CCB85CA49315 K: 4DDD304E274899BD82971856824B587130927952060121858F9ADEB96AB7F571 r: D93F0F5C16390B24AB38D288F511F0ECEB618C0E7F0BB9BD65E0321A5C4712A6 tHat: [[165, 2420, 2840, 1836, 1010, 2212, 1333, 2613, 456, 2303, 294, 2583, 1272, 49, 3039, 1447, 2374, 2645, 31, 2085, 1659, 1402, 1914, 138, 1792, 2269, 1419, 2732, 2182, 2539, 1288, 2299, 52, 2696, 158, 1233, 710, 745, 475, 732, 2054, 2335, 3074, 1623, 2382, 1193, 2338, 431, 1578, 847, 2564, 2444, 1751, 2027, 1514, 2322, 1051, 3186, 2829, 2078, 70, 2090, 1055, 2611, 1282, 501, 301, 197, 2053, 3208, 1980, 1258, 3252, 205, 1786, 52, 1473, 2620, 965, 1797, 2145, 2311, 2152, 710, 844, 332, 2623, 2491, 1205, 757, 2199, 3031, 3058, 867, 594, 2687, 1874, 1380, 1018, 2311, 2717, 3197, 741, 1315, 2342, 533, 2700, 603, 3059, 1715, 2052, 3253, 2563, 1949, 2613, 1435, 2321, 1361, 2865, 338, 716, 3086, 1271, 1635, 168, 1568, 643, 2730, 2940, 1563, 2562, 2994, 450, 2557, 41, 3010, 1072, 1826, 2012, 3145, 2209, 2247, 923, 3005, 2541, 300, 555, 1976, 3111, 121, 76, 1096, 305, 276, 2975, 356, 1577, 767, 1040, 3309, 811, 3006, 2100, 355, 458, 1709, 1820, 1416, 2863, 1794, 1762, 854, 2992, 2872, 400, 828, 3224, 3295, 2471, 3006, 2877, 185, 888, 1872, 1292, 1481, 87, 650, 677, 1741, 807, 352, 3003, 2066, 2908, 2419, 1579, 1930, 2861, 42, 1779, 2080, 286, 646, 91, 1835, 2495, 1927, 2844, 3130, 1158, 673, 1872, 2732, 1710, 2710, 2119, 1461, 2224, 653, 3213, 2811, 2891, 2131, 2491, 615, 2968, 2807, 886, 2724, 2997, 47, 1313, 2048, 1696, 1074, 1618, 2510, 2144, 2441, 2972, 2175, 840, 2387, 2710, 928, 335, 3043, 2301, 186, 2143, 1762, 2767, 2653, 1109, 925], [1546, 2911, 349, 915, 544, 2313, 1171, 2500, 726, 2519, 256, 2274, 1581, 1400, 3082, 205, 1359, 1110, 1535, 1595, 2862, 943, 1710, 594, 2214, 617, 2672, 3311, 1677, 289, 1647, 122, 230, 2589, 511, 1702, 3142, 2670, 3138, 1708, 1452, 1237, 1211, 988, 1532, 2047, 3126, 404, 2572, 1406, 374, 3308, 2997, 1800, 7, 1525, 3287, 1529, 2560, 1205, 2210, 3313, 774, 2825, 1368, 267, 2724, 524, 1091, 1538, 2351, 2997, 655, 2066, 1988, 2829, 1724, 600, 2279, 360, 1360, 1999, 905, 718, 244, 2328, 1860, 1479, 912, 2919, 883, 2382, 530, 1994, 913, 532, 1740, 2683, 3279, 887, 3269, 3051, 1404, 442, 2528, 652, 2630, 1110, 1934, 1931, 1750, 1700, 2697, 162, 203, 2412, 2104, 1191, 807, 2503, 3223, 2640, 651, 1436, 1626, 3069, 1444, 750, 2228, 2755, 1175, 364, 35, 552, 328, 270, 1200, 2103, 399, 2659, 231, 885, 55, 1255, 1146, 2782, 2449, 2386, 2162, 3098, 822, 1280, 1551, 147, 1462, 2882, 3298, 2788, 2867, 210, 2938, 2885, 890, 2128, 18, 2074, 1980, 3282, 752, 2351, 828, 1149, 927, 117, 2818, 1904, 2545, 1412, 1093, 102, 14, 2101, 1486, 1341, 1554, 2667, 1444, 2694, 1323, 1908, 2774, 1203, 2121, 188, 2311, 874, 2430, 1907, 1930, 1791, 3240, 718, 2293, 1826, 1576, 3301, 888, 1025, 794, 2104, 1981, 347, 2843, 1753, 1581, 3069, 1269, 21, 2770, 3176, 274, 2248, 2440, 652, 1907, 2820, 2456, 1642, 3307, 169, 1837, 507, 1290, 1367, 1886, 1393, 3283, 1258, 61, 712, 1677, 2604, 609, 293, 2133, 1697, 2235, 3113, 840, 16, 1720, 2876, 2066, 2898, 324, 3014]] bHat = aHat^T: [[[3168, 3188, 3062, 1132, 108, 2666, 3029, 1599, 507, 3166, 2406, 2585, 37, 2415, 1386, 25, 959, 2147, 1383, 3278, 683, 1054, 2230, 2766, 2314, 2519, 561, 3279, 2896, 487, 1783, 863, 1614, 2452, 829, 2499, 1590, 2885, 789, 316, 1769, 574, 1646, 540, 674, 2867, 2914, 3209, 361, 51, 3098, 2013, 3200, 942, 3179, 2862, 1119, 1122, 1797, 2223, 2597, 2122, 2572, 2138, 1966, 2500, 3270, 891, 1876, 2437, 2629, 1616, 41, 2058, 1054, 1545, 757, 1962, 1818, 2937, 825, 2705, 466, 2824, 1660, 331, 82, 2240, 2568, 1589, 1858, 1407, 2784, 1015, 2616, 2349, 690, 1988, 2528, 1832, 989, 1959, 446, 1593, 1246, 2648, 1616, 2206, 2007, 2371, 2827, 2930, 2403, 1045, 1896, 175, 24, 2046, 1072, 797, 1169, 1119, 2787, 349, 2736, 2002, 2066, 2431, 1344, 2496, 1125, 3195, 2685, 3036, 1036, 1516, 825, 2956, 1746, 1447, 1426, 2442, 1389, 1812, 2052, 1402, 1113, 2637, 531, 2004, 1146, 3243, 132, 3089, 1283, 908, 2812, 2253, 2537, 1909, 1017, 1705, 3227, 1163, 2574, 2166, 3244, 1812, 2087, 3037, 3298, 489, 221, 2927, 1370, 1305, 2338, 1158, 945, 2619, 595, 1229, 423, 1971, 1664, 1565, 669, 2658, 848, 657, 631, 2314, 2768, 3193, 1855, 2042, 2704, 2438, 776, 1597, 2565, 1917, 961, 1584, 3201, 2285, 231, 989, 2946, 1792, 3156, 224, 1483, 2249, 116, 2272, 926, 2505, 428, 106, 1806, 173, 3113, 2337, 2885, 1255, 677, 785, 2010, 1898, 1970, 744, 490, 2718, 3158, 1388, 1822, 2541, 1595, 171, 1835, 2104, 1636, 1308, 458, 708, 410, 2025, 2854, 2630, 657, 1906, 2612, 1548, 1285, 2985], [2187, 2809, 281, 1086, 1360, 711, 2799, 2132, 1448, 914, 1940, 2572, 623, 1180, 2183, 2741, 2595, 1022, 908, 893, 1752, 3285, 2013, 2536, 2996, 2211, 948, 330, 1830, 2894, 1862, 3010, 1941, 1152, 2089, 425, 925, 3041, 2780, 12, 2052, 1880, 2438, 1003, 540, 2464, 3313, 1791, 1080, 2187, 373, 830, 2382, 2167, 3242, 868, 2239, 825, 2591, 577, 1956, 2541, 1666, 3175, 3237, 3294, 803, 1654, 4, 2142, 804, 1030, 2469, 3106, 2674, 1241, 2770, 1947, 587, 839, 2135, 1409, 583, 11, 423, 2898, 2065, 2559, 2037, 2465, 3139, 918, 348, 571, 1605, 3114, 1457, 321, 364, 2883, 608, 2389, 966, 504, 2656, 2214, 2447, 850, 2028, 3182, 2321, 341, 1618, 1636, 558, 530, 1971, 1119, 2794, 591, 3323, 1004, 540, 46, 1901, 1272, 88, 463, 1969, 3173, 339, 561, 550, 1136, 1709, 1277, 2686, 2038, 478, 2874, 2435, 1733, 2164, 2182, 2979, 852, 12, 3235, 2603, 1357, 1687, 438, 272, 1349, 1036, 429, 1408, 1422, 608, 1369, 2870, 1167, 434, 1669, 2656, 974, 1555, 430, 640, 238, 1626, 76, 454, 2897, 1009, 2852, 1176, 1861, 206, 2633, 1301, 3141, 556, 3305, 1897, 808, 2044, 2623, 2863, 173, 336, 400, 970, 3214, 2334, 1544, 1594, 2119, 870, 3166, 1047, 2902, 958, 198, 2697, 1357, 1468, 568, 2975, 2777, 3228, 3115, 12, 2378, 820, 2341, 645, 31, 1373, 2581, 175, 1393, 2148, 1199, 1866, 2720, 2706, 2886, 24, 845, 3327, 2259, 3315, 2380, 2455, 2167, 1450, 2326, 221, 2727, 1293, 1541, 1152, 2420, 2015, 2573, 3109, 1298, 777, 2173, 1094, 994, 2095, 2504, 2729, 1062]], [[1357, 636, 1559, 1810, 938, 644, 229, 103, 89, 381, 547, 1750, 1336, 1791, 32, 850, 1642, 3065, 2026, 749, 1380, 924, 2593, 2078, 1428, 2606, 2705, 2884, 866, 965, 515, 3196, 1999, 501, 3092, 790, 2427, 3080, 1155, 2250, 1382, 1619, 1826, 2660, 734, 3268, 984, 617, 2085, 1164, 3016, 198, 482, 2666, 961, 1377, 2830, 3234, 2228, 514, 459, 2799, 2507, 2383, 2515, 1917, 2617, 410, 966, 1685, 3251, 2135, 2910, 310, 999, 1428, 2153, 1082, 157, 336, 398, 2706, 2102, 643, 2493, 1464, 1569, 2378, 1221, 2471, 174, 2576, 721, 2689, 614, 303, 223, 710, 2205, 724, 1091, 2823, 576, 1710, 1972, 1524, 89, 1509, 1520, 2865, 2165, 1541, 1303, 1047, 1128, 1920, 3317, 2991, 2163, 1650, 1932, 2030, 2433, 3115, 376, 556, 1817, 839, 2698, 2316, 822, 1934, 50, 1299, 2961, 3240, 2212, 691, 148, 3239, 698, 321, 3154, 1743, 2713, 64, 2915, 444, 723, 2208, 645, 474, 1985, 2558, 2888, 1379, 53, 1675, 410, 1671, 2221, 1496, 2614, 1098, 4, 3325, 2043, 2059, 2991, 2307, 2704, 1422, 88, 682, 897, 478, 1576, 2699, 658, 2050, 2189, 364, 149, 2210, 3245, 2546, 1965, 2084, 901, 1083, 2854, 3265, 1808, 260, 1680, 2862, 3296, 1011, 2302, 1512, 688, 1287, 2895, 604, 2252, 3083, 2024, 938, 718, 1790, 2428, 294, 428, 2817, 209, 340, 1227, 3287, 2732, 2282, 2064, 1087, 1694, 3095, 1564, 1239, 2204, 2483, 1421, 1358, 1880, 1268, 434, 1552, 565, 20, 893, 2896, 1756, 2499, 2204, 574, 1211, 2151, 1210, 299, 960, 2134, 2990, 930, 2171, 2848, 1297, 3271, 1241, 2550], [327, 2990, 1094, 2515, 2012, 2050, 1995, 1283, 486, 625, 2883, 245, 3038, 2509, 383, 524, 1019, 1128, 564, 314, 75, 3314, 425, 2395, 824, 31, 652, 2056, 587, 2799, 1466, 2818, 2306, 2785, 3113, 3246, 738, 382, 3306, 1503, 616, 184, 3142, 3259, 1168, 335, 1831, 1243, 1052, 9, 100, 2557, 1609, 20, 3229, 1640, 2221, 2405, 629, 508, 216, 2961, 2631, 1270, 2931, 1574, 2751, 2361, 2026, 1541, 210, 1043, 2443, 1143, 1923, 2032, 2688, 3139, 884, 1725, 644, 200, 2440, 565, 868, 1261, 2603, 2003, 484, 349, 1083, 1599, 1042, 2402, 508, 123, 1624, 352, 1537, 10, 1323, 1047, 1898, 1050, 2852, 2851, 1079, 275, 602, 931, 1956, 3212, 119, 1771, 2944, 2631, 3044, 1561, 725, 3244, 3282, 3236, 2764, 3121, 2703, 209, 3152, 120, 1035, 2101, 2675, 1320, 724, 2295, 1034, 504, 398, 3117, 13, 955, 1287, 2680, 2963, 2382, 415, 2417, 3284, 2099, 1668, 926, 3039, 2604, 1481, 438, 2263, 896, 1430, 1101, 494, 332, 3042, 2114, 2219, 1788, 1194, 2630, 589, 455, 2802, 1218, 2933, 865, 2761, 1921, 1625, 1521, 1448, 978, 514, 3153, 2354, 11, 3165, 3203, 12, 1042, 2122, 493, 1980, 1363, 947, 205, 672, 1565, 247, 918, 2205, 2249, 2083, 665, 672, 1724, 3326, 178, 341, 683, 1306, 2359, 2343, 578, 1846, 1704, 1676, 1248, 750, 3062, 712, 2959, 2430, 3004, 2082, 945, 548, 8, 3003, 3020, 2994, 1248, 2782, 2460, 1158, 3313, 2543, 1244, 721, 1804, 537, 924, 1560, 915, 1428, 1599, 490, 1916, 2237, 2342, 3031, 2823, 2350, 1063, 2087, 1721, 1099, 2391, 1478, 674]]] r: [[0, 2, 3328, 3328, 3327, 0, 0, 1, 3328, 0, 3328, 3328, 1, 2, 3328, 1, 3328, 0, 0, 0, 0, 1, 3, 0, 2, 2, 0, 0, 0, 0, 3327, 0, 3328, 2, 1, 0, 0, 0, 2, 0, 1, 0, 3328, 3327, 0, 3328, 1, 0, 1, 1, 3327, 0, 1, 1, 3327, 0, 0, 1, 1, 3328, 3327, 3328, 0, 0, 0, 0, 3328, 0, 0, 3327, 0, 0, 1, 0, 1, 3328, 3328, 2, 1, 1, 3328, 2, 3328, 1, 3328, 0, 0, 1, 0, 2, 0, 1, 2, 3328, 3328, 1, 1, 1, 1, 2, 3327, 1, 1, 1, 0, 3328, 0, 1, 2, 3328, 3328, 3328, 1, 1, 0, 3328, 1, 3328, 0, 3328, 3327, 1, 1, 1, 1, 0, 3328, 0, 1, 3328, 3326, 3327, 0, 1, 0, 3, 0, 1, 3328, 3328, 3327, 2, 1, 3, 1, 3327, 0, 1, 3328, 2, 0, 3327, 0, 3328, 3327, 0, 2, 1, 3328, 1, 1, 0, 3328, 3328, 1, 3328, 0, 3328, 3328, 3328, 1, 3328, 1, 1, 1, 1, 1, 0, 3327, 3328, 0, 1, 0, 3328, 0, 0, 3328, 0, 1, 1, 0, 2, 1, 1, 3326, 3, 3328, 3328, 3328, 0, 1, 3327, 0, 3327, 1, 0, 3328, 0, 0, 0, 3328, 2, 1, 1, 0, 0, 3328, 0, 0, 0, 3328, 0, 0, 1, 0, 2, 3327, 3328, 2, 2, 1, 3328, 1, 1, 0, 0, 3328, 1, 1, 1, 0, 3327, 3328, 3328, 3327, 3327, 0, 0, 3328, 1, 1, 3328, 2, 1, 0, 0], [3328, 3328, 1, 1, 2, 3328, 3328, 1, 3327, 1, 3328, 3327, 3, 0, 0, 3328, 0, 0, 1, 0, 0, 3328, 1, 3328, 3328, 1, 3328, 3328, 3, 0, 3327, 1, 3328, 1, 2, 0, 3328, 3328, 0, 3328, 1, 3328, 3328, 2, 2, 1, 1, 1, 1, 0, 3328, 1, 3328, 3327, 0, 0, 3328, 1, 0, 3328, 0, 0, 3326, 0, 2, 0, 3328, 0, 0, 3327, 0, 1, 0, 2, 2, 1, 3328, 3327, 1, 3, 3328, 3327, 1, 1, 0, 1, 3328, 3327, 3327, 0, 1, 3, 3328, 0, 1, 3327, 0, 3328, 2, 0, 3328, 0, 2, 3327, 1, 3328, 1, 3328, 3328, 3328, 1, 1, 3327, 0, 3326, 3328, 2, 3327, 0, 3, 1, 0, 2, 2, 1, 0, 0, 0, 1, 3327, 1, 2, 2, 2, 3327, 1, 1, 3328, 0, 3328, 2, 1, 0, 1, 1, 1, 0, 0, 3328, 3328, 2, 0, 3328, 1, 0, 1, 1, 3327, 3328, 3327, 1, 3328, 3328, 3328, 2, 0, 0, 0, 0, 1, 0, 0, 0, 1, 3327, 3326, 3327, 0, 0, 1, 0, 1, 1, 0, 3326, 2, 0, 0, 0, 1, 3327, 1, 2, 1, 3327, 1, 0, 2, 1, 0, 3327, 0, 0, 3328, 3328, 1, 3327, 3327, 2, 0, 1, 3328, 3326, 3328, 3328, 0, 3328, 1, 3328, 0, 0, 3328, 1, 0, 3328, 1, 1, 0, 1, 1, 1, 1, 3328, 0, 3328, 0, 1, 0, 1, 1, 1, 3327, 1, 2, 0, 3328, 1, 0, 1, 2, 0, 0, 0, 1, 2, 3328]] e1: [[3328, 0, 0, 1, 2, 0, 3328, 0, 3328, 0, 0, 2, 3328, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 3328, 3327, 3328, 2, 0, 0, 1, 0, 1, 0, 2, 1, 3328, 1, 3328, 0, 1, 2, 0, 1, 0, 0, 0, 3328, 3327, 0, 1, 3328, 3327, 0, 1, 1, 1, 3328, 0, 3328, 0, 1, 0, 3328, 3328, 3328, 0, 0, 0, 0, 0, 0, 3327, 1, 0, 3327, 0, 3328, 0, 0, 0, 3327, 3328, 3327, 1, 3328, 0, 3328, 0, 2, 2, 3328, 3328, 2, 1, 0, 0, 0, 1, 3327, 3327, 3328, 3327, 3328, 1, 3327, 0, 0, 0, 0, 1, 1, 3327, 0, 0, 1, 0, 0, 3328, 0, 0, 0, 1, 3328, 1, 3327, 0, 3328, 3328, 0, 2, 1, 3328, 0, 3328, 1, 3328, 3328, 3328, 1, 3328, 0, 0, 3328, 0, 0, 1, 2, 3327, 1, 1, 0, 3328, 2, 3328, 1, 1, 1, 0, 1, 0, 2, 0, 0, 2, 0, 1, 0, 0, 2, 3328, 0, 3327, 3328, 3328, 0, 2, 1, 3328, 1, 0, 3328, 0, 3328, 0, 1, 1, 3328, 3328, 3328, 1, 1, 3328, 3327, 0, 3328, 0, 0, 3328, 0, 1, 3328, 0, 1, 1, 3328, 3328, 3328, 1, 0, 2, 3327, 2, 3327, 1, 0, 1, 3328, 2, 3328, 3327, 1, 0, 0, 3328, 0, 3328, 1, 1, 0, 3328, 0, 1, 0, 2, 0, 3328, 3328, 2, 0, 0, 3328, 2, 3327, 0, 0, 0, 3328, 0, 1, 3328, 3328, 0, 0, 3328, 1, 0], [1, 0, 0, 0, 0, 0, 1, 0, 0, 3327, 0, 0, 3328, 0, 3328, 3328, 1, 2, 1, 0, 0, 0, 0, 2, 3328, 1, 0, 1, 2, 3327, 2, 0, 3327, 0, 1, 1, 0, 2, 1, 0, 1, 2, 0, 2, 3328, 3328, 0, 1, 1, 0, 0, 0, 0, 3328, 0, 0, 1, 2, 0, 0, 2, 0, 3328, 3328, 1, 0, 1, 0, 2, 3328, 0, 0, 0, 0, 2, 3328, 1, 0, 0, 3328, 1, 2, 0, 0, 0, 0, 2, 3328, 0, 0, 3328, 3327, 1, 0, 3328, 3328, 1, 2, 0, 0, 0, 0, 1, 1, 3328, 1, 3328, 3328, 0, 3328, 2, 0, 3328, 0, 3328, 0, 1, 1, 0, 1, 3328, 0, 3327, 0, 0, 0, 1, 3328, 3328, 3327, 1, 0, 0, 0, 3328, 1, 3328, 1, 3328, 3328, 1, 3328, 0, 1, 1, 3328, 1, 3328, 0, 2, 1, 3328, 3328, 3327, 3328, 2, 0, 0, 1, 1, 1, 0, 1, 1, 0, 0, 2, 0, 0, 3328, 1, 0, 1, 0, 3327, 0, 0, 1, 0, 1, 3327, 3328, 0, 0, 1, 3328, 0, 1, 1, 3328, 0, 0, 3328, 3327, 3328, 2, 0, 3328, 3328, 3328, 0, 0, 3328, 3327, 0, 1, 0, 0, 3328, 0, 0, 3328, 1, 0, 3328, 3328, 3328, 0, 2, 0, 0, 3328, 3327, 0, 0, 2, 3328, 1, 0, 3328, 3328, 3328, 3328, 3328, 1, 3328, 0, 0, 0, 0, 0, 3328, 1, 1, 3327, 0, 3328, 1, 3328, 1, 3327, 1, 1, 1, 0, 1]] e2: [1, 1, 1, 3328, 0, 3328, 0, 1, 0, 0, 3328, 1, 3328, 1, 3328, 1, 3328, 3328, 3328, 1, 0, 0, 3327, 0, 0, 3328, 1, 2, 0, 0, 2, 1, 3328, 0, 1, 0, 3328, 3328, 0, 3328, 3327, 3328, 1, 1, 0, 3328, 3328, 0, 0, 3328, 3328, 1, 0, 3328, 0, 0, 3328, 0, 2, 0, 0, 1, 0, 2, 3328, 0, 3327, 0, 1, 1, 0, 1, 2, 1, 1, 1, 0, 0, 0, 1, 3327, 1, 0, 0, 3327, 0, 1, 0, 1, 0, 1, 3327, 3327, 2, 0, 0, 1, 1, 3328, 3328, 0, 3328, 3327, 0, 1, 3327, 2, 1, 1, 3328, 1, 2, 3328, 0, 3328, 3328, 1, 2, 3327, 3328, 1, 0, 3328, 3328, 0, 0, 2, 0, 0, 0, 1, 0, 3328, 3328, 0, 1, 3328, 3328, 1, 0, 2, 3328, 3327, 0, 3328, 3328, 3328, 1, 3328, 1, 0, 1, 0, 0, 1, 3327, 3327, 3328, 0, 0, 3328, 3327, 1, 3328, 3327, 2, 3328, 3327, 2, 1, 3328, 1, 0, 0, 0, 0, 1, 1, 3327, 0, 0, 0, 1, 0, 1, 1, 3328, 1, 3328, 3327, 1, 1, 2, 3328, 0, 3328, 1, 3328, 0, 3328, 0, 3328, 0, 0, 1, 0, 3328, 0, 1, 3327, 3328, 1, 0, 1, 1, 0, 3328, 3328, 3327, 3328, 3328, 0, 3328, 0, 3328, 0, 2, 3328, 0, 0, 3328, 0, 1, 0, 0, 0, 1, 3328, 0, 0, 0, 0, 0, 3328, 3328, 0, 0, 1, 0, 0, 0, 3328, 0, 0, 0, 0] rHat: [[1859, 3002, 1459, 1664, 1376, 1748, 2271, 3230, 32, 2576, 2658, 234, 3252, 1763, 1324, 635, 2205, 1894, 953, 1375, 1659, 1649, 2944, 2869, 3176, 3103, 2306, 1553, 304, 2679, 735, 561, 3117, 2017, 527, 888, 1853, 2191, 290, 228, 1274, 992, 1359, 2416, 1481, 2617, 3153, 606, 1072, 333, 1630, 833, 3030, 303, 1331, 1900, 566, 2927, 2126, 1823, 443, 442, 2283, 2262, 2674, 2690, 1286, 2859, 1166, 1385, 3056, 2408, 2850, 1495, 456, 2051, 2040, 2554, 2907, 1943, 1514, 2826, 2020, 242, 3276, 2554, 3119, 961, 1246, 955, 1608, 2697, 2451, 2670, 624, 27, 2372, 2130, 2136, 1820, 2375, 2146, 900, 1655, 2891, 2826, 2141, 2689, 528, 2409, 3135, 1014, 32, 2279, 621, 1779, 92, 1908, 1162, 2040, 247, 2523, 1911, 2141, 2085, 2, 1687, 2853, 1528, 1671, 528, 3000, 3040, 2018, 916, 114, 3196, 2196, 1876, 2508, 834, 2437, 1645, 1148, 2659, 1543, 2292, 2399, 1537, 1178, 2860, 821, 1578, 3039, 232, 1732, 2079, 1299, 494, 569, 2828, 1488, 2407, 2593, 1112, 13, 1233, 2269, 3199, 1034, 877, 3029, 2671, 3055, 2567, 3092, 1890, 3208, 1855, 2280, 2708, 2264, 2801, 1973, 418, 2370, 1785, 783, 694, 1755, 854, 2507, 2007, 236, 3197, 1625, 1632, 2522, 1555, 2027, 2927, 2840, 196, 2435, 1109, 1797, 1761, 2465, 2047, 500, 3248, 2507, 264, 2913, 970, 1505, 1122, 92, 1797, 3092, 1663, 56, 2334, 1668, 2254, 1771, 1780, 336, 1603, 2375, 767, 1679, 1510, 960, 2645, 3091, 430, 162, 2121, 3036, 122, 77, 3026, 2312, 2055, 2452, 889, 317, 1522, 1817, 392, 961, 1157, 1355, 1763, 1747], [1396, 1200, 448, 2954, 1293, 2927, 1975, 933, 146, 1434, 2041, 2095, 1823, 2620, 711, 3141, 3152, 634, 1182, 416, 2474, 3280, 373, 1316, 3262, 1169, 1558, 342, 3177, 2735, 1538, 2137, 2401, 612, 2490, 2924, 1880, 2579, 1096, 319, 2294, 733, 1086, 2039, 2071, 2171, 1240, 2471, 2139, 128, 2939, 3175, 1350, 1374, 514, 2979, 748, 952, 475, 736, 110, 2567, 2024, 2719, 1812, 1023, 461, 2623, 1349, 666, 1226, 1488, 1629, 1294, 2623, 915, 2983, 1747, 2993, 2606, 3025, 188, 10, 209, 442, 3283, 1173, 4, 1504, 863, 1856, 3033, 174, 2137, 196, 2844, 3298, 3089, 2877, 596, 200, 1804, 2530, 1811, 136, 2285, 311, 230, 3322, 545, 352, 845, 755, 2275, 862, 1616, 2317, 1392, 3128, 1985, 3134, 1629, 686, 966, 1910, 3087, 3254, 1306, 1292, 116, 837, 2114, 1743, 2539, 3135, 204, 701, 2656, 86, 3181, 2501, 76, 3004, 2133, 2417, 2131, 1991, 2393, 918, 1488, 3269, 3160, 706, 1302, 2173, 1038, 967, 1768, 492, 115, 3320, 2759, 529, 108, 665, 2759, 1220, 248, 2926, 752, 846, 2846, 1462, 1596, 2427, 751, 190, 1171, 2597, 2740, 455, 938, 2866, 625, 2233, 2336, 2325, 2919, 1381, 3180, 2262, 1224, 2516, 1913, 265, 2104, 1209, 1718, 1463, 775, 2554, 373, 2742, 1494, 2545, 3025, 2248, 624, 3239, 2439, 449, 532, 1068, 2300, 1901, 1495, 2063, 1745, 2759, 369, 1118, 380, 534, 1496, 1212, 2392, 2617, 2525, 600, 445, 989, 2228, 1947, 2183, 614, 1039, 3244, 1482, 1104, 2314, 2300, 1219, 3155, 1912, 1283, 3011, 2028, 2021, 2450, 1424, 397, 3255, 868, 726, 1577, 409]] BHat * rHat: [[368, 1205, 1220, 520, 154, 1973, 2334, 175, 6, 1926, 228, 2816, 2562, 776, 1737, 1513, 278, 1914, 970, 553, 1784, 304, 2153, 2947, 1926, 2330, 2242, 3027, 397, 1160, 1904, 3038, 1905, 1497, 136, 1610, 49, 956, 1788, 3025, 871, 434, 1904, 1621, 2582, 1159, 1123, 140, 245, 947, 2166, 1148, 193, 1888, 3004, 2795, 18, 993, 2139, 2998, 691, 1431, 3146, 3156, 1242, 1383, 884, 913, 1753, 2866, 551, 2793, 1156, 2944, 573, 2610, 48, 1200, 1886, 2051, 2708, 1526, 2290, 273, 1678, 692, 3273, 1775, 1278, 508, 525, 1953, 783, 1418, 1755, 108, 395, 3184, 1456, 941, 2814, 519, 686, 3136, 2684, 2798, 2114, 1842, 543, 2400, 1959, 1800, 2907, 2908, 1920, 3210, 1412, 962, 2146, 1408, 1544, 823, 117, 3120, 2163, 457, 2644, 2044, 1122, 1152, 2660, 2959, 1642, 1062, 1741, 3080, 871, 864, 308, 2753, 339, 806, 139, 3011, 1971, 1603, 2145, 123, 2336, 2806, 457, 688, 1029, 695, 53, 2840, 2805, 408, 627, 807, 582, 1401, 1811, 2468, 2358, 1227, 2756, 2077, 378, 1309, 2573, 56, 3211, 681, 1068, 2073, 1192, 1140, 2575, 616, 1358, 905, 844, 2698, 2080, 940, 2319, 2494, 1765, 2141, 2472, 481, 3018, 2430, 2143, 1889, 2830, 2952, 504, 1247, 2757, 1505, 988, 686, 1329, 819, 1862, 3132, 1960, 3127, 1861, 876, 1097, 756, 2717, 1710, 684, 597, 1092, 40, 327, 1993, 166, 2921, 2705, 1982, 1623, 923, 834, 1437, 2807, 2587, 1767, 3154, 2628, 3121, 1448, 3326, 3151, 1804, 510, 2297, 1591, 1044, 2990, 1828, 1594, 3275, 1853, 2537, 74, 1059, 1517, 3148, 2724, 1788], [1636, 1928, 1024, 2513, 1985, 3275, 3080, 2495, 1462, 969, 2904, 828, 2133, 129, 825, 1494, 783, 1421, 1070, 662, 2001, 2652, 1188, 2452, 3310, 45, 1085, 2849, 576, 1640, 2429, 1386, 1894, 2809, 2880, 130, 1433, 688, 643, 2448, 1633, 2777, 1211, 2426, 1359, 3299, 647, 1961, 2675, 2079, 1358, 1475, 870, 2074, 2210, 2549, 2408, 2109, 274, 2941, 3102, 2704, 1180, 2510, 1089, 1668, 2851, 1457, 3319, 2836, 3093, 1585, 1370, 490, 678, 2338, 2127, 613, 1276, 3149, 876, 2110, 706, 2841, 3048, 2488, 2486, 2741, 2140, 927, 978, 1442, 2152, 1703, 674, 23, 756, 726, 1217, 2849, 2528, 490, 2623, 567, 3169, 1953, 3299, 2067, 2221, 3123, 1904, 2555, 2139, 206, 70, 1099, 669, 246, 2799, 2828, 2592, 1005, 20, 306, 2115, 2917, 3153, 742, 2101, 2586, 1482, 280, 662, 1151, 2084, 3000, 1456, 1509, 292, 2914, 3324, 646, 1909, 2950, 479, 348, 1411, 1216, 1351, 638, 328, 269, 3032, 2445, 1910, 465, 1969, 45, 1360, 582, 3214, 97, 320, 298, 834, 2023, 2199, 2401, 38, 1438, 965, 720, 152, 965, 2348, 659, 19, 682, 1588, 2416, 243, 1944, 921, 1739, 992, 823, 2542, 1942, 70, 1907, 2200, 1180, 2479, 2947, 1587, 2559, 87, 1132, 2621, 369, 171, 1557, 79, 1261, 2623, 2305, 3189, 2226, 3024, 1626, 2158, 516, 868, 792, 2069, 2995, 1730, 2263, 1905, 1092, 484, 2507, 1082, 888, 2070, 654, 3190, 292, 307, 3161, 2697, 1986, 1403, 901, 2761, 848, 1786, 3312, 887, 1446, 2556, 2197, 3007, 1821, 3095, 2429, 2910, 432, 2448, 2364, 2541, 3066, 338, 2861, 2803, 1919]] NTTInverse(BHat * rHat): [[1954, 1346, 1561, 2402, 2082, 2172, 713, 1618, 1556, 529, 545, 2116, 171, 357, 2189, 3225, 3041, 2117, 2709, 2684, 3018, 2481, 2380, 1743, 2956, 483, 975, 2951, 2508, 3057, 3225, 1070, 85, 973, 2803, 2854, 1088, 1105, 941, 942, 2284, 1184, 2830, 351, 778, 1567, 946, 2593, 1283, 1569, 949, 510, 1102, 731, 2200, 979, 1697, 746, 149, 815, 1370, 3069, 2156, 567, 1978, 1277, 1928, 1699, 2594, 692, 1890, 1503, 351, 1925, 116, 166, 477, 2961, 610, 1142, 1327, 1668, 3139, 157, 2415, 1690, 3073, 345, 573, 443, 2931, 2937, 2767, 1411, 182, 654, 2084, 1922, 2702, 842, 1372, 1301, 2641, 1946, 747, 609, 1712, 946, 3109, 1556, 1444, 2571, 2267, 1509, 439, 1361, 1534, 1436, 2768, 57, 120, 2808, 811, 2091, 2616, 131, 1488, 2424, 1942, 628, 3110, 1074, 1418, 2568, 2945, 3253, 3110, 124, 765, 2421, 9, 2064, 312, 1484, 2794, 893, 2175, 1546, 784, 508, 9, 923, 1413, 1065, 470, 253, 1991, 1815, 1833, 1769, 3274, 1658, 3097, 1726, 2606, 60, 607, 2184, 2823, 2430, 3153, 2004, 920, 1765, 1626, 1603, 1327, 2325, 1038, 1466, 778, 3034, 599, 1194, 184, 3145, 501, 46, 289, 492, 3072, 403, 437, 1497, 1863, 1357, 919, 1662, 1113, 1337, 3275, 3063, 1770, 1536, 3051, 479, 1648, 2206, 634, 2823, 2888, 3126, 2092, 818, 182, 2386, 1232, 991, 2450, 2050, 2001, 3081, 1879, 1756, 1462, 624, 17, 568, 2531, 777, 3075, 2684, 21, 1727, 830, 3229, 2334, 1453, 767, 2059, 1720, 796, 780, 2562, 2477, 317, 2187, 2862, 1023, 529, 3141, 1628, 1585, 277, 3106, 2480], [586, 3093, 251, 2710, 1969, 1081, 1181, 1433, 1108, 1107, 399, 1048, 1366, 846, 1998, 743, 579, 929, 2878, 2923, 2512, 3241, 3252, 488, 1180, 2798, 1010, 2834, 2825, 676, 3105, 96, 2148, 2627, 2882, 1152, 1968, 426, 2390, 1936, 192, 862, 1317, 3292, 656, 3276, 720, 2661, 3090, 3067, 737, 704, 145, 242, 1123, 1712, 2929, 2776, 1057, 1762, 3244, 411, 3232, 601, 1888, 2482, 1298, 2287, 1461, 944, 1142, 1309, 1950, 1886, 1819, 2243, 3025, 1056, 1745, 477, 3109, 2099, 2219, 1725, 1167, 1732, 2222, 1571, 1718, 1644, 2529, 1252, 3249, 1127, 3209, 3170, 3312, 3303, 8, 1399, 3073, 3274, 3053, 2501, 1481, 2432, 3245, 1518, 1784, 1459, 2310, 3195, 1629, 1507, 1421, 1794, 490, 63, 899, 1656, 726, 3219, 2191, 309, 1422, 733, 355, 2857, 3324, 303, 1906, 1805, 70, 2561, 3031, 728, 1303, 1262, 848, 156, 569, 3106, 1308, 750, 2230, 3038, 1640, 2623, 623, 1655, 2795, 1206, 2318, 2756, 1525, 151, 1031, 1432, 2378, 2271, 1804, 726, 669, 1265, 4, 404, 2758, 1879, 1089, 2790, 2088, 1287, 1111, 2643, 327, 2684, 2948, 2247, 1555, 2490, 1601, 234, 2484, 192, 1495, 1157, 3328, 1183, 3049, 2748, 127, 2047, 659, 3158, 1596, 2146, 3287, 228, 1064, 920, 3096, 40, 359, 328, 1253, 3247, 334, 37, 1873, 1937, 1208, 1138, 2190, 3215, 1318, 2667, 1805, 460, 453, 1732, 499, 597, 381, 954, 2752, 1798, 1608, 3056, 3274, 3082, 2792, 2553, 2056, 635, 1935, 59, 909, 2448, 2486, 3161, 1121, 1408, 1591, 529, 1193, 1237, 1590, 506, 31, 2969, 1477, 2038, 1469, 1581, 1873, 3069]] u = NTTInverse(BHat * rHat) + e1: [[1953, 1346, 1561, 2403, 2084, 2172, 712, 1618, 1555, 529, 545, 2118, 170, 357, 2189, 3225, 3041, 2117, 2709, 2685, 3019, 2481, 2381, 1742, 2954, 482, 977, 2951, 2508, 3058, 3225, 1071, 85, 975, 2804, 2853, 1089, 1104, 941, 943, 2286, 1184, 2831, 351, 778, 1567, 945, 2591, 1283, 1570, 948, 508, 1102, 732, 2201, 980, 1696, 746, 148, 815, 1371, 3069, 2155, 566, 1977, 1277, 1928, 1699, 2594, 692, 1890, 1501, 352, 1925, 114, 166, 476, 2961, 610, 1142, 1325, 1667, 3137, 158, 2414, 1690, 3072, 345, 575, 445, 2930, 2936, 2769, 1412, 182, 654, 2084, 1923, 2700, 840, 1371, 1299, 2640, 1947, 745, 609, 1712, 946, 3109, 1557, 1445, 2569, 2267, 1509, 440, 1361, 1534, 1435, 2768, 57, 120, 2809, 810, 2092, 2614, 131, 1487, 2423, 1942, 630, 3111, 1073, 1418, 2567, 2946, 3252, 3109, 123, 766, 2420, 9, 2064, 311, 1484, 2794, 894, 2177, 1544, 785, 509, 9, 922, 1415, 1064, 471, 254, 1992, 1815, 1834, 1769, 3276, 1658, 3097, 1728, 2606, 61, 607, 2184, 2825, 2429, 3153, 2002, 919, 1764, 1626, 1605, 1328, 2324, 1039, 1466, 777, 3034, 598, 1194, 185, 3146, 500, 45, 288, 493, 3073, 402, 435, 1497, 1862, 1357, 919, 1661, 1113, 1338, 3274, 3063, 1771, 1537, 3050, 478, 1647, 2207, 634, 2825, 2886, 3128, 2090, 819, 182, 2387, 1231, 993, 2449, 2048, 2002, 3081, 1879, 1755, 1462, 623, 18, 569, 2531, 776, 3075, 2685, 21, 1729, 830, 3228, 2333, 1455, 767, 2059, 1719, 798, 778, 2562, 2477, 317, 2186, 2862, 1024, 528, 3140, 1628, 1585, 276, 3107, 2480], [587, 3093, 251, 2710, 1969, 1081, 1182, 1433, 1108, 1105, 399, 1048, 1365, 846, 1997, 742, 580, 931, 2879, 2923, 2512, 3241, 3252, 490, 1179, 2799, 1010, 2835, 2827, 674, 3107, 96, 2146, 2627, 2883, 1153, 1968, 428, 2391, 1936, 193, 864, 1317, 3294, 655, 3275, 720, 2662, 3091, 3067, 737, 704, 145, 241, 1123, 1712, 2930, 2778, 1057, 1762, 3246, 411, 3231, 600, 1889, 2482, 1299, 2287, 1463, 943, 1142, 1309, 1950, 1886, 1821, 2242, 3026, 1056, 1745, 476, 3110, 2101, 2219, 1725, 1167, 1732, 2224, 1570, 1718, 1644, 2528, 1250, 3250, 1127, 3208, 3169, 3313, 3305, 8, 1399, 3073, 3274, 3054, 2502, 1480, 2433, 3244, 1517, 1784, 1458, 2312, 3195, 1628, 1507, 1420, 1794, 491, 64, 899, 1657, 725, 3219, 2189, 309, 1422, 733, 356, 2856, 3323, 301, 1907, 1805, 70, 2561, 3030, 729, 1302, 1263, 847, 155, 570, 3105, 1308, 751, 2231, 3037, 1641, 2622, 623, 1657, 2796, 1205, 2317, 2754, 1524, 153, 1031, 1432, 2379, 2272, 1805, 726, 670, 1266, 4, 404, 2760, 1879, 1089, 2789, 2089, 1287, 1112, 2643, 325, 2684, 2948, 2248, 1555, 2491, 1599, 233, 2484, 192, 1496, 1156, 3328, 1184, 3050, 2747, 127, 2047, 658, 3156, 1595, 2148, 3287, 227, 1063, 919, 3096, 40, 358, 326, 1253, 3248, 334, 37, 1872, 1937, 1208, 1137, 2191, 3215, 1317, 2666, 1804, 460, 455, 1732, 499, 596, 379, 954, 2752, 1800, 1607, 3057, 3274, 3081, 2791, 2552, 2055, 634, 1936, 58, 909, 2448, 2486, 3161, 1121, 1407, 1592, 530, 1191, 1237, 1589, 507, 30, 2970, 1475, 2039, 1470, 1582, 1873, 3070]] mu: [0, 0, 0, 0, 1665, 0, 0, 0, 0, 1665, 0, 1665, 1665, 0, 0, 1665, 0, 0, 1665, 0, 0, 1665, 0, 0, 1665, 1665, 1665, 1665, 0, 0, 0, 1665, 0, 0, 0, 1665, 0, 1665, 1665, 1665, 1665, 0, 1665, 0, 0, 0, 0, 0, 1665, 1665, 1665, 1665, 0, 1665, 0, 0, 0, 0, 1665, 0, 0, 0, 0, 1665, 1665, 1665, 1665, 0, 0, 1665, 0, 0, 1665, 1665, 1665, 1665, 1665, 0, 0, 0, 1665, 0, 1665, 0, 1665, 1665, 1665, 1665, 1665, 1665, 0, 1665, 1665, 1665, 1665, 0, 0, 0, 1665, 1665, 0, 1665, 0, 1665, 1665, 0, 1665, 0, 1665, 0, 0, 0, 1665, 1665, 0, 1665, 0, 1665, 1665, 0, 1665, 1665, 0, 1665, 1665, 0, 0, 0, 0, 1665, 1665, 0, 0, 1665, 0, 1665, 1665, 0, 1665, 0, 0, 1665, 0, 1665, 1665, 0, 0, 1665, 0, 0, 0, 0, 1665, 0, 1665, 1665, 0, 0, 1665, 1665, 1665, 0, 1665, 1665, 0, 0, 1665, 1665, 0, 0, 1665, 1665, 1665, 1665, 0, 1665, 1665, 0, 0, 1665, 0, 0, 1665, 1665, 0, 0, 1665, 1665, 0, 1665, 1665, 0, 1665, 0, 1665, 1665, 0, 0, 1665, 1665, 1665, 0, 0, 0, 1665, 1665, 0, 1665, 0, 0, 1665, 1665, 0, 0, 1665, 1665, 0, 0, 0, 1665, 1665, 1665, 0, 1665, 0, 0, 1665, 1665, 1665, 0, 1665, 0, 0, 0, 1665, 0, 0, 1665, 0, 1665, 1665, 1665, 0, 0, 1665, 0, 0, 1665, 1665, 0, 1665, 0, 1665, 0, 0, 0] tHat^T * rHat: [2898, 604, 1851, 197, 557, 1080, 2663, 933, 720, 668, 749, 1062, 1483, 1476, 2960, 3036, 1765, 1359, 218, 2737, 2553, 462, 2252, 354, 1127, 347, 1348, 1699, 2478, 1293, 2625, 906, 2098, 1280, 1579, 728, 149, 3146, 2194, 1059, 1410, 2619, 997, 1785, 2820, 2761, 761, 2061, 181, 2980, 3068, 1359, 1662, 782, 2010, 699, 884, 1048, 617, 624, 1691, 81, 2861, 676, 2791, 206, 2391, 1580, 1438, 850, 1898, 2109, 2720, 1645, 2249, 3107, 2672, 3237, 1103, 468, 910, 594, 1827, 775, 934, 3169, 1070, 1433, 1175, 693, 2250, 320, 2731, 1428, 2938, 2619, 1695, 3008, 2426, 3271, 56, 310, 271, 1992, 107, 2799, 2512, 467, 35, 622, 2631, 1385, 2686, 593, 252, 531, 1783, 1991, 1599, 2361, 3057, 351, 899, 2698, 783, 2618, 1876, 367, 1074, 52, 3165, 1141, 2789, 1714, 3135, 3309, 2522, 1471, 681, 207, 1334, 622, 418, 3034, 1884, 2753, 2536, 2857, 935, 1322, 2436, 1783, 1149, 144, 449, 2373, 3175, 2481, 2831, 2889, 2556, 866, 622, 1406, 2082, 2905, 1659, 753, 2708, 1557, 2755, 186, 2609, 2913, 682, 2745, 2057, 1080, 2787, 1890, 2345, 653, 2151, 2866, 2966, 588, 601, 2193, 459, 502, 727, 1304, 2099, 1200, 1624, 2509, 2910, 20, 1596, 198, 2915, 1272, 701, 1040, 2329, 323, 793, 1409, 2345, 2112, 544, 237, 2468, 1139, 2860, 789, 3030, 577, 352, 1310, 862, 1729, 1967, 2303, 834, 1753, 2271, 356, 3272, 973, 1334, 1513, 552, 42, 325, 2105, 37, 1164, 1976, 166, 1473, 2088, 485, 1945, 454, 666, 288, 2608, 3144, 121, 730, 2849, 1823, 1620, 55, 1461] NTTInverse(tHat^T * rHat): [619, 2111, 495, 3086, 1708, 2575, 1456, 2210, 3041, 2742, 2098, 3252, 2817, 563, 2989, 768, 1240, 1666, 2270, 385, 1667, 52, 3302, 3155, 520, 1750, 742, 2379, 1962, 1056, 2747, 2281, 2575, 131, 2532, 31, 2060, 2972, 2587, 734, 1013, 1051, 2209, 1470, 1552, 2181, 3082, 338, 2982, 1455, 2472, 685, 1576, 1443, 1139, 50, 201, 2373, 1957, 717, 2787, 2950, 3013, 2403, 1364, 361, 2847, 1063, 174, 1698, 1539, 2669, 3038, 636, 659, 2291, 1259, 82, 1523, 581, 2524, 392, 3100, 2847, 1038, 2746, 23, 2669, 1076, 1034, 3234, 2790, 2650, 1380, 3039, 1605, 2565, 127, 2442, 2758, 579, 495, 2510, 3169, 2450, 274, 1849, 1691, 2280, 523, 1361, 252, 108, 2708, 852, 1381, 2999, 714, 2995, 1596, 713, 1402, 1746, 2727, 2152, 2127, 2957, 2889, 3305, 1762, 1863, 715, 3261, 2306, 1267, 1410, 1288, 1353, 3289, 224, 2433, 3119, 2208, 3227, 2664, 2168, 158, 1760, 2356, 965, 1484, 2864, 2377, 297, 227, 2099, 1129, 1150, 132, 34, 865, 2040, 1403, 422, 3202, 2231, 2703, 3013, 1216, 1791, 288, 3235, 1150, 3176, 628, 1581, 2397, 2726, 461, 295, 2414, 3327, 1897, 211, 444, 3181, 2242, 2974, 539, 2391, 3091, 2360, 1393, 2294, 3018, 1880, 1651, 1807, 1370, 448, 1832, 1566, 2529, 1121, 2210, 125, 874, 1002, 3204, 2720, 2624, 2630, 2780, 2283, 3176, 2590, 3282, 2094, 409, 35, 217, 2400, 3143, 649, 118, 242, 1685, 2327, 2268, 1264, 701, 3035, 713, 2364, 2667, 1838, 593, 1713, 1872, 1164, 2830, 700, 742, 2714, 1303, 525, 2451, 338, 652, 1462, 927, 3254, 1730, 534, 2147, 1083] e2 + mu: [1, 1, 1, 3328, 1665, 3328, 0, 1, 0, 1665, 3328, 1666, 1664, 1, 3328, 1666, 3328, 3328, 1664, 1, 0, 1665, 3327, 0, 1665, 1664, 1666, 1667, 0, 0, 2, 1666, 3328, 0, 1, 1665, 3328, 1664, 1665, 1664, 1663, 3328, 1666, 1, 0, 3328, 3328, 0, 1665, 1664, 1664, 1666, 0, 1664, 0, 0, 3328, 0, 1667, 0, 0, 1, 0, 1667, 1664, 1665, 1663, 0, 1, 1666, 0, 1, 1667, 1666, 1666, 1666, 1665, 0, 0, 1, 1663, 1, 1665, 0, 1663, 1665, 1666, 1665, 1666, 1665, 1, 1663, 1663, 1667, 1665, 0, 1, 1, 1664, 1664, 0, 1664, 3327, 1665, 1666, 3327, 1667, 1, 1666, 3328, 1, 2, 1664, 1665, 3328, 1664, 1, 1667, 1663, 3328, 1666, 1665, 3328, 1664, 1665, 0, 2, 0, 0, 1665, 1666, 0, 3328, 1664, 0, 1666, 1664, 3328, 1666, 0, 2, 1664, 3327, 1665, 1664, 3328, 3328, 1666, 3328, 1, 0, 1, 1665, 0, 1666, 1663, 3327, 3328, 1665, 1665, 1664, 3327, 1666, 1664, 3327, 2, 1664, 1663, 2, 1, 1664, 1666, 1665, 1665, 0, 1665, 1666, 1, 3327, 1665, 0, 0, 1666, 1665, 1, 1, 1664, 1666, 3328, 1663, 1666, 1, 1667, 3328, 1665, 1664, 1, 3328, 1665, 1664, 1665, 3328, 0, 0, 1666, 1665, 3328, 1665, 1, 3327, 1664, 1666, 0, 1, 1666, 1665, 3328, 3328, 3327, 1664, 1664, 1665, 3328, 1665, 3328, 0, 1667, 1664, 1665, 0, 1664, 0, 1, 0, 1665, 0, 1, 1664, 0, 1665, 1665, 1665, 0, 3328, 1664, 0, 0, 1666, 1665, 0, 1665, 3328, 1665, 0, 0, 0] v = NTTInverse(tHat^T * rHat) + e2 + mu: [620, 2112, 496, 3085, 44, 2574, 1456, 2211, 3041, 1078, 2097, 1589, 1152, 564, 2988, 2434, 1239, 1665, 605, 386, 1667, 1717, 3300, 3155, 2185, 85, 2408, 717, 1962, 1056, 2749, 618, 2574, 131, 2533, 1696, 2059, 1307, 923, 2398, 2676, 1050, 546, 1471, 1552, 2180, 3081, 338, 1318, 3119, 807, 2351, 1576, 3107, 1139, 50, 200, 2373, 295, 717, 2787, 2951, 3013, 741, 3028, 2026, 1181, 1063, 175, 35, 1539, 2670, 1376, 2302, 2325, 628, 2924, 82, 1523, 582, 858, 393, 1436, 2847, 2701, 1082, 1689, 1005, 2742, 2699, 3235, 1124, 984, 3047, 1375, 1605, 2566, 128, 777, 1093, 579, 2159, 2508, 1505, 787, 272, 187, 1692, 617, 522, 1362, 254, 1772, 1044, 851, 3045, 3000, 2381, 1329, 1595, 2379, 3067, 1745, 1062, 488, 2127, 2959, 2889, 3305, 98, 200, 715, 3260, 641, 1267, 3076, 2952, 1352, 1626, 224, 2435, 1454, 2206, 1563, 999, 2167, 157, 97, 2355, 966, 1484, 2865, 713, 297, 1893, 433, 1127, 1149, 1797, 1699, 2529, 2038, 3069, 2086, 3200, 2233, 1038, 1347, 1218, 1792, 1952, 1572, 2815, 1512, 628, 3246, 734, 2727, 459, 1960, 2414, 3327, 234, 1876, 445, 3182, 577, 1311, 538, 725, 1428, 2361, 3060, 2293, 1354, 215, 1652, 1806, 3035, 2112, 168, 1565, 2529, 1121, 547, 1790, 873, 2667, 3205, 2718, 959, 967, 2780, 2284, 1513, 926, 3281, 2093, 407, 1699, 1881, 736, 3142, 2314, 117, 242, 23, 662, 604, 1264, 2365, 3035, 714, 2364, 1003, 1838, 594, 48, 1872, 2829, 1166, 2365, 742, 2713, 2967, 525, 2451, 2004, 2317, 1462, 2592, 3253, 66, 534, 2147, 1083] c: 597A06DEB88172BA8D7CDE8D82CAA234B8112AF8A72F1AB4CEA1EFCB2D868D53D212E303B70E7E521AB0F4B5DB4F51159248BFB275361BEF883752C78B8D4712275385536A4B0A96E3C23EA6C17EA92B602616E5821E5753A4736C4039C20C923CCECB579805587C0CE72218BB1AB12452F8E154CB8643328142F9B340A641C6F295E5ECF2E048BC7FC79BC5B94277C868D8E536B50425809DCFA024A3905CBA550AD3BB52B459AC38FABC9BC00EBA03EC0906725B4FE4E976F174320047B31D15891365BA482388F0FB973B85224FB00BA865AFAB3C9A1B7D489F7B982D0BD470EF948ECB5B3920AF89035960123B1F8630D763681BFD671567EFBB1E6276AA4FB2DFA9C3948DB7F083F28383B77BC514AF9D68D22E2487C20163C02B0BBF23BBCE0650F84FF8CE02C74E9E11D6F30EC5FA8A012ADC3B89627C7DE855C1FBBEB5DCDE84D05E36C5566E5551B58750A411642639B27864F7E005978FFE256B757D13DA663FC3BB0794A27CF7585D12F22D953B285459FDC9BCDFCDCCB7BF3E4E362D2891D583855F5D9487E6FB217E2E45EE0BD9AFC289F4D564581209A3ACA31795A124BD1BBAEA846755C8EA7810EAA73060E86FB5FDF3FBE72F806BB1BFBFBAC0C7B16BFE74250277ECF5F541571B8A975050917FDF781FEA17B585E3C6DBFE77B1E48A16504C3A38901156100CAFEC2ED939AE9A9EDFC9C0F8C7F55CC93E5DDD0B3DE1C6EDAE2B7EE34C6101F011B5904F693D286356B54C86CE8BCFEA9DBFEC21C1EF0ECC9105005BAA377D829DCA2CBF5EA5F31B71D446B833E00619819D7FC6024052499757A2765F19CD2B36C2488599DC5247494FABE81EEBEFD3BE75C4780E43A50418C5DB2FF359C5A6DE286EF5951E2709486EDC9CC49D0724ECA3F2C0B75F8A36CE862388F00B3C593D1C8C6AC45D73A72FF6B4F805B131ED4EAF5601D7B73B0E3724E75D58DD50F5871C54A37C1481331759F4BE86FB58A2EE003130F66E187C8BA5015BE713296589ACAFBF6596897E03D4920C91F26333B7BF1798AF815C93D4DF55BD47A08249BF113063FBB39503E9B6D43EAC7B0C305A fips203-0.2.1/tests/nist_vectors/Encapsulation -- ML-KEM-768.txt000064400000000000000000001512301046102023000216650ustar 00000000000000Encapsulation -- ML-KEM-768 ek: 1456A2EE8C3556054ABC79B4882C3190E5CA726AB402E5B09728C0F4F79C9FC2ADD828ABE432B1501B60F46CCBC86A3378C34895708A13671B20B389479AAA01C69D6B3B7D07D1C3AB54B91C580F5A336B30069A4F134FFD3764CE73A047E2844771742BF4710B972D4F6590A1C53A975368C271B670F1A4036441054A66E8815997512288552FD7149FFB705AAE133F8414060D0092FA8A1627D78AB2ABC6696288BAF5C60EF370827A7EFA72AE5C6741A5DA043D5940F121485372A98F472D60F05F74D95F01A1991E73A3E0A9536467A4738AB4CF385BA772827EB8CC058B3572E40B598444C181C7F6D9B760A7B907092E9C3351EA234E4449BD9B61A134654E2DA191FF0793961569D3594448BBC2586999A6671EFCA957F3A6699A4A1B2F4707ABA0B2DB20114FE68A4E2815AF3AAC4B8C6BE5648C50CC35C27C57288028D361708D302EEBB860BEE691F656A2550CB321E9293D7516C599817B766BA928B108779A1C8712E74C76841AC58B8C515BF4749BF715984445B2B53063384001E55F68867B1AF46CA70CA8EA74172DB80B5218BDE4F00A0E658DB5A18D94E1427AF7AE358CCEB238772FCC83F10828A4A367D42C4CB6933FDD1C1C7B86AD8B009657A96222D7BA92F527AF877970A83247F47A23FC2285118B57717715204674DA9C94B62BC7838CF87200156B26BA4671159931C49322D80671A0F332EAA2BBF893BE408B9EAC6A505483AA9075BD1368B51F99211F480A9C542A75B5BE08E43ADAF301DD729A85954010E64892A2AA4F15C0BD70B3D856494FF9BA0FE4CE12991CA06B5E3D0B2AF1F797B7A2B760910AE9F833D0D4267A58052C2990F161B886E251711C09D085C3D958B144192C9CC3224A460715B6784EB0B26F237187507D85C5110ACC71CE47198F254553356DAB448C38D243A7C02BE40C908C828D05C081DFAB8FC6B5CFE7D56E7317157DC053B2B3489986B081288871818585E09931095E3274A084115BE276438254A796270A7B4306F08B98D9C2AAECF7065E74446B7C696DBAAF8B4625A10B07827B4A8BABAB09B64AE1C375BB785441F319FB9AC2F14C95FFB252ABBB809C6909CD97706E40691CBA61C9252BD38A04311CA5BB2CA79578347505D0888851E082648BD003BE97C0F8F66759EC96A96A081C6822C4510559537042FC15F069A649B74A10961B354A1F625B04E25B293CF65FB4F53A80CC733D7A175775BF8A9ABB9201620E83A7F3E724D1287DBC44BDD5D85FC71545A927BEEDE537A7768735CC1486C7C3F31104DB67343F435D2D45554BAAC9CDB5822E8422AE8321C78ABE9F261FD4810A79E33E94E63B3341872C92253521997C084FBC060B8B125CCC88AC85AC5FE3168ACB059B3F119C4E050A20732F501BB9B3E687C846B5C2653F8886373E1004A2AB8D1BB970A7E571D8A46EE81B782F26942DD394FDD9A5E4C5631D985528604B1CC976275B6AC8A67CEEC10FFACBBA3D3BB141321DFC3C9231FC96E448B9AB847021E2C8D90C6BCAF2B1240783B62C79DEDC072A5763E660AF2C27C3F0C3C09207CAD990BB41A7BFCEC99F51596A0E83778F85C006AC6D1FE981B4C4BA1CB575A7D07AE2D31BA760095F74BC163841CF8FF77F894ABC6D261ED87A4530363B949C4AD24EFB3A56809478DDA2 m: 40BE9DCAC16E9CA73D49D0C83F9D3D89BB71574A4219A0F393DFECE2988394C4 K: 616E0B753A3B7F40FEF9A389F58F16BFBB04622941D2464BDAE767820DFAC38E r: DF3BF6F2937BC204C19CB6531298C968C4099B04718020BED6C7F3B0D1A33AFB tHat: [[1556, 2597, 3310, 856, 1366, 1184, 2492, 2887, 3208, 786, 1424, 3246, 2674, 2886, 1282, 2830, 2199, 3074, 2036, 2511, 671, 2780, 2264, 2738, 740, 2835, 2896, 1537, 3316, 3254, 2760, 822, 888, 1164, 149, 2215, 1811, 438, 800, 2203, 2631, 2729, 1537, 2524, 2923, 2003, 263, 3133, 1195, 2965, 2076, 245, 858, 1715, 1584, 2464, 847, 1265, 2045, 1603, 974, 2567, 583, 2126, 327, 1863, 1067, 1823, 1803, 729, 1359, 2310, 1441, 940, 919, 1669, 450, 2919, 368, 2639, 1027, 1046, 2565, 1636, 488, 1432, 407, 549, 1416, 757, 1239, 2545, 251, 1447, 942, 1009, 1156, 97, 13, 2336, 2810, 360, 1831, 2221, 2994, 3178, 617, 2182, 1466, 3183, 782, 1807, 2690, 2023, 762, 2791, 1884, 1046, 2725, 77, 2365, 1029, 497, 1154, 595, 2711, 1935, 724, 96, 1535, 2420, 1533, 257, 2458, 798, 2615, 2528, 1338, 1892, 2630, 2675, 2888, 2255, 1459, 679, 2087, 2174, 3275, 2821, 856, 1138, 190, 1113, 1096, 449, 3192, 2550, 2941, 1888, 2970, 2311, 736, 924, 1299, 1002, 1250, 2372, 3028, 411, 2582, 1332, 1254, 301, 2330, 2047, 2352, 1430, 1681, 2515, 1093, 2888, 3115, 2392, 2454, 1958, 486, 2556, 1402, 1779, 1690, 2714, 436, 1839, 116, 171, 2858, 219, 274, 1615, 2222, 2126, 338, 2735, 2755, 3147, 1720, 1253, 2246, 3152, 860, 3266, 1399, 40, 648, 467, 1798, 141, 739, 2283, 1547, 1726, 2334, 1782, 2597, 3157, 2864, 2337, 670, 1341, 359, 2501, 2073, 1659, 1719, 2217, 2834, 1800, 2471, 1820, 296, 3303, 1892, 2692, 3153, 3211, 1304, 1115, 1871, 1947, 351, 1176, 1108, 1458, 779, 2147, 1027], [1281, 1534, 1640, 1976, 1050, 1743, 3239, 2688, 1258, 375, 2093, 187, 2130, 3025, 228, 175, 1294, 2262, 437, 2266, 404, 1070, 1914, 2799, 3125, 3304, 2226, 1907, 3119, 2108, 2289, 640, 932, 1658, 3284, 1218, 950, 1017, 3293, 449, 1659, 2776, 139, 2400, 2391, 1578, 1826, 2989, 1426, 639, 1967, 1944, 2160, 810, 1095, 1967, 3107, 559, 389, 2225, 343, 1911, 21, 1122, 2676, 2509, 1684, 699, 967, 2248, 760, 7, 2837, 614, 1722, 1812, 2325, 793, 964, 553, 1752, 1808, 928, 815, 746, 3002, 1016, 3049, 2880, 2536, 2732, 1286, 852, 2728, 1424, 3031, 2067, 2902, 2335, 537, 2079, 164, 1180, 677, 1397, 3051, 1032, 942, 986, 31, 733, 2471, 1413, 1033, 1552, 1166, 658, 2730, 1359, 3073, 189, 2871, 1752, 1173, 2383, 2991, 1039, 3310, 2322, 457, 2976, 1510, 2877, 672, 2033, 2431, 695, 2938, 352, 169, 2281, 831, 1232, 621, 2170, 85, 2348, 2306, 497, 2950, 646, 1310, 3185, 145, 1488, 3128, 2265, 2837, 2372, 705, 924, 556, 1610, 116, 1557, 1931, 78, 2859, 879, 1810, 135, 2005, 1413, 284, 3082, 1820, 1998, 404, 1423, 1106, 1363, 1747, 1195, 2244, 568, 1085, 167, 700, 3300, 2304, 652, 2264, 5, 2076, 3039, 2298, 1478, 3323, 1511, 1773, 1907, 337, 125, 1340, 946, 1163, 1689, 2824, 2177, 2178, 369, 2136, 133, 2462, 2353, 1504, 1074, 2567, 388, 1457, 1762, 1079, 1154, 2677, 1942, 162, 891, 100, 3056, 2440, 729, 2732, 2028, 111, 1118, 1095, 3179, 1687, 2669, 2811, 1675, 596, 2977, 112, 2946, 1191, 2955, 2746, 1545, 1195, 993, 1884, 2235, 1351, 833, 415], [2811, 3113, 3313, 2388, 767, 1323, 2987, 2059, 2460, 150, 1997, 1801, 110, 1684, 2588, 1563, 1481, 690, 2771, 72, 3121, 2641, 3259, 2674, 2197, 839, 1397, 3328, 2184, 1304, 736, 1608, 139, 61, 1982, 3081, 1784, 1663, 3161, 2414, 2729, 134, 2076, 550, 452, 85, 857, 1797, 3138, 351, 2544, 2662, 1865, 1195, 1552, 441, 2613, 500, 2914, 69, 3042, 661, 1596, 1535, 1460, 943, 3200, 1852, 2621, 375, 1367, 3063, 2698, 3001, 402, 1568, 782, 2680, 2035, 590, 2257, 2002, 1212, 3028, 2261, 1533, 1479, 1105, 1961, 3042, 1517, 894, 1703, 2167, 3125, 332, 1926, 3132, 499, 65, 2011, 838, 831, 1492, 1325, 1364, 2635, 3226, 1485, 2091, 1070, 552, 942, 536, 2759, 3048, 1695, 498, 468, 168, 889, 1006, 1684, 958, 307, 2164, 556, 601, 309, 2450, 2172, 1264, 1724, 176, 651, 1473, 2252, 2760, 3205, 1530, 1763, 2209, 1483, 2480, 319, 2497, 1358, 160, 800, 759, 2896, 2961, 1715, 2174, 1736, 2900, 1474, 1014, 1672, 888, 62, 65, 2978, 2266, 2331, 1803, 1447, 1822, 1240, 1770, 3048, 1921, 1583, 2370, 813, 2381, 2557, 2653, 1508, 1596, 2077, 1369, 40, 1206, 2332, 1900, 2855, 1701, 1736, 1994, 494, 252, 3066, 2988, 2877, 2835, 577, 467, 3324, 2339, 3121, 2415, 2276, 2964, 1195, 1800, 545, 3214, 3289, 1712, 714, 2847, 1828, 2096, 3254, 1938, 3294, 125, 1834, 1589, 230, 2806, 1836, 3122, 1008, 3084, 1938, 3232, 217, 3001, 1857, 3066, 2510, 2556, 2385, 1701, 782, 1912, 1423, 3080, 3078, 1754, 2335, 2078, 1204, 2988, 1308, 1883, 167, 1965, 994, 445, 167, 150, 1119, 3015]] bHat = aHat^T: [[[2269, 1855, 3190, 1178, 1407, 2272, 1027, 2845, 2746, 1751, 72, 2945, 186, 951, 2139, 1192, 680, 13, 3106, 1489, 1902, 3294, 1138, 763, 1831, 2818, 2977, 177, 3258, 2714, 132, 2734, 1592, 2562, 2053, 1789, 171, 1288, 1286, 1162, 2581, 871, 3022, 2765, 2169, 2217, 364, 2465, 3320, 1916, 2379, 3095, 25, 1543, 878, 1779, 800, 2024, 2207, 141, 2080, 2214, 2974, 2486, 949, 2890, 654, 456, 1555, 1042, 3113, 3294, 1991, 2229, 807, 2276, 793, 2593, 697, 2451, 3284, 1578, 2676, 2117, 2859, 3327, 2070, 1825, 1276, 2330, 2798, 1535, 2196, 1129, 3215, 2831, 481, 1140, 2006, 3157, 3212, 1426, 1295, 1075, 1239, 2423, 506, 830, 1351, 1221, 1433, 3291, 1535, 2310, 1752, 2368, 1473, 3212, 488, 2120, 361, 2503, 1924, 2448, 65, 675, 94, 2918, 1555, 659, 816, 2161, 2494, 2824, 2991, 2262, 153, 282, 2985, 1424, 1414, 1752, 2365, 1838, 98, 1268, 2494, 1658, 2630, 1054, 737, 895, 3230, 2826, 63, 192, 2911, 659, 1305, 2323, 2139, 2689, 3031, 254, 1240, 1531, 860, 2771, 2364, 2679, 248, 2788, 1488, 755, 1952, 227, 1322, 1020, 2194, 2163, 2193, 885, 2056, 3150, 993, 462, 850, 84, 289, 2921, 1854, 1563, 1042, 21, 3224, 156, 2831, 2807, 1620, 1073, 2186, 2767, 210, 393, 1354, 1184, 3130, 115, 221, 2358, 761, 1914, 753, 2891, 3316, 3254, 1656, 1645, 203, 1911, 1625, 1173, 2392, 2401, 1360, 409, 1594, 827, 2260, 249, 1195, 2382, 1151, 2177, 284, 1040, 2926, 436, 2523, 2038, 2498, 793, 2840, 2954, 2997, 2117, 991, 2190, 1337, 1771, 1975, 1077, 127, 17, 3033, 2498], [1095, 705, 1916, 1081, 375, 739, 1365, 2439, 2118, 2041, 630, 1130, 1568, 2436, 2929, 179, 2991, 2512, 1633, 409, 2913, 1810, 2503, 1023, 442, 79, 1857, 2823, 2818, 2645, 2864, 115, 2145, 2331, 2676, 1861, 3203, 3117, 473, 468, 2784, 146, 76, 964, 849, 2961, 2280, 2558, 809, 205, 2824, 3082, 2492, 2018, 1903, 1673, 288, 1722, 2343, 541, 3203, 2841, 2345, 89, 3320, 236, 2280, 1391, 1597, 2273, 2533, 548, 507, 355, 1546, 2739, 2543, 2558, 270, 1315, 2722, 3212, 2848, 1869, 1600, 1787, 1175, 2023, 2586, 1523, 1641, 3305, 884, 1276, 1421, 1807, 837, 358, 2362, 601, 691, 2324, 393, 1846, 316, 2699, 3078, 1634, 1142, 2404, 1387, 1191, 2397, 1426, 1479, 290, 59, 1215, 1201, 3293, 2873, 972, 2165, 678, 2008, 3298, 2638, 2180, 2714, 2381, 1550, 1804, 204, 945, 2851, 416, 2770, 1122, 1142, 2013, 694, 2295, 2307, 2635, 682, 608, 1151, 1950, 2841, 1866, 559, 1316, 1155, 494, 1501, 876, 148, 2667, 2921, 2072, 1265, 3, 84, 404, 484, 275, 3096, 2436, 2642, 2678, 1642, 1481, 790, 850, 965, 514, 2246, 3019, 2008, 113, 1267, 3155, 2372, 2496, 2165, 1187, 936, 405, 574, 1843, 1622, 903, 1312, 1797, 3257, 1665, 108, 3116, 3068, 2422, 2209, 1731, 2095, 1288, 885, 2155, 2203, 1623, 1471, 2778, 473, 1017, 2698, 1997, 2531, 2057, 453, 2846, 3136, 1563, 206, 2211, 2232, 755, 1246, 2544, 1244, 76, 2249, 2612, 2928, 1830, 577, 532, 1204, 2859, 19, 1381, 788, 2405, 33, 1178, 3207, 2113, 753, 1473, 3013, 749, 1239, 601, 2943, 482, 2855, 2388, 2022, 965], [2208, 2157, 2178, 1185, 1280, 2238, 2077, 2805, 2681, 3221, 752, 750, 2988, 1739, 1339, 2432, 186, 2001, 1032, 2098, 1649, 3054, 2910, 1141, 1887, 2610, 1111, 509, 1407, 1690, 2802, 582, 3214, 2829, 3008, 1659, 3211, 1666, 117, 762, 2108, 1902, 2916, 2419, 2439, 219, 1625, 2854, 176, 1682, 2301, 1044, 854, 3050, 1592, 1156, 463, 2845, 2283, 2646, 1915, 638, 2554, 2814, 1146, 1244, 2721, 962, 1392, 3156, 533, 2553, 2823, 2209, 2963, 285, 1290, 2703, 1093, 1772, 829, 1851, 1800, 1326, 909, 2644, 1913, 496, 3012, 1380, 649, 3224, 394, 315, 2323, 3201, 3295, 1217, 3031, 2329, 1190, 944, 977, 1204, 2562, 1434, 1898, 2948, 1640, 3097, 55, 2132, 2496, 302, 2697, 965, 810, 17, 953, 2697, 1842, 1345, 2684, 1497, 920, 13, 622, 3014, 1256, 3030, 2553, 1521, 583, 739, 1351, 1958, 1743, 2987, 2572, 60, 474, 834, 2627, 884, 983, 1577, 3297, 1625, 1669, 465, 1636, 1264, 2673, 3302, 2050, 647, 532, 611, 483, 24, 2714, 3037, 3039, 2707, 2341, 3233, 3154, 736, 2547, 2014, 2763, 99, 3280, 3226, 1960, 1007, 380, 2517, 349, 333, 2684, 1316, 1790, 3321, 2929, 1941, 32, 229, 1338, 701, 1491, 822, 1221, 2419, 1831, 1198, 570, 2512, 2922, 367, 1496, 766, 1, 909, 1160, 2469, 652, 29, 403, 604, 31, 79, 466, 3082, 2291, 701, 578, 100, 1781, 1286, 2720, 106, 892, 667, 3156, 1299, 3256, 2328, 2608, 2933, 1728, 3035, 952, 3294, 2879, 2234, 1192, 510, 309, 1038, 3122, 1590, 608, 2798, 561, 1073, 2259, 152, 2552, 1574, 1697, 846, 2698, 3074, 1195, 1963]], [[1071, 2351, 1127, 2119, 3312, 2999, 2149, 2452, 1025, 644, 932, 2564, 2187, 1448, 1896, 2685, 2389, 415, 661, 713, 2005, 1447, 2556, 2554, 2768, 3071, 3147, 1915, 2606, 1647, 1073, 2062, 1653, 381, 424, 440, 2427, 1215, 3144, 1401, 2518, 2407, 2332, 2428, 375, 655, 1585, 417, 64, 2798, 2810, 118, 2723, 2708, 1947, 2336, 2321, 179, 2986, 558, 1419, 1941, 1175, 2079, 2633, 3244, 3237, 261, 147, 2993, 2316, 760, 1280, 1325, 2856, 655, 153, 1621, 2098, 2620, 1659, 339, 2957, 2693, 1814, 675, 3130, 2725, 725, 1937, 1817, 1121, 76, 756, 983, 994, 300, 2438, 619, 883, 115, 598, 362, 2283, 1650, 2989, 515, 1863, 2033, 2299, 75, 304, 98, 3122, 1701, 490, 3312, 2519, 1667, 2819, 1950, 1087, 856, 2023, 3211, 3250, 2252, 2632, 625, 1046, 1320, 145, 2375, 2833, 2979, 220, 3275, 1959, 1763, 653, 1898, 1631, 3011, 1115, 1607, 2800, 92, 1340, 148, 3152, 3087, 1062, 2605, 1522, 2989, 413, 983, 1770, 260, 1420, 2236, 2251, 8, 2757, 2039, 3075, 2727, 150, 1455, 2070, 239, 528, 873, 1113, 1076, 3303, 154, 1937, 2944, 834, 596, 1254, 1359, 2347, 233, 2372, 3017, 314, 992, 661, 3232, 2959, 482, 2652, 3003, 2508, 1663, 2198, 1532, 3195, 2295, 380, 1042, 1050, 1400, 1121, 56, 2036, 147, 3314, 1884, 1370, 2144, 2963, 680, 13, 357, 1539, 949, 210, 433, 797, 524, 847, 1971, 981, 1831, 3259, 75, 1210, 19, 2299, 148, 1125, 302, 2396, 2005, 2212, 861, 2847, 1687, 280, 1649, 1509, 2082, 1369, 1918, 1970, 2790, 2188, 951, 2220, 2347, 2050, 277, 1554], [180, 2663, 814, 3229, 3165, 1307, 364, 3020, 445, 1191, 2817, 3050, 463, 2180, 738, 294, 415, 3273, 1589, 3216, 1676, 1273, 2046, 471, 3134, 118, 1336, 1214, 3114, 225, 2165, 537, 2131, 2198, 1989, 94, 2173, 533, 1549, 1665, 2887, 386, 1461, 769, 726, 703, 2980, 2249, 2867, 1508, 2235, 507, 2884, 2596, 313, 703, 474, 3009, 2428, 1012, 1851, 2338, 2046, 655, 1985, 2969, 1478, 428, 703, 3180, 1370, 1053, 3137, 1898, 2200, 1246, 1016, 90, 3045, 1555, 1295, 858, 1270, 1277, 3136, 2448, 72, 1075, 1010, 1238, 2310, 37, 1785, 1508, 405, 2690, 2519, 284, 2507, 1437, 96, 1911, 2815, 756, 1326, 1602, 967, 428, 881, 417, 324, 1318, 1920, 2453, 341, 11, 385, 1810, 1320, 2661, 351, 547, 2099, 551, 1225, 1674, 1841, 1210, 2012, 114, 36, 107, 337, 466, 517, 2336, 1165, 2594, 898, 563, 613, 1855, 714, 2259, 2951, 2710, 1288, 1168, 3003, 1405, 2897, 2528, 1129, 184, 1627, 1792, 2191, 2326, 2605, 1165, 1952, 2075, 1278, 2860, 38, 1492, 789, 2519, 1925, 1561, 1662, 2386, 1788, 1480, 1324, 257, 2375, 1468, 507, 2334, 1526, 540, 253, 466, 644, 2432, 1771, 2168, 3153, 1091, 2151, 2480, 177, 1853, 2193, 288, 2046, 951, 1409, 3107, 2832, 2643, 1599, 571, 1412, 1055, 2363, 1015, 2949, 408, 2613, 589, 3258, 1670, 3114, 954, 1847, 40, 507, 781, 1824, 1366, 2740, 2969, 252, 358, 2715, 2814, 808, 812, 2054, 692, 232, 791, 263, 2386, 746, 2266, 1387, 508, 2461, 2959, 314, 1756, 2168, 469, 1554, 2054, 121, 62, 458, 2574, 3296, 2465, 3288, 372], [723, 581, 904, 461, 2378, 342, 1830, 2996, 910, 1321, 2030, 2259, 795, 2411, 2424, 34, 2461, 1854, 3095, 1818, 1011, 174, 1151, 2981, 189, 1311, 1146, 437, 2922, 3019, 1695, 343, 787, 598, 1294, 3140, 523, 476, 3242, 3242, 1000, 1770, 2989, 2346, 168, 1496, 1909, 743, 597, 1130, 1726, 948, 2693, 2028, 16, 2882, 2515, 1447, 1809, 1288, 378, 1502, 899, 1637, 2241, 45, 526, 2657, 2389, 2377, 724, 2412, 1517, 373, 1356, 1200, 875, 3321, 2860, 558, 3297, 3171, 3096, 2364, 3050, 2730, 339, 529, 1201, 1138, 722, 1628, 1167, 1258, 1382, 1616, 2411, 896, 2828, 59, 469, 930, 718, 207, 110, 1821, 735, 1621, 621, 1594, 1062, 2427, 3004, 3020, 401, 2093, 125, 1227, 2002, 2520, 2238, 869, 1895, 851, 817, 2861, 179, 3104, 2378, 1927, 1470, 409, 3096, 140, 2104, 1000, 223, 1756, 2452, 1022, 2089, 1979, 3318, 995, 2092, 2441, 3184, 140, 187, 395, 3111, 27, 1504, 2966, 1323, 1693, 2517, 2612, 1505, 2889, 2489, 1824, 866, 1269, 1681, 1827, 407, 1389, 1116, 1092, 2945, 848, 1557, 1595, 3238, 2311, 2923, 2462, 274, 1955, 2463, 1342, 1731, 1454, 1364, 1628, 1570, 1476, 2938, 2954, 970, 1817, 46, 3030, 654, 739, 374, 3198, 177, 1534, 2718, 2869, 2664, 2267, 2065, 3132, 38, 442, 999, 289, 2084, 2908, 3177, 1684, 34, 3189, 1391, 1676, 2139, 2095, 1912, 517, 0, 1557, 2562, 1289, 1913, 2468, 317, 2793, 1956, 2990, 2994, 3060, 595, 866, 860, 3121, 63, 2572, 1881, 1168, 39, 309, 865, 727, 348, 2448, 395, 961, 1946, 3101, 1465, 2904, 862, 768]], [[2651, 1652, 2254, 2887, 2120, 2620, 3273, 686, 2064, 1481, 2850, 1022, 1425, 194, 691, 1735, 457, 978, 365, 2518, 1750, 330, 1284, 3323, 2989, 435, 2756, 2568, 2991, 1261, 896, 1805, 2302, 1271, 2013, 1273, 2264, 3094, 1175, 722, 2233, 197, 1498, 1711, 1169, 1132, 2014, 1230, 1053, 1091, 545, 161, 1688, 2043, 2022, 1310, 292, 344, 2600, 2904, 758, 2494, 651, 2044, 1098, 1866, 2059, 2189, 1674, 1863, 1887, 1289, 3291, 126, 481, 2007, 2274, 1421, 2276, 2468, 968, 423, 2822, 3135, 3176, 2982, 1695, 2262, 1407, 2768, 2205, 202, 2458, 366, 2719, 2875, 2237, 217, 1032, 899, 3235, 2588, 26, 1609, 1386, 298, 986, 2333, 1911, 1444, 1171, 2001, 2218, 795, 1995, 2098, 224, 534, 211, 3131, 1947, 3033, 821, 3128, 3145, 1882, 1419, 2881, 2362, 3231, 1336, 2831, 1593, 2988, 3007, 622, 843, 2264, 2462, 1990, 2736, 2049, 1993, 2361, 1415, 3283, 2295, 2590, 2993, 701, 733, 523, 2956, 771, 1420, 3047, 116, 1638, 86, 3263, 3184, 1998, 1793, 792, 1081, 951, 1261, 647, 1796, 769, 2909, 809, 1916, 161, 2267, 1184, 1757, 357, 17, 1264, 2133, 1296, 3207, 1855, 3221, 2353, 2659, 2430, 269, 556, 1104, 748, 1144, 3139, 1651, 2804, 2903, 1466, 398, 2972, 1937, 2169, 674, 2747, 1505, 1039, 2369, 1875, 2115, 1265, 1169, 2279, 514, 152, 2626, 484, 1636, 2074, 939, 2954, 1231, 271, 10, 1096, 2838, 1132, 23, 1100, 3264, 2853, 1400, 1959, 624, 2537, 828, 3206, 778, 2224, 2916, 2704, 2497, 264, 1607, 1060, 920, 2008, 1820, 3255, 2853, 3171, 315, 1682, 989, 1760, 1165, 1921], [276, 361, 2772, 1882, 433, 2175, 2154, 1970, 394, 1482, 2631, 1555, 1225, 1052, 1649, 2373, 611, 472, 1721, 221, 94, 2685, 1077, 2197, 3107, 462, 2275, 953, 2925, 708, 219, 5, 224, 30, 3314, 2215, 1406, 2821, 1492, 160, 3227, 1324, 2629, 291, 967, 2088, 2107, 1511, 253, 1429, 321, 590, 2920, 1692, 1161, 2233, 75, 1820, 2404, 913, 3220, 3071, 2034, 2107, 2161, 1380, 1742, 640, 881, 1574, 2017, 504, 1045, 1369, 922, 163, 554, 1351, 362, 2383, 3016, 1899, 2658, 2912, 2950, 868, 350, 2206, 315, 2532, 840, 3320, 2823, 2209, 592, 1017, 1048, 2342, 333, 109, 3293, 1671, 290, 1984, 1235, 134, 2367, 1750, 1927, 1187, 1598, 1582, 1542, 1236, 857, 774, 2381, 752, 2294, 478, 240, 2802, 2257, 837, 915, 1899, 1536, 1755, 2528, 617, 2332, 927, 2205, 3071, 2298, 652, 3308, 268, 1201, 2347, 1334, 275, 898, 3254, 376, 1783, 2377, 2719, 2590, 3250, 2998, 1533, 563, 114, 220, 2152, 491, 2777, 297, 1168, 1477, 2531, 1369, 1342, 637, 2192, 1672, 3261, 1056, 2071, 2428, 41, 2678, 964, 1599, 658, 1341, 1680, 2262, 2153, 2997, 2637, 1404, 1785, 2695, 2404, 715, 1732, 2783, 384, 656, 3012, 2878, 637, 2802, 1893, 2592, 551, 884, 2338, 2011, 812, 841, 1843, 456, 1090, 2724, 637, 137, 606, 1687, 1074, 2530, 269, 2357, 2398, 3237, 144, 147, 372, 1525, 2427, 1182, 2978, 851, 968, 122, 1540, 2380, 22, 1818, 1278, 2496, 240, 1937, 2198, 1234, 1366, 759, 1124, 2839, 1193, 2927, 1517, 190, 958, 2617, 134, 2304, 493, 2787, 1350, 575, 68, 3163, 3025], [966, 2452, 116, 2534, 1196, 754, 3152, 1210, 1734, 970, 2156, 1172, 1741, 364, 2810, 3072, 2247, 37, 344, 3156, 590, 3234, 1310, 1828, 1654, 188, 2537, 2766, 1378, 395, 2993, 3029, 770, 2307, 697, 686, 627, 2696, 1133, 2779, 733, 1478, 1202, 180, 901, 2510, 2905, 1511, 3325, 2720, 2992, 210, 49, 2466, 3259, 1684, 2542, 290, 2588, 397, 579, 309, 1275, 2095, 530, 2230, 608, 2879, 20, 2031, 403, 155, 234, 3103, 766, 2912, 457, 202, 2701, 2776, 214, 1778, 3146, 1114, 1640, 1190, 1870, 2251, 1017, 2507, 1603, 2591, 949, 3028, 2257, 222, 3051, 879, 1185, 1764, 290, 3163, 1082, 172, 1555, 2535, 2225, 2930, 812, 694, 1759, 688, 3266, 2354, 369, 917, 903, 1897, 1154, 596, 2, 2130, 3168, 2448, 930, 993, 2230, 2156, 1960, 1882, 576, 3305, 1027, 1135, 1282, 2001, 1787, 3141, 3070, 2465, 2149, 2889, 164, 1857, 180, 1177, 3102, 1375, 2565, 1363, 2105, 3221, 536, 707, 1474, 1103, 467, 1915, 3294, 621, 1733, 817, 939, 349, 2446, 514, 2959, 3256, 2103, 959, 1006, 1446, 1625, 933, 2034, 1970, 3297, 66, 3020, 2573, 1363, 822, 370, 1550, 1695, 1048, 728, 2544, 1942, 2194, 323, 2172, 499, 2199, 1322, 2747, 2130, 578, 623, 3033, 807, 94, 2384, 1548, 1935, 1907, 809, 1350, 2853, 1169, 883, 2790, 1766, 45, 670, 739, 886, 2962, 669, 1511, 1412, 180, 2166, 3127, 471, 2346, 3126, 785, 312, 1281, 300, 336, 1189, 2833, 2363, 1690, 2966, 2874, 2130, 1315, 1108, 1457, 2350, 1598, 2809, 607, 3245, 306, 1523, 897, 1487, 1771, 1831, 2650, 54, 2877]]] r: [[0, 0, 3327, 1, 0, 1, 1, 3328, 1, 0, 0, 3328, 0, 1, 0, 3327, 0, 1, 3328, 0, 1, 0, 3328, 0, 3328, 1, 3328, 0, 3328, 1, 0, 1, 3328, 1, 0, 3328, 1, 1, 3328, 0, 3328, 0, 3328, 0, 0, 0, 0, 1, 1, 0, 3328, 0, 0, 0, 3328, 2, 0, 3328, 0, 0, 0, 2, 3328, 1, 3328, 0, 1, 0, 1, 3328, 0, 0, 3328, 0, 0, 3327, 3328, 0, 1, 1, 1, 0, 1, 1, 3328, 3328, 1, 0, 3328, 0, 3328, 0, 1, 0, 3328, 1, 2, 3328, 0, 1, 0, 3327, 1, 3328, 3328, 0, 3328, 3328, 0, 3328, 1, 3328, 0, 0, 3328, 3328, 2, 3328, 0, 3328, 3328, 1, 3328, 1, 3328, 1, 2, 1, 3328, 1, 0, 1, 1, 0, 1, 0, 1, 3327, 0, 3328, 3328, 3327, 0, 1, 0, 1, 0, 3328, 0, 2, 3327, 0, 3328, 3328, 3328, 2, 0, 0, 0, 3327, 0, 3328, 3328, 1, 3327, 3328, 0, 1, 3328, 0, 3328, 3328, 3327, 1, 1, 2, 0, 1, 3328, 1, 3327, 0, 0, 1, 0, 0, 0, 0, 3328, 1, 3328, 3328, 0, 3328, 3328, 1, 0, 3328, 2, 1, 3328, 0, 3328, 1, 0, 0, 0, 2, 3328, 1, 2, 0, 0, 1, 3327, 3328, 0, 3328, 3328, 3328, 0, 3328, 3328, 3327, 0, 2, 0, 0, 1, 3328, 2, 0, 3328, 0, 0, 1, 0, 3328, 3328, 3327, 1, 0, 3328, 3328, 3328, 0, 1, 3328, 1, 0, 0, 1, 3328, 0, 1, 2], [0, 3327, 1, 3328, 3328, 3327, 3328, 0, 0, 0, 1, 0, 3328, 1, 3328, 0, 0, 3327, 0, 3328, 0, 1, 3327, 1, 1, 1, 3328, 1, 0, 0, 3328, 1, 0, 3328, 0, 0, 2, 0, 0, 0, 3328, 0, 0, 0, 3328, 3328, 0, 0, 2, 3328, 0, 0, 0, 3328, 2, 3328, 0, 0, 3328, 3328, 2, 3328, 3328, 2, 2, 1, 1, 3328, 0, 3328, 0, 1, 1, 3328, 3327, 1, 3327, 0, 3328, 1, 1, 0, 2, 1, 1, 2, 0, 2, 0, 3328, 3328, 3328, 0, 3328, 0, 1, 0, 1, 3328, 0, 0, 0, 1, 0, 1, 0, 0, 3328, 3328, 0, 1, 1, 1, 0, 3328, 1, 3328, 3328, 3328, 0, 3328, 0, 1, 1, 0, 3328, 0, 0, 0, 2, 3328, 0, 1, 1, 3328, 3328, 3328, 3328, 1, 0, 3328, 3328, 0, 0, 0, 3327, 0, 1, 1, 3328, 3328, 1, 0, 3328, 0, 0, 1, 0, 1, 1, 1, 0, 1, 0, 3328, 2, 0, 1, 0, 0, 3328, 1, 1, 1, 0, 3328, 2, 0, 1, 0, 0, 0, 0, 0, 0, 0, 3328, 0, 0, 0, 3328, 0, 0, 0, 1, 1, 2, 1, 3328, 3328, 1, 0, 3328, 3328, 0, 0, 0, 3328, 0, 3328, 0, 0, 0, 3328, 0, 0, 0, 3328, 0, 3327, 1, 3328, 0, 0, 0, 1, 0, 0, 0, 0, 3328, 3327, 0, 1, 1, 1, 0, 3328, 0, 3327, 1, 3328, 0, 0, 0, 3327, 1, 0, 3328, 3327, 0, 3328, 1, 3327, 0, 3328], [0, 2, 0, 0, 2, 3328, 0, 1, 3328, 0, 2, 3328, 3328, 0, 1, 3328, 3328, 0, 1, 0, 2, 0, 3328, 3328, 3328, 1, 1, 0, 1, 0, 1, 3328, 0, 3328, 3327, 0, 1, 2, 1, 3327, 1, 1, 1, 3327, 1, 1, 1, 3328, 0, 1, 1, 0, 0, 0, 3327, 3327, 1, 3328, 3328, 3328, 1, 2, 3327, 3328, 1, 3328, 0, 3328, 3327, 3328, 0, 0, 0, 1, 0, 0, 3328, 1, 1, 3327, 3328, 3328, 1, 3328, 3327, 1, 0, 3328, 1, 3328, 3328, 0, 0, 3328, 3328, 0, 1, 1, 3328, 0, 1, 3328, 0, 0, 1, 3328, 0, 3328, 0, 3328, 0, 3327, 1, 3327, 3327, 0, 0, 2, 0, 3327, 1, 0, 3328, 1, 1, 3327, 3328, 0, 0, 0, 1, 1, 1, 0, 0, 0, 2, 3327, 3328, 0, 3328, 0, 1, 2, 1, 3328, 3328, 0, 1, 0, 3328, 3328, 0, 0, 0, 3328, 0, 1, 0, 0, 0, 0, 0, 1, 3328, 3328, 3328, 1, 1, 3328, 1, 3328, 2, 0, 1, 2, 1, 3328, 1, 3328, 3328, 1, 0, 0, 3328, 2, 0, 1, 1, 3328, 0, 1, 3328, 0, 3328, 3328, 3328, 0, 1, 0, 0, 1, 3328, 0, 0, 1, 3327, 1, 0, 1, 3328, 0, 1, 3328, 3327, 3328, 2, 3328, 2, 3328, 1, 1, 0, 1, 0, 3328, 0, 1, 0, 1, 2, 3327, 3328, 0, 1, 0, 0, 0, 0, 0, 2, 1, 1, 3327, 3327, 3327, 3328, 1, 3327, 3328, 3328, 1, 2, 1, 1, 0]] e1: [[0, 3328, 3327, 0, 3328, 0, 0, 1, 3328, 0, 0, 0, 1, 0, 1, 3328, 0, 0, 3327, 2, 0, 0, 1, 0, 3328, 0, 1, 2, 1, 0, 3328, 3328, 1, 3327, 3327, 3328, 0, 3328, 1, 1, 0, 3328, 3328, 0, 0, 2, 3328, 1, 3328, 1, 1, 3328, 3328, 1, 3328, 0, 3328, 3328, 0, 3328, 0, 0, 3328, 0, 0, 0, 3328, 3328, 1, 0, 3327, 0, 1, 1, 0, 0, 3328, 1, 1, 3328, 0, 0, 1, 0, 3328, 1, 1, 3328, 1, 3328, 2, 2, 2, 1, 0, 3328, 3328, 0, 2, 1, 1, 3328, 0, 1, 3327, 0, 0, 2, 1, 0, 0, 3328, 0, 3328, 3328, 3328, 0, 0, 0, 3328, 1, 3328, 2, 1, 0, 0, 2, 3328, 3328, 3328, 2, 1, 1, 0, 3328, 0, 0, 1, 3328, 1, 1, 3328, 1, 0, 1, 0, 0, 0, 0, 3328, 0, 3327, 1, 0, 0, 0, 3327, 2, 3328, 3328, 1, 2, 0, 1, 1, 0, 1, 1, 1, 1, 3328, 2, 3328, 2, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 3328, 3328, 0, 3328, 0, 0, 0, 0, 0, 1, 0, 0, 3328, 3327, 1, 0, 1, 1, 1, 3328, 3328, 1, 1, 3328, 1, 1, 0, 2, 0, 3328, 1, 1, 3327, 0, 0, 3328, 1, 0, 1, 3328, 0, 1, 3328, 1, 3327, 0, 3328, 0, 2, 0, 2, 0, 1, 3327, 0, 3328, 3328, 3328, 1, 3328, 0, 0, 1, 2, 1, 3328, 3328, 1, 3328, 0, 1, 0], [0, 1, 3328, 0, 1, 1, 3327, 1, 3327, 1, 1, 3328, 1, 3328, 3328, 3328, 0, 0, 1, 1, 0, 2, 2, 3328, 1, 3328, 3328, 0, 3328, 1, 1, 3328, 3327, 0, 1, 3327, 3328, 1, 3328, 1, 3327, 3328, 1, 1, 3328, 3328, 0, 0, 1, 2, 1, 3328, 1, 0, 2, 0, 3328, 1, 3327, 2, 0, 0, 2, 2, 0, 3327, 3327, 3327, 2, 3328, 3328, 0, 3328, 1, 3328, 0, 0, 0, 3327, 0, 3328, 3328, 3328, 3328, 1, 3327, 1, 0, 3328, 3328, 3328, 3328, 0, 1, 1, 0, 0, 1, 3327, 0, 3328, 3328, 0, 1, 0, 2, 0, 0, 1, 0, 0, 2, 3327, 1, 0, 2, 0, 0, 0, 0, 2, 2, 3327, 3328, 3328, 1, 3328, 0, 1, 2, 3328, 1, 0, 0, 1, 0, 0, 1, 2, 3328, 1, 3327, 3328, 0, 3328, 0, 3328, 3328, 3328, 0, 3328, 1, 3327, 3328, 3328, 3328, 1, 0, 2, 3328, 0, 1, 0, 0, 1, 3328, 1, 0, 1, 0, 3328, 1, 0, 1, 0, 0, 3328, 0, 3328, 3327, 0, 1, 2, 0, 0, 0, 0, 3327, 1, 3328, 0, 3328, 0, 3327, 3328, 3328, 1, 1, 0, 0, 1, 1, 0, 3328, 3328, 0, 0, 0, 1, 1, 1, 2, 0, 1, 0, 2, 1, 1, 1, 1, 0, 0, 0, 2, 3328, 0, 3327, 0, 3327, 1, 0, 0, 0, 2, 0, 3328, 3328, 3328, 3328, 0, 0, 3328, 1, 1, 1, 3328, 1, 0, 3328, 1, 0, 3327, 3328, 0, 1, 1], [0, 3328, 3328, 0, 1, 0, 0, 3328, 1, 0, 0, 0, 1, 1, 3328, 3328, 2, 3328, 3328, 0, 0, 1, 0, 3328, 1, 0, 1, 0, 3328, 1, 0, 3327, 3328, 3328, 0, 1, 0, 1, 1, 3327, 0, 0, 3327, 3328, 3328, 0, 0, 3328, 3328, 0, 3327, 1, 0, 2, 0, 0, 0, 2, 3327, 3328, 0, 1, 0, 0, 3328, 1, 3328, 3328, 3328, 3328, 3328, 3328, 0, 0, 1, 0, 0, 3328, 0, 3328, 3327, 1, 1, 0, 0, 0, 1, 0, 1, 0, 2, 1, 1, 0, 3327, 2, 1, 3328, 0, 2, 3328, 1, 0, 0, 3327, 3328, 3327, 0, 3327, 3328, 0, 1, 0, 0, 3328, 1, 0, 1, 1, 0, 0, 3328, 0, 1, 0, 1, 3327, 0, 1, 1, 1, 3328, 0, 3328, 3328, 3328, 0, 0, 3328, 0, 3328, 0, 0, 0, 3328, 3328, 3328, 2, 3327, 1, 0, 3328, 1, 0, 1, 3328, 1, 0, 0, 3328, 1, 1, 0, 2, 3328, 3328, 3328, 0, 3328, 1, 3328, 1, 2, 1, 0, 2, 3327, 3327, 1, 2, 1, 0, 3327, 0, 0, 1, 0, 0, 1, 1, 1, 3328, 3328, 1, 0, 3328, 3328, 3328, 3327, 3328, 3328, 3328, 3328, 0, 0, 1, 0, 0, 0, 0, 1, 0, 3328, 0, 3327, 3328, 2, 3328, 0, 3328, 0, 2, 0, 0, 0, 3328, 0, 0, 0, 0, 0, 0, 1, 3328, 3327, 2, 3328, 3328, 1, 3328, 0, 2, 0, 0, 2, 1, 0, 3328, 0, 3328, 1, 0, 3327, 1, 0, 3328]] e2: [0, 1, 1, 3328, 0, 3328, 0, 3328, 0, 3328, 0, 1, 1, 0, 3328, 0, 3327, 3327, 1, 3328, 0, 0, 3327, 3328, 0, 0, 0, 0, 1, 0, 3328, 3328, 3327, 0, 1, 3328, 3327, 3328, 1, 3328, 0, 0, 1, 0, 1, 0, 2, 3328, 3328, 2, 0, 3328, 3328, 3328, 1, 0, 0, 2, 3327, 3328, 0, 0, 3328, 0, 3328, 0, 3328, 0, 1, 3328, 1, 1, 0, 0, 2, 1, 3327, 3328, 1, 3328, 0, 0, 0, 1, 1, 2, 1, 1, 3327, 3328, 0, 0, 0, 3328, 0, 3327, 1, 2, 3328, 3328, 3328, 0, 1, 3327, 1, 1, 0, 0, 0, 3327, 3328, 3328, 1, 0, 1, 0, 0, 0, 3328, 1, 1, 1, 1, 0, 3328, 1, 2, 1, 0, 2, 0, 3328, 1, 3328, 3328, 0, 3328, 0, 3328, 1, 0, 3328, 2, 3327, 0, 0, 1, 1, 1, 3327, 0, 1, 1, 0, 1, 0, 0, 0, 2, 0, 1, 0, 0, 1, 3328, 1, 3328, 1, 3328, 3328, 3327, 1, 0, 0, 1, 3328, 0, 1, 0, 1, 3327, 0, 3327, 1, 1, 2, 3327, 3328, 0, 0, 1, 1, 2, 3327, 0, 0, 3328, 0, 3328, 0, 0, 0, 3327, 3328, 0, 0, 3328, 3328, 0, 1, 0, 3328, 0, 3328, 1, 2, 3328, 2, 3328, 0, 0, 1, 0, 1, 1, 3328, 3328, 3328, 3328, 0, 1, 0, 1, 0, 1, 3328, 0, 0, 3328, 3328, 3327, 3328, 3328, 1, 3328, 2, 0, 1, 2, 0, 1, 3328, 0, 0, 3328, 0] rHat: [[686, 2870, 147, 3262, 3159, 1222, 1207, 2995, 2249, 3295, 1022, 1568, 385, 1447, 642, 1705, 1821, 3053, 2730, 294, 1279, 2060, 1538, 1773, 716, 971, 3051, 1928, 1011, 607, 1083, 1598, 414, 1866, 2491, 2973, 1082, 1995, 574, 3258, 1506, 2441, 1882, 370, 1234, 1317, 101, 3057, 2495, 2307, 2624, 976, 2319, 547, 2011, 2255, 3323, 222, 349, 1635, 2221, 1814, 1184, 2256, 1648, 2204, 1284, 188, 646, 1939, 223, 2501, 2732, 844, 1319, 2892, 1937, 164, 1269, 1389, 1297, 1512, 231, 3328, 3057, 3074, 427, 2734, 328, 2379, 1716, 3188, 1454, 1944, 109, 195, 2537, 1493, 1763, 213, 2991, 3281, 603, 2651, 1717, 2652, 1159, 234, 2855, 3275, 1814, 514, 904, 1871, 897, 211, 2704, 2308, 2855, 862, 598, 1540, 331, 518, 848, 1900, 2953, 50, 582, 1628, 780, 561, 977, 2181, 1358, 2005, 841, 2567, 1585, 574, 1487, 836, 212, 963, 2111, 552, 1217, 521, 217, 909, 2238, 2724, 1643, 474, 2509, 1109, 321, 542, 1858, 2617, 3289, 352, 426, 1796, 1612, 1456, 409, 2321, 1305, 1416, 1524, 575, 1145, 1938, 146, 2746, 866, 2688, 3213, 2052, 2235, 1098, 1989, 731, 352, 2665, 2931, 2147, 1797, 2190, 117, 1602, 3009, 3133, 86, 1330, 2462, 1369, 78, 1623, 2215, 931, 1508, 2284, 288, 1826, 2758, 690, 1259, 2420, 182, 50, 307, 2796, 2876, 3140, 469, 1145, 574, 866, 1320, 2129, 909, 2287, 407, 921, 387, 2096, 1694, 3151, 759, 216, 1902, 2128, 132, 424, 3294, 1722, 331, 3004, 1117, 336, 1887, 1775, 1799, 2444, 106, 2113, 446, 1832, 790, 437, 1336, 1747, 716, 1499], [1139, 1269, 364, 2358, 888, 1140, 2032, 1827, 1827, 1980, 1179, 1062, 765, 1125, 1792, 1287, 1787, 2419, 2297, 2020, 358, 82, 776, 1074, 1492, 947, 1073, 2663, 133, 1332, 1500, 2401, 411, 684, 272, 2463, 1249, 878, 2765, 2292, 1587, 1971, 2917, 1654, 2480, 1395, 619, 2210, 14, 1469, 2403, 1714, 2508, 1702, 1201, 3043, 233, 1558, 732, 1298, 1455, 3101, 1699, 916, 718, 1989, 3284, 361, 1573, 2155, 752, 468, 2806, 2746, 2507, 2646, 288, 2542, 807, 2978, 2016, 1740, 1805, 1412, 2472, 2107, 267, 809, 665, 2095, 1522, 892, 1471, 2937, 2020, 2830, 36, 731, 2945, 1444, 1367, 3174, 2862, 131, 316, 1044, 2821, 341, 2164, 209, 2431, 1319, 3134, 297, 2838, 1617, 1429, 597, 1493, 2484, 2877, 1144, 1294, 2056, 741, 965, 873, 3075, 1326, 2056, 2551, 690, 390, 1879, 2210, 24, 2111, 2170, 3325, 2664, 2735, 1586, 1147, 846, 483, 888, 1801, 1002, 165, 2569, 2517, 2586, 2364, 165, 640, 1283, 2103, 2417, 2561, 1778, 2308, 2060, 1181, 3290, 2737, 1187, 2772, 1779, 2131, 2122, 2434, 3293, 3150, 2796, 2390, 2490, 2011, 2899, 2490, 2738, 2466, 2304, 2781, 1952, 4, 1399, 1285, 2771, 1122, 2172, 1000, 1253, 1899, 2928, 1836, 1019, 585, 2751, 288, 1072, 607, 1075, 846, 2323, 3317, 3248, 1969, 2062, 2879, 2967, 2641, 442, 1579, 1673, 250, 2075, 2023, 540, 1819, 688, 1393, 2153, 1043, 325, 278, 2313, 730, 467, 0, 1344, 1961, 2027, 442, 910, 514, 2400, 2666, 270, 1364, 2477, 2397, 2644, 1198, 2579, 3126, 2335, 804, 686, 1406, 2096, 168, 2903, 2395, 2277, 1414, 1941], [3022, 3246, 2122, 1725, 1400, 2270, 227, 1537, 2513, 2783, 2623, 1702, 336, 1561, 1219, 2282, 709, 2746, 1664, 1575, 2625, 1490, 2179, 2681, 1325, 1600, 1587, 256, 1564, 1013, 551, 1338, 755, 437, 2792, 2579, 1328, 2406, 2628, 2888, 2425, 2847, 922, 1513, 2224, 1839, 3213, 2255, 630, 2707, 1301, 1868, 148, 1090, 2360, 2483, 2982, 3172, 3014, 3009, 1707, 578, 3113, 2504, 3292, 2984, 16, 404, 2882, 2665, 3319, 2097, 694, 3175, 729, 2050, 921, 3068, 548, 1367, 1580, 3304, 197, 405, 1851, 3052, 1376, 2613, 603, 1304, 3312, 1327, 1995, 572, 1093, 202, 1865, 38, 2297, 305, 1397, 885, 1967, 2441, 1307, 239, 1059, 2308, 811, 777, 1156, 909, 1988, 2488, 3180, 3158, 2041, 2813, 158, 1367, 1905, 1279, 3084, 464, 2306, 1550, 1720, 1053, 2724, 1259, 2946, 338, 1194, 126, 3149, 1075, 944, 2115, 41, 1242, 2433, 2100, 1711, 358, 2170, 1739, 717, 234, 1498, 874, 2728, 3136, 2918, 584, 1383, 1508, 1202, 2300, 1236, 2179, 1958, 759, 1510, 350, 2771, 3184, 2331, 471, 1739, 2205, 2679, 2209, 2235, 2122, 3128, 2641, 3226, 3, 852, 1347, 1218, 2839, 2977, 2789, 1371, 2538, 2742, 369, 1412, 2471, 1493, 486, 2454, 1877, 60, 1919, 1758, 2167, 982, 1761, 352, 643, 1152, 3270, 1321, 2523, 2368, 2615, 514, 272, 1489, 2406, 1130, 1601, 1236, 2617, 2768, 3320, 384, 294, 2878, 1025, 1193, 1889, 1201, 1948, 3313, 2800, 1780, 2108, 2900, 1220, 860, 2818, 2017, 1697, 872, 1780, 1369, 2459, 806, 2305, 295, 240, 3065, 492, 752, 664, 608, 940, 965, 854, 470, 561, 580, 2292]] BHat * rHat: [[3180, 200, 1027, 305, 2077, 3315, 928, 1920, 2199, 1675, 136, 2064, 1757, 436, 2372, 1758, 1695, 523, 786, 1394, 606, 457, 3031, 3261, 218, 218, 1028, 2791, 417, 2055, 1933, 2512, 1229, 3316, 290, 2483, 607, 2162, 504, 1140, 2923, 2571, 2137, 2484, 1634, 548, 1222, 1955, 2188, 119, 380, 2972, 371, 1928, 2301, 1406, 1270, 2086, 1331, 1361, 2549, 1653, 207, 2479, 1636, 3006, 1458, 313, 2280, 1115, 2134, 1143, 756, 1339, 2645, 1243, 2242, 2023, 256, 3179, 1671, 1767, 1455, 3038, 3149, 979, 1776, 1584, 2930, 2939, 1786, 2354, 1046, 2312, 20, 1380, 1515, 1924, 1770, 621, 1859, 1810, 1826, 906, 2314, 3261, 1814, 540, 1245, 2998, 1432, 616, 1647, 374, 2352, 2, 52, 664, 2675, 2822, 2766, 1024, 564, 1200, 1089, 1918, 1301, 782, 2193, 1926, 348, 2432, 1026, 2377, 2398, 941, 3023, 2388, 687, 1494, 229, 1161, 3261, 680, 1196, 3052, 2782, 1944, 3313, 532, 1276, 3142, 90, 3172, 982, 29, 2865, 3047, 1103, 1841, 1644, 2557, 2361, 1495, 1324, 1634, 1636, 1789, 2657, 645, 670, 1129, 2909, 1179, 2013, 152, 2908, 2922, 384, 1642, 1514, 3022, 3128, 3271, 2504, 1542, 2410, 2540, 496, 94, 1875, 682, 1367, 1007, 3019, 1292, 3149, 1881, 1220, 1308, 1725, 1044, 608, 2901, 1849, 2334, 1526, 1066, 248, 465, 882, 1431, 2126, 1380, 3267, 974, 1091, 2936, 2940, 305, 3127, 2955, 2181, 1755, 2294, 2789, 2372, 1131, 2716, 1829, 550, 2022, 594, 2516, 1723, 31, 1041, 1345, 336, 545, 1759, 846, 3119, 1230, 2632, 1507, 1849, 1452, 868, 137, 1920, 444, 2047, 3106, 1281, 1903], [2785, 3122, 762, 2696, 1716, 1470, 536, 2583, 3211, 2866, 1305, 2567, 2741, 2096, 35, 1744, 2725, 1031, 3087, 1062, 2322, 1763, 3231, 989, 2949, 3097, 1688, 480, 1939, 2761, 718, 1185, 1423, 285, 1677, 406, 1596, 1062, 2585, 2500, 151, 372, 1609, 2541, 547, 1092, 1239, 2901, 1642, 524, 1999, 1831, 578, 39, 3245, 2595, 837, 1520, 82, 1638, 2332, 316, 475, 3163, 3328, 2423, 1562, 1888, 412, 1389, 1376, 490, 40, 3080, 847, 1294, 1133, 1691, 351, 912, 1143, 976, 2034, 1982, 2648, 2330, 514, 1847, 3089, 1477, 955, 827, 2711, 485, 486, 384, 2265, 715, 204, 2427, 1189, 2760, 155, 1036, 509, 2792, 1758, 2622, 2744, 1089, 1967, 2790, 2917, 172, 2998, 1928, 2224, 605, 877, 1045, 2370, 2673, 36, 1210, 1511, 1525, 2295, 2534, 1940, 2250, 1632, 238, 2283, 2064, 3253, 2696, 2893, 681, 2131, 733, 2392, 1210, 907, 49, 1216, 1166, 2488, 2659, 259, 2585, 2568, 1648, 1241, 1213, 2237, 693, 2917, 3217, 2922, 716, 2489, 611, 208, 1391, 3089, 1894, 2264, 171, 3321, 925, 2251, 552, 1978, 1662, 2797, 1727, 519, 2389, 1892, 1997, 596, 361, 1516, 2679, 2509, 884, 807, 9, 1994, 3318, 1720, 1341, 730, 3101, 3196, 3243, 2462, 1975, 2698, 1385, 1173, 1457, 2465, 2427, 3303, 1997, 1567, 2121, 2071, 2012, 758, 955, 86, 3068, 2395, 16, 1771, 1068, 2819, 570, 384, 2842, 2514, 3145, 2197, 1437, 929, 2592, 2964, 190, 2937, 690, 1887, 2458, 3216, 1610, 330, 1464, 2851, 1381, 1894, 2026, 971, 3236, 1141, 1894, 2126, 2760, 3058, 3111, 2838, 251, 2877, 290, 1621, 1178], [1822, 1407, 1469, 2389, 3194, 1635, 1631, 2494, 2381, 3227, 2278, 3060, 794, 2225, 204, 1726, 587, 2679, 1766, 705, 385, 3052, 1591, 628, 1844, 258, 305, 1434, 1080, 2867, 1526, 2706, 2730, 1409, 427, 1587, 2178, 855, 3288, 939, 1695, 2582, 763, 422, 3130, 1252, 1967, 2057, 2038, 1847, 1747, 2712, 3066, 2710, 3099, 1605, 1960, 747, 1344, 532, 403, 2103, 250, 815, 774, 2558, 2296, 1514, 1224, 2987, 2639, 2673, 1867, 2485, 1376, 124, 672, 2692, 1768, 106, 1471, 444, 2681, 2148, 599, 3151, 1918, 1324, 172, 2365, 3177, 1490, 3235, 1963, 3159, 2033, 3186, 1164, 3261, 2411, 1348, 2896, 1331, 841, 2281, 2556, 1538, 2089, 2000, 1913, 1981, 2609, 349, 1026, 3073, 2897, 1422, 3053, 86, 251, 634, 635, 1927, 1457, 1459, 621, 566, 893, 2888, 864, 53, 1366, 686, 2956, 2954, 3302, 3209, 876, 1478, 3274, 1038, 2875, 1522, 1084, 1615, 2336, 2842, 2167, 2911, 1637, 1523, 2654, 1471, 42, 2316, 3187, 2943, 2349, 212, 1984, 2037, 96, 3249, 2506, 2598, 3088, 1351, 295, 2022, 448, 2120, 2462, 2219, 1320, 2704, 35, 1097, 455, 2664, 2429, 838, 1221, 805, 118, 75, 2166, 1954, 642, 2574, 1150, 375, 1696, 947, 3229, 3210, 1093, 2193, 1828, 3286, 2825, 2103, 488, 3137, 1458, 2025, 2031, 1925, 720, 2065, 2295, 2846, 908, 2532, 1204, 1478, 1188, 611, 3077, 1400, 2104, 318, 3101, 1916, 807, 2458, 2150, 579, 2184, 1548, 2106, 149, 3054, 226, 2968, 2387, 3093, 932, 2701, 818, 1941, 2663, 1253, 2456, 676, 430, 1370, 476, 2846, 890, 2037, 2575, 2752, 1531, 819, 1075, 887]] NTTInverse(BHat * rHat): [[1219, 2403, 179, 1572, 1750, 1202, 2338, 2213, 3317, 2657, 2418, 1205, 1444, 3043, 406, 722, 3254, 3281, 572, 2979, 791, 732, 248, 2916, 2922, 1481, 663, 1691, 1077, 978, 288, 425, 263, 3223, 752, 2083, 1991, 1323, 2949, 1791, 1928, 1139, 1763, 1391, 40, 2901, 1462, 827, 875, 1895, 3170, 1437, 252, 606, 2846, 2145, 3260, 320, 787, 1304, 956, 2586, 1571, 115, 3225, 164, 1926, 2832, 101, 1529, 333, 2301, 3270, 2770, 1674, 923, 363, 679, 2866, 1866, 2969, 1542, 1978, 3096, 1595, 3240, 3098, 2012, 642, 42, 560, 1927, 1507, 748, 578, 179, 2750, 2588, 518, 854, 2718, 1019, 455, 954, 943, 2785, 1879, 1902, 453, 1334, 252, 3202, 2870, 1206, 3213, 812, 2937, 2453, 1941, 1687, 3041, 2626, 2939, 3126, 2483, 1845, 2360, 1354, 100, 1741, 565, 3190, 427, 695, 1185, 803, 1248, 508, 1584, 1180, 1378, 2264, 2647, 2870, 2342, 2351, 2696, 951, 2777, 2778, 2624, 1470, 2381, 154, 2845, 2659, 2064, 1867, 1820, 1136, 1262, 245, 1304, 1499, 1858, 1097, 3217, 2572, 1560, 1414, 738, 1125, 432, 2426, 1402, 3304, 2756, 970, 2482, 885, 1210, 1276, 722, 2028, 2132, 2507, 1783, 1827, 1747, 2295, 35, 2539, 328, 614, 366, 393, 487, 2218, 3009, 1418, 244, 1632, 726, 3057, 1767, 0, 3155, 1696, 2766, 2162, 1594, 2496, 784, 1674, 1776, 846, 2013, 2225, 1149, 2637, 2039, 1359, 2157, 1702, 515, 2283, 213, 1987, 32, 1088, 1223, 1416, 1010, 1030, 385, 1207, 1627, 2274, 726, 1907, 1707, 1705, 591, 688, 644, 2421, 34, 24, 2931, 125, 1547, 1616, 467, 1415, 1246, 2760], [2186, 2520, 1230, 906, 2777, 2834, 1273, 2176, 2822, 1460, 947, 2903, 718, 1956, 423, 371, 1401, 1656, 1009, 2089, 2732, 2288, 1094, 584, 2750, 1371, 2972, 1728, 1302, 409, 1629, 2776, 1314, 1253, 2693, 2543, 2522, 2427, 1183, 1794, 2993, 1110, 1325, 1102, 1372, 2668, 1604, 2197, 1812, 1268, 2999, 921, 1364, 2881, 1171, 2638, 1821, 3217, 1287, 711, 2649, 2010, 603, 2318, 1990, 2658, 1643, 1112, 299, 1744, 3149, 2561, 1144, 2933, 2755, 3023, 3328, 1675, 2876, 2999, 2121, 1630, 2516, 154, 267, 2979, 2639, 1920, 1368, 1595, 2959, 1488, 2021, 285, 1713, 703, 930, 2313, 2584, 833, 228, 2558, 2226, 2459, 2422, 1226, 1300, 1834, 2949, 1294, 2583, 2408, 1721, 3140, 2556, 1521, 423, 2604, 1947, 21, 278, 497, 2338, 2850, 860, 780, 1264, 1598, 1553, 1897, 2765, 1032, 1834, 431, 1091, 2802, 1141, 1021, 1072, 3297, 2905, 2164, 2063, 1397, 1949, 3257, 1297, 2051, 2502, 2839, 2762, 2608, 1736, 109, 2139, 1833, 2783, 2944, 3052, 1429, 30, 348, 2197, 1990, 3050, 1920, 199, 1714, 1092, 1722, 221, 802, 3189, 346, 2042, 2301, 218, 903, 2707, 986, 1402, 544, 3288, 2528, 1381, 1116, 3097, 610, 779, 2164, 3229, 1477, 851, 1103, 1555, 1392, 1346, 1823, 1197, 2396, 3269, 1029, 50, 711, 994, 2963, 987, 1346, 322, 1604, 3221, 2994, 2170, 2706, 1104, 1541, 93, 2183, 2488, 341, 2949, 1290, 1211, 1082, 1474, 2387, 2950, 1943, 1610, 2646, 2700, 3283, 2804, 1377, 2404, 717, 379, 1653, 2598, 836, 3097, 2172, 1962, 1763, 2269, 795, 2804, 1332, 2216, 2237, 1159, 1921, 1063, 1226, 819, 1759], [782, 2928, 1475, 97, 2729, 1954, 41, 1553, 2326, 2219, 3235, 2151, 222, 2730, 2804, 386, 2172, 3050, 2951, 940, 3248, 3235, 2019, 2918, 2072, 452, 2659, 34, 2760, 3028, 471, 152, 3066, 2937, 1211, 1626, 250, 2621, 1606, 958, 341, 3179, 1202, 2522, 1832, 2983, 1091, 1767, 518, 3164, 621, 2342, 799, 1750, 6, 786, 2426, 2303, 1882, 1270, 1091, 502, 2253, 764, 1564, 291, 955, 566, 1686, 312, 330, 2542, 2355, 2455, 887, 3163, 3151, 2534, 947, 3152, 1512, 3181, 990, 2316, 577, 3013, 2265, 1779, 1805, 3078, 2911, 1814, 1241, 344, 763, 1021, 1011, 2549, 434, 995, 402, 1407, 1882, 1280, 2091, 2606, 2902, 2824, 2236, 1627, 883, 358, 3203, 1818, 2073, 3257, 1682, 1194, 3247, 161, 1913, 3207, 25, 2169, 1753, 2878, 2034, 2267, 998, 354, 581, 2926, 965, 1467, 1498, 260, 2576, 1644, 225, 2487, 1797, 261, 1962, 434, 374, 2214, 2163, 598, 2035, 827, 1936, 1796, 2601, 2568, 2195, 2413, 2534, 831, 1925, 399, 386, 2456, 2, 963, 1670, 618, 2960, 765, 600, 2714, 3295, 1411, 794, 18, 90, 3170, 2844, 3200, 1724, 1369, 1406, 1608, 3056, 2044, 1699, 2519, 1, 1560, 170, 3275, 2213, 2437, 3048, 3208, 999, 1122, 1084, 1800, 2394, 1778, 316, 758, 2108, 306, 236, 1003, 345, 1486, 3072, 1441, 262, 3148, 2176, 2304, 2734, 2383, 175, 356, 2805, 13, 1530, 553, 991, 222, 449, 514, 1986, 1337, 3032, 1672, 98, 168, 1935, 2121, 945, 1406, 804, 1174, 202, 2176, 1343, 1673, 1694, 63, 814, 1440, 2209, 831, 411, 2401, 1427, 2287, 1926, 3295, 1551, 2910]] u = NTTInverse(BHat * rHat) + e1: [[1219, 2402, 177, 1572, 1749, 1202, 2338, 2214, 3316, 2657, 2418, 1205, 1445, 3043, 407, 721, 3254, 3281, 570, 2981, 791, 732, 249, 2916, 2921, 1481, 664, 1693, 1078, 978, 287, 424, 264, 3221, 750, 2082, 1991, 1322, 2950, 1792, 1928, 1138, 1762, 1391, 40, 2903, 1461, 828, 874, 1896, 3171, 1436, 251, 607, 2845, 2145, 3259, 319, 787, 1303, 956, 2586, 1570, 115, 3225, 164, 1925, 2831, 102, 1529, 331, 2301, 3271, 2771, 1674, 923, 362, 680, 2867, 1865, 2969, 1542, 1979, 3096, 1594, 3241, 3099, 2011, 643, 41, 562, 1929, 1509, 749, 578, 178, 2749, 2588, 520, 855, 2719, 1018, 455, 955, 941, 2785, 1879, 1904, 454, 1334, 252, 3201, 2870, 1205, 3212, 811, 2937, 2453, 1941, 1686, 3042, 2625, 2941, 3127, 2483, 1845, 2362, 1353, 99, 1740, 567, 3191, 428, 695, 1184, 803, 1248, 509, 1583, 1181, 1379, 2263, 2648, 2870, 2343, 2351, 2696, 951, 2777, 2777, 2624, 1468, 2382, 154, 2845, 2659, 2062, 1869, 1819, 1135, 1263, 247, 1304, 1500, 1859, 1097, 3218, 2573, 1561, 1415, 737, 1127, 431, 2428, 1402, 3304, 2756, 970, 2482, 886, 1211, 1276, 722, 2029, 2131, 2506, 1783, 1826, 1747, 2295, 35, 2539, 328, 615, 366, 393, 486, 2216, 3010, 1418, 245, 1633, 727, 3056, 1766, 1, 3156, 1695, 2767, 2163, 1594, 2498, 784, 1673, 1777, 847, 2011, 2225, 1149, 2636, 2040, 1359, 2158, 1701, 515, 2284, 212, 1988, 30, 1088, 1222, 1416, 1012, 1030, 387, 1207, 1628, 2272, 726, 1906, 1706, 1704, 592, 687, 644, 2421, 35, 26, 2932, 124, 1546, 1617, 466, 1415, 1247, 2760], [2186, 2521, 1229, 906, 2778, 2835, 1271, 2177, 2820, 1461, 948, 2902, 719, 1955, 422, 370, 1401, 1656, 1010, 2090, 2732, 2290, 1096, 583, 2751, 1370, 2971, 1728, 1301, 410, 1630, 2775, 1312, 1253, 2694, 2541, 2521, 2428, 1182, 1795, 2991, 1109, 1326, 1103, 1371, 2667, 1604, 2197, 1813, 1270, 3000, 920, 1365, 2881, 1173, 2638, 1820, 3218, 1285, 713, 2649, 2010, 605, 2320, 1990, 2656, 1641, 1110, 301, 1743, 3148, 2561, 1143, 2934, 2754, 3023, 3328, 1675, 2874, 2999, 2120, 1629, 2515, 153, 268, 2977, 2640, 1920, 1367, 1594, 2958, 1487, 2021, 286, 1714, 703, 930, 2314, 2582, 833, 227, 2557, 2226, 2460, 2422, 1228, 1300, 1834, 2950, 1294, 2583, 2410, 1719, 3141, 2556, 1523, 423, 2604, 1947, 21, 280, 499, 2336, 2849, 859, 781, 1263, 1598, 1554, 1899, 2764, 1033, 1834, 431, 1092, 2802, 1141, 1022, 1074, 3296, 2906, 2162, 2062, 1397, 1948, 3257, 1296, 2050, 2501, 2839, 2761, 2609, 1734, 108, 2138, 1832, 2784, 2944, 3054, 1428, 30, 349, 2197, 1990, 3051, 1919, 200, 1714, 1093, 1722, 220, 803, 3189, 347, 2042, 2301, 217, 903, 2706, 984, 1402, 545, 3290, 2528, 1381, 1116, 3097, 608, 780, 2163, 3229, 1476, 851, 1101, 1554, 1391, 1347, 1824, 1197, 2396, 3270, 1030, 50, 710, 993, 2963, 987, 1346, 323, 1605, 3222, 2996, 2170, 2707, 1104, 1543, 94, 2184, 2489, 342, 2949, 1290, 1211, 1084, 1473, 2387, 2948, 1943, 1608, 2647, 2700, 3283, 2804, 1379, 2404, 716, 378, 1652, 2597, 836, 3097, 2171, 1963, 1764, 2270, 794, 2805, 1332, 2215, 2238, 1159, 1919, 1062, 1226, 820, 1760], [782, 2927, 1474, 97, 2730, 1954, 41, 1552, 2327, 2219, 3235, 2151, 223, 2731, 2803, 385, 2174, 3049, 2950, 940, 3248, 3236, 2019, 2917, 2073, 452, 2660, 34, 2759, 3029, 471, 150, 3065, 2936, 1211, 1627, 250, 2622, 1607, 956, 341, 3179, 1200, 2521, 1831, 2983, 1091, 1766, 517, 3164, 619, 2343, 799, 1752, 6, 786, 2426, 2305, 1880, 1269, 1091, 503, 2253, 764, 1563, 292, 954, 565, 1685, 311, 329, 2541, 2355, 2455, 888, 3163, 3151, 2533, 947, 3151, 1510, 3182, 991, 2316, 577, 3013, 2266, 1779, 1806, 3078, 2913, 1815, 1242, 344, 761, 1023, 1012, 2548, 434, 997, 401, 1408, 1882, 1280, 2089, 2605, 2900, 2824, 2234, 1626, 883, 359, 3203, 1818, 2072, 3258, 1682, 1195, 3248, 161, 1913, 3206, 25, 2170, 1753, 2879, 2032, 2267, 999, 355, 582, 2925, 965, 1466, 1497, 259, 2576, 1644, 224, 2487, 1796, 261, 1962, 434, 373, 2213, 2162, 600, 2033, 828, 1936, 1795, 2602, 2568, 2196, 2412, 2535, 831, 1925, 398, 387, 2457, 2, 965, 1669, 617, 2959, 765, 599, 2715, 3294, 1412, 796, 19, 90, 3172, 2842, 3198, 1725, 1371, 1407, 1608, 3054, 2044, 1699, 2520, 1, 1560, 171, 3276, 2214, 2436, 3047, 3209, 999, 1121, 1083, 1799, 2392, 1777, 315, 757, 2107, 306, 236, 1004, 345, 1486, 3072, 1441, 263, 3148, 2175, 2304, 2732, 2382, 177, 355, 2805, 12, 1530, 555, 991, 222, 449, 513, 1986, 1337, 3032, 1672, 98, 168, 1936, 2120, 943, 1408, 803, 1173, 203, 2175, 1343, 1675, 1694, 63, 816, 1441, 2209, 830, 411, 2400, 1428, 2287, 1924, 3296, 1551, 2909]] mu: [0, 0, 0, 0, 0, 0, 1665, 0, 0, 1665, 1665, 1665, 1665, 1665, 0, 1665, 1665, 0, 1665, 1665, 1665, 0, 0, 1665, 0, 1665, 0, 1665, 0, 0, 1665, 1665, 1665, 0, 0, 0, 0, 0, 1665, 1665, 0, 1665, 1665, 1665, 0, 1665, 1665, 0, 0, 0, 1665, 1665, 1665, 0, 0, 1665, 1665, 1665, 1665, 0, 0, 1665, 0, 1665, 1665, 0, 1665, 1665, 1665, 1665, 0, 0, 1665, 0, 0, 1665, 0, 0, 1665, 0, 0, 0, 0, 0, 1665, 0, 1665, 1665, 0, 0, 0, 1665, 0, 0, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 0, 0, 1665, 0, 1665, 1665, 1665, 0, 0, 1665, 1665, 0, 1665, 1665, 1665, 1665, 0, 0, 1665, 0, 0, 1665, 0, 0, 0, 1665, 1665, 1665, 0, 1665, 1665, 1665, 0, 1665, 1665, 0, 0, 0, 1665, 1665, 1665, 0, 1665, 1665, 1665, 0, 1665, 0, 1665, 0, 0, 1665, 0, 1665, 0, 0, 1665, 0, 0, 1665, 0, 0, 0, 0, 1665, 0, 1665, 0, 0, 1665, 1665, 0, 0, 0, 0, 0, 0, 0, 0, 1665, 0, 1665, 1665, 1665, 0, 0, 1665, 1665, 1665, 1665, 1665, 1665, 0, 0, 1665, 0, 0, 1665, 1665, 1665, 1665, 1665, 1665, 0, 1665, 1665, 0, 0, 1665, 1665, 0, 1665, 1665, 1665, 0, 1665, 0, 0, 0, 1665, 1665, 1665, 0, 0, 0, 1665, 1665, 0, 0, 1665, 1665, 1665, 0, 0, 0, 0, 0, 1665, 0, 0, 1665, 0, 1665, 0, 0, 1665, 0, 0, 1665, 0, 0, 0, 1665, 1665] tHat^T * rHat: [2789, 2045, 1564, 2584, 3322, 2870, 1233, 1876, 2979, 99, 785, 711, 1339, 1869, 2114, 320, 2129, 1008, 1461, 2283, 2195, 2360, 3197, 1966, 1521, 753, 1276, 517, 424, 868, 1927, 1774, 1601, 2598, 1829, 629, 2540, 1814, 1493, 2873, 3035, 2859, 895, 2067, 3299, 2768, 1941, 1520, 240, 1276, 512, 2015, 544, 15, 688, 734, 2091, 268, 2053, 2375, 1177, 709, 3186, 1700, 318, 3203, 2278, 2672, 1175, 2297, 1389, 158, 1482, 917, 242, 2820, 1382, 2339, 2476, 2319, 1760, 2836, 2764, 2992, 216, 689, 1957, 2518, 2976, 2274, 98, 1727, 2169, 3121, 2990, 1893, 1692, 848, 383, 1378, 1271, 2513, 2877, 2542, 1915, 2043, 3033, 284, 707, 229, 267, 380, 426, 2922, 2909, 230, 2463, 898, 1788, 74, 256, 868, 2214, 934, 685, 2176, 1903, 1400, 215, 66, 657, 170, 3173, 2434, 2087, 1473, 3008, 2858, 2109, 1604, 2264, 2651, 510, 1352, 104, 1602, 59, 2314, 1218, 1363, 2972, 2477, 902, 2273, 488, 1072, 1058, 3154, 746, 558, 258, 443, 1786, 3161, 2115, 1871, 1425, 2081, 2524, 2885, 253, 324, 1256, 1084, 1800, 2570, 275, 460, 1156, 1462, 231, 1611, 1716, 2522, 1639, 779, 931, 1927, 261, 1778, 1443, 3317, 2091, 1834, 2910, 1029, 2727, 797, 3269, 2356, 2600, 2977, 2224, 1866, 245, 2342, 3084, 860, 1473, 1660, 609, 1777, 1428, 1869, 834, 10, 2054, 2642, 3223, 677, 3042, 92, 1272, 1213, 2508, 2843, 897, 2437, 2623, 2634, 1795, 1867, 2063, 2488, 2064, 724, 2842, 3083, 2745, 467, 1319, 1891, 996, 2271, 1164, 2569, 1876, 2238, 1001, 3311, 234, 1026, 1130, 2514, 1888, 1091] NTTInverse(tHat^T * rHat): [3165, 661, 2894, 3181, 3096, 2553, 1089, 1146, 3139, 2327, 3046, 3041, 452, 1230, 2199, 2491, 528, 1887, 2834, 1825, 832, 2627, 1113, 3176, 3139, 2533, 2112, 2531, 1676, 1186, 2610, 1289, 1477, 2822, 464, 602, 1339, 3167, 1847, 316, 1390, 2311, 3093, 1315, 1918, 766, 2377, 3009, 723, 2400, 30, 1252, 2054, 2582, 436, 1263, 2846, 2330, 3219, 2495, 2253, 1201, 861, 735, 996, 1111, 2904, 2551, 897, 1300, 1176, 214, 3062, 1450, 1077, 447, 1730, 2089, 630, 2270, 1229, 351, 1674, 1326, 2471, 848, 701, 2381, 2299, 3320, 1583, 1231, 1877, 1331, 1017, 2314, 2093, 873, 3137, 2734, 1795, 1367, 2729, 638, 582, 1662, 400, 199, 1689, 1784, 3269, 1785, 596, 104, 2156, 204, 2402, 656, 286, 2706, 2893, 1424, 2240, 1816, 303, 1620, 1289, 167, 2248, 3182, 562, 89, 893, 1986, 499, 2277, 1993, 78, 1266, 3272, 1875, 3067, 1454, 2343, 2202, 534, 1572, 2758, 2112, 384, 495, 15, 1280, 2288, 2877, 2342, 2335, 741, 1122, 2954, 2666, 3010, 901, 1307, 2660, 1862, 1392, 554, 2279, 1542, 1615, 2999, 1401, 2408, 84, 2938, 126, 1729, 171, 2937, 1212, 133, 892, 491, 1078, 2304, 1502, 874, 73, 1636, 221, 3114, 1329, 63, 304, 628, 580, 2373, 2023, 2080, 1390, 2119, 1863, 2834, 2166, 1609, 2882, 2462, 931, 1521, 716, 354, 499, 468, 737, 1394, 2695, 149, 2627, 2563, 1125, 1565, 572, 1112, 800, 1565, 1672, 536, 2108, 1287, 1997, 3073, 1800, 1279, 817, 197, 1641, 1692, 1627, 54, 3190, 1284, 2030, 1810, 545, 162, 1439, 915, 2065, 1856, 1942, 2995, 2801, 3128, 2244, 1673] e2 + mu: [0, 1, 1, 3328, 0, 3328, 1665, 3328, 0, 1664, 1665, 1666, 1666, 1665, 3328, 1665, 1663, 3327, 1666, 1664, 1665, 0, 3327, 1664, 0, 1665, 0, 1665, 1, 0, 1664, 1664, 1663, 0, 1, 3328, 3327, 3328, 1666, 1664, 0, 1665, 1666, 1665, 1, 1665, 1667, 3328, 3328, 2, 1665, 1664, 1664, 3328, 1, 1665, 1665, 1667, 1663, 3328, 0, 1665, 3328, 1665, 1664, 0, 1664, 1665, 1666, 1664, 1, 1, 1665, 0, 2, 1666, 3327, 3328, 1666, 3328, 0, 0, 0, 1, 1666, 2, 1666, 1666, 3327, 3328, 0, 1665, 0, 3328, 1665, 1663, 1666, 1667, 1664, 1664, 1664, 1665, 1, 3327, 1666, 1, 1665, 1665, 1665, 3327, 3328, 1664, 1666, 0, 1666, 1665, 1665, 1665, 3328, 1, 1666, 1, 1, 1665, 3328, 1, 2, 1666, 1665, 1667, 0, 1664, 1666, 1664, 3328, 1665, 1664, 0, 3328, 1, 1665, 1664, 1667, 3327, 1665, 1665, 1666, 1, 1666, 3327, 1665, 1, 1, 1665, 1, 1665, 0, 0, 1667, 0, 1, 1665, 0, 1, 3328, 1, 1664, 1, 1664, 3328, 3327, 1666, 1665, 0, 1, 3328, 0, 1, 0, 1, 3327, 1665, 3327, 1666, 1666, 1667, 3327, 3328, 1665, 1665, 1666, 1666, 1667, 1663, 0, 0, 1664, 0, 3328, 1665, 1665, 1665, 1663, 1664, 1665, 0, 1664, 1664, 0, 1, 1665, 1664, 0, 1664, 1666, 1667, 3328, 1667, 3328, 0, 0, 1666, 1665, 1666, 1, 3328, 3328, 1664, 1664, 0, 1, 1665, 1666, 1665, 1, 3328, 0, 0, 3328, 1664, 3327, 3328, 1664, 1, 1664, 2, 0, 1666, 2, 0, 1666, 3328, 0, 0, 1664, 1665] v = NTTInverse(tHat^T * rHat) + e2 + mu: [3165, 662, 2895, 3180, 3096, 2552, 2754, 1145, 3139, 662, 1382, 1378, 2118, 2895, 2198, 827, 2191, 1885, 1171, 160, 2497, 2627, 1111, 1511, 3139, 869, 2112, 867, 1677, 1186, 945, 2953, 3140, 2822, 465, 601, 1337, 3166, 184, 1980, 1390, 647, 1430, 2980, 1919, 2431, 715, 3008, 722, 2402, 1695, 2916, 389, 2581, 437, 2928, 1182, 668, 1553, 2494, 2253, 2866, 860, 2400, 2660, 1111, 1239, 887, 2563, 2964, 1177, 215, 1398, 1450, 1079, 2113, 1728, 2088, 2296, 2269, 1229, 351, 1674, 1327, 808, 850, 2367, 718, 2297, 3319, 1583, 2896, 1877, 1330, 2682, 648, 430, 2540, 1472, 1069, 130, 3032, 2730, 636, 2248, 1663, 2065, 1864, 25, 1782, 3268, 120, 2262, 104, 493, 1869, 738, 2321, 285, 2707, 1230, 1425, 2241, 152, 302, 1621, 1291, 1833, 584, 1520, 562, 1753, 2559, 321, 498, 613, 328, 78, 1265, 3273, 211, 1402, 3121, 2341, 538, 2199, 3238, 2759, 449, 382, 2160, 16, 1281, 624, 2878, 678, 2335, 741, 2789, 2954, 2667, 1346, 901, 1308, 2659, 1863, 3056, 555, 614, 1541, 1613, 1336, 3066, 2408, 85, 2937, 126, 1730, 171, 2938, 1210, 1798, 890, 2157, 2744, 642, 1500, 873, 1738, 3301, 1887, 1451, 2996, 1726, 304, 628, 2244, 2373, 2022, 416, 3055, 455, 197, 1169, 502, 1609, 1217, 797, 931, 1522, 2381, 2018, 499, 2132, 2403, 3061, 2694, 1816, 2626, 2563, 1125, 3231, 2237, 2778, 801, 1564, 1671, 2200, 443, 1287, 1998, 1409, 137, 2944, 818, 196, 1641, 1692, 1626, 1718, 3188, 1283, 365, 1811, 2209, 164, 1439, 2581, 2067, 1856, 279, 2994, 2801, 3128, 579, 9] c: 778D6B03791ACAF56CAAFCC78CEE5CBCA1DE8737E9C7FF4AE5F384D344E08223C74C824CB5848520517C7F0EA0645EB6F889517AE5216B0CF41DDC3F0D1DF9BC6E4DECB236A5EA8B214F64266D3CDE08E0CB00E5D91F586706B1EE533D20476F4423B78F916B1726EEEA959FFB9AC634D04A94D09923CB0D4E730CCA4144E7C4884921652DA4928C68E644F673CFC57D3E87CF5BE581A89F9CB8F0FCE2782D681E5CE88AF58458C3D63D807572DE5AA8E1FAF2DCD14EDB7349565B7D3271DDBEB0B6CC7AFE08635784311159733C46E5FDC5E0CD36CE5685ACFB1AFE50ABB46F447521E60D9C8F0E4CA28C190ABB40C365F412471E95A8EA396D4BD8070EEB1F02B07C825367AA1EC0F10C3862416BB21AD6CA748A86E9829EFC1A0499093C85176D37F574C75CF5EDFA8D920D3268CB34C6A4BB0002869BC05D7C8FCC0658D4A01EACD74557A37D98A763074752DFDD6429881CAFF577D3A048031BD52C4E9726398590F9519FD59405D6B3C307AFCB168A985785D954A6D1DC1EA92E1EB6F946A4D99DD6CA307ABFD8362FABA98BB264C69C5F555D60883CC56019FEB4E8000C48B7E68CD667F00B5250CEF293A4A9E778726E62F120361E21AB3140464CDC6ABDE9EA05198D8B3BB671B9111A2F317582847CA5015664F22CDB08C143187BDE2129B54F34160295D75FE9A494FD7E67AAA76B57AAFFD89D01A71DF5C8158620298D582BBEFA6D09AC412A99AA3BE9C383504948C43DD5AF4127B1435804F44BAFA142BFC2A95D95FB2EF0641ABE71064DE51D6B9EC50857B8EEF7F48036313D0E936763B8F7BDE69B064DD5761D80EA6F1A8B37565753C579BBB895EFB9FCB3FC5FA3362E3774F0F77140B973CAE587BAD2F3B566A9C25A969347E5C54F87F1105E9C074867D94077CCAE3ABEA54520EDB51D9DAABE7848E78FDF66E07E2E22B30251931E890BAF1F5E177D4D9CEC9E4969481FD7C1335A0ED5879F34EF4BB4F66C28803CEA162BA461506D52EB3AE16951922B06825186C3D4CE1B51F3C92F3C52F2D04D1F13B2B17C9EEB882CCE0EB88B7EA9A1CE4E37415CC84C7BC436A4628386CC77D9AFD207911BD9BFD8A7FA05C275BE0C4C6A8FC0A61BDA1D67AE33B5310BE1290DC71C1418EB5744BF2842C1652173A49A692E71FE43258A205B3CAAB90C0304A51E77D01B404A01FAE2F83AB80C5DBF6CF518C001F46A633FA169B1BDB77A9D0B1E0C007835C09F6ABBA96F3F53564DA508EE8861A483A81749D4A44672B1EF1605F29D168B74B736B4F13501D7AD1213118A7832E666A50BE8010D54322A526CF7A4E543A79D0D98E004FBEC76EA3F7E887BDBAF50DADFDDDF3FFECF6D3F77EA4B9B16DC754F4A68E5EF32F6A137E7C9E3C3E8C2E236C7EBC45D46EC1677A5A8BB2668443B0BE8693DC257F13D8B9A90100B92B4D1761B819673832C32020671BFB3D0220A363E4BED6D649D3F7368CFE081E196A43D4708798E31BB2A2F61824674ABA2FC9DCD05DB84B8627AE11488886F921BC79AE1FD03 fips203-0.2.1/tests/nist_vectors/Key Generation -- ML-KEM-1024.txt000064400000000000000000001755341046102023000217430ustar 00000000000000Key Generation -- ML-KEM-1024 z: 7AF65022E0A472ED6388638EA29D82DA68B4CF9FFDF2B67CD708EA5A370C6A7C d: 7AF65022E0A472ED6388638EA29D82DA68B4CF9FFDF2B67CD708EA5A370C6A7C rho: 30052337ACA7C8521AB44F1E2A049B83E0774C96CD8C876FA675D0923977271B sigma: 889827B5C3F8C203A48974ECF1CAD9CB2BFE5F87EBA26F585BBF02AC89176D2A aHat: [[[1652, 2709, 763, 2938, 1546, 2812, 478, 1643, 2699, 3011, 80, 152, 2846, 2573, 2671, 382, 1188, 1272, 2324, 1034, 1267, 1818, 2144, 2478, 2843, 2676, 2244, 1278, 2717, 2408, 1897, 2639, 2481, 781, 2925, 1506, 7, 1056, 2984, 2660, 3088, 2597, 578, 1579, 628, 3025, 2972, 2376, 3307, 1208, 1112, 2414, 2516, 286, 2978, 2668, 614, 2095, 370, 724, 2983, 2724, 1214, 728, 551, 826, 2744, 2417, 1999, 1540, 1055, 378, 1369, 2764, 3108, 2801, 1962, 373, 1856, 2283, 324, 834, 2121, 556, 1, 2100, 2203, 591, 2729, 2066, 1406, 2540, 2258, 2177, 2625, 1717, 791, 2880, 836, 2708, 905, 651, 811, 154, 262, 1018, 3009, 60, 1648, 92, 840, 1552, 2757, 1412, 1897, 1441, 983, 1683, 3313, 1330, 1288, 1630, 2284, 3144, 1038, 3244, 1610, 354, 1945, 1578, 2309, 1091, 1881, 2674, 1253, 905, 2869, 1686, 2600, 82, 1434, 2382, 2771, 87, 663, 1390, 1547, 2663, 1989, 5, 1488, 882, 3131, 933, 1649, 1516, 1832, 141, 1582, 1438, 2470, 716, 151, 781, 3045, 3312, 2271, 3090, 1235, 761, 3272, 1157, 1707, 2185, 66, 1214, 655, 430, 1771, 2217, 2222, 741, 358, 2928, 1325, 3222, 2696, 818, 1342, 825, 1070, 2540, 374, 2469, 2990, 2717, 1272, 2211, 878, 1355, 173, 2303, 2390, 2158, 1532, 829, 2634, 811, 1838, 812, 841, 760, 3151, 2392, 2594, 3217, 561, 3163, 37, 529, 3170, 2221, 3191, 1694, 873, 1880, 2071, 2460, 1896, 140, 2316, 2480, 1419, 1261, 3184, 31, 1114, 1447, 3318, 2221, 1601, 2732, 1451, 504, 2698, 80, 716, 2138, 2815, 387, 2871, 2115, 1732, 3062, 7, 2013], [1814, 3075, 1364, 2326, 2782, 1230, 1232, 3219, 2519, 287, 972, 562, 908, 217, 1149, 1377, 117, 2774, 3169, 2260, 1907, 2670, 997, 2736, 2936, 3288, 1602, 563, 1987, 1760, 405, 939, 1338, 58, 3053, 597, 188, 122, 2583, 3121, 2142, 1170, 1294, 27, 2263, 2034, 1286, 2297, 27, 2873, 2087, 3118, 786, 1370, 271, 1822, 2446, 1803, 1262, 3283, 2316, 2874, 666, 322, 1288, 1377, 2592, 1481, 1902, 3026, 2224, 1162, 412, 62, 1255, 1701, 646, 2379, 984, 1324, 86, 1394, 3159, 3217, 297, 3214, 1775, 224, 1211, 1689, 3219, 1238, 2832, 1472, 780, 791, 2068, 2175, 512, 1092, 3179, 1491, 1925, 1155, 1475, 1718, 1518, 2788, 2326, 1701, 290, 1324, 1269, 69, 1429, 1600, 2173, 2777, 3232, 1623, 62, 1683, 495, 1874, 1180, 2961, 1213, 515, 2100, 2066, 956, 2085, 2189, 2267, 1718, 28, 127, 2729, 1719, 1773, 855, 1141, 3278, 2240, 2496, 2034, 1352, 2506, 1490, 1826, 2498, 2023, 1520, 3215, 3279, 2406, 2761, 1950, 678, 408, 488, 2901, 2410, 1445, 2383, 1429, 644, 3033, 1460, 2388, 374, 2267, 1380, 63, 172, 2726, 803, 1599, 1886, 1025, 1569, 2498, 524, 3227, 2984, 1514, 44, 2340, 2516, 2693, 2254, 1294, 2879, 1998, 2702, 242, 1931, 1111, 3182, 682, 2301, 2044, 1972, 380, 90, 405, 1024, 1188, 866, 1395, 505, 2727, 1152, 3231, 412, 1908, 2840, 2030, 2785, 2578, 3305, 1310, 2011, 388, 1321, 12, 1264, 1758, 274, 900, 1998, 1261, 1271, 3265, 540, 36, 1910, 2520, 213, 352, 283, 139, 0, 363, 2048, 1945, 2466, 2287, 3085, 1636, 996, 2390, 3156, 2946, 113, 2175], [1514, 2850, 3241, 3269, 252, 2471, 2422, 2055, 2274, 1913, 2400, 2995, 1555, 3061, 3285, 3116, 1030, 82, 3145, 1455, 2641, 1402, 1888, 3293, 1285, 2872, 891, 2921, 2097, 1545, 2014, 1326, 2677, 1729, 1590, 2450, 2907, 2271, 1668, 865, 1278, 2849, 2672, 2257, 1484, 2148, 900, 700, 2760, 2472, 685, 2963, 3257, 1272, 2867, 1589, 2955, 3263, 2704, 774, 3118, 584, 568, 3061, 2231, 3201, 229, 2718, 3062, 584, 2849, 2412, 694, 2647, 640, 3270, 390, 2610, 664, 1495, 2429, 3053, 2549, 2419, 818, 2609, 2339, 2026, 1548, 1134, 2454, 2876, 2505, 2552, 378, 1157, 831, 816, 3166, 1638, 3104, 976, 2329, 2103, 4, 764, 1211, 2090, 3229, 2114, 2933, 60, 2659, 1302, 1511, 2460, 786, 1183, 1358, 1956, 3287, 1821, 1273, 912, 2532, 2368, 1188, 2003, 1173, 3293, 236, 1869, 1242, 3291, 2992, 1419, 3117, 2527, 1453, 2844, 2778, 2646, 2881, 2216, 559, 2669, 772, 1769, 694, 2330, 1002, 1417, 2725, 729, 3306, 1594, 2677, 2035, 3155, 727, 727, 2996, 1625, 1651, 699, 799, 2698, 2601, 2737, 1563, 3098, 335, 680, 12, 1980, 702, 2465, 979, 983, 1048, 2206, 1920, 2646, 2249, 2964, 2629, 298, 2961, 421, 2314, 2903, 321, 2198, 1927, 338, 1780, 1364, 2710, 1835, 823, 2269, 925, 113, 267, 472, 1423, 3087, 11, 2467, 2293, 2263, 1801, 277, 2138, 919, 3113, 2740, 1935, 964, 502, 781, 1649, 2970, 553, 264, 2051, 1190, 1389, 2909, 865, 2662, 1132, 3019, 2770, 3311, 434, 515, 3051, 1592, 2082, 2140, 658, 2595, 566, 3199, 2974, 1778, 1182, 2, 3126, 1278, 1678, 2056, 2101, 1642, 2578], [2612, 1718, 2853, 989, 2686, 2869, 3278, 2056, 1801, 2774, 793, 476, 276, 3297, 533, 2268, 2306, 507, 32, 1470, 889, 685, 341, 1131, 2929, 1698, 880, 869, 1720, 470, 375, 380, 2541, 1818, 2951, 792, 1033, 2912, 443, 2128, 271, 2744, 1407, 1252, 2667, 544, 3091, 2378, 1892, 1686, 3278, 517, 399, 1573, 1942, 1037, 82, 2526, 958, 2031, 405, 2959, 3169, 204, 625, 2736, 2397, 3148, 1093, 2058, 752, 2022, 3196, 890, 2625, 1031, 2472, 564, 3162, 39, 2309, 714, 2743, 2724, 826, 2890, 1984, 540, 993, 2822, 2741, 1082, 2047, 1620, 2134, 1405, 1282, 2771, 1473, 1882, 2709, 106, 1206, 1946, 1978, 2538, 2256, 1975, 1434, 1651, 537, 900, 2005, 430, 2270, 994, 1757, 2700, 784, 2957, 1675, 2139, 3278, 845, 1405, 86, 3136, 3069, 1535, 3263, 1259, 2131, 341, 105, 1790, 1957, 1727, 631, 2150, 3150, 1981, 2673, 3190, 496, 635, 674, 1617, 2193, 2236, 3192, 1049, 2757, 3203, 2301, 1627, 298, 145, 2531, 700, 828, 1875, 414, 3245, 965, 1563, 1234, 3106, 1618, 2638, 2177, 2684, 2123, 2569, 95, 1793, 2361, 2453, 196, 251, 2301, 1851, 1988, 837, 2740, 937, 1798, 183, 2702, 198, 205, 26, 2505, 641, 1472, 3271, 1467, 2649, 1098, 30, 1524, 1406, 185, 14, 1364, 1047, 1584, 2182, 1160, 2381, 1045, 2472, 17, 630, 730, 612, 2248, 1098, 2496, 181, 2113, 690, 985, 2370, 2211, 226, 1994, 1459, 1645, 2771, 3277, 2230, 2953, 22, 3135, 2967, 1519, 488, 1299, 430, 2557, 2757, 146, 2268, 467, 2096, 2182, 2013, 2743, 1869, 1117, 3326, 769, 3106, 397, 137, 291]], [[550, 1346, 65, 3260, 365, 436, 431, 1333, 2159, 1739, 1199, 294, 671, 361, 2154, 927, 83, 42, 1028, 402, 3223, 3057, 2718, 2237, 2211, 3109, 565, 2834, 1914, 1935, 1455, 1284, 1244, 1584, 565, 258, 1972, 1700, 1897, 2505, 1257, 2436, 2975, 364, 352, 1334, 736, 3195, 2843, 575, 1460, 448, 2038, 692, 1703, 1059, 2382, 1490, 328, 1689, 2641, 2478, 820, 1548, 2185, 2674, 2416, 3258, 2095, 1639, 2470, 1326, 2538, 1620, 3227, 3296, 726, 567, 1549, 1617, 687, 1984, 12, 1173, 2507, 3017, 688, 1109, 703, 247, 891, 997, 2290, 1086, 2760, 2816, 998, 2921, 2657, 2914, 595, 1186, 2536, 864, 918, 2592, 2904, 809, 700, 2929, 2200, 402, 1605, 263, 2440, 1177, 1306, 2056, 2898, 1111, 1710, 1997, 2983, 1924, 903, 1204, 642, 2756, 751, 691, 455, 3129, 1921, 3137, 584, 2230, 1115, 278, 2811, 395, 1598, 3137, 2356, 142, 1226, 3060, 1647, 3031, 498, 1150, 441, 334, 1432, 609, 2878, 1227, 1778, 1888, 2070, 3279, 1866, 208, 2755, 3175, 153, 3246, 2089, 2556, 1811, 928, 1197, 746, 788, 2953, 1564, 2364, 3022, 2833, 3112, 2502, 3080, 1981, 1585, 1254, 3083, 2670, 151, 2749, 685, 1836, 248, 1297, 203, 1234, 3246, 434, 630, 793, 1119, 3228, 1903, 725, 3218, 2536, 1421, 2918, 2480, 1757, 2321, 1641, 2463, 2715, 1621, 2726, 1373, 2081, 244, 1724, 1758, 1041, 158, 3223, 1646, 2191, 2393, 2520, 658, 520, 17, 1519, 2102, 2603, 637, 3020, 2618, 2201, 3015, 2870, 354, 1936, 2557, 2835, 793, 36, 3212, 1246, 2680, 2975, 283, 2555, 2631, 1941, 2649, 2085, 633, 1263], [322, 638, 1997, 309, 2643, 406, 3306, 1544, 101, 1685, 1366, 3197, 2937, 1799, 707, 1050, 1924, 3217, 2258, 2127, 1995, 2877, 2495, 1081, 521, 1575, 1341, 57, 2552, 1379, 976, 1729, 2626, 2455, 819, 3014, 644, 1176, 561, 747, 2500, 1358, 2911, 794, 3100, 218, 2730, 975, 1001, 632, 918, 1903, 357, 2755, 2644, 581, 2686, 2692, 55, 888, 65, 2497, 178, 2829, 1162, 1635, 427, 3065, 3157, 464, 3006, 1286, 2396, 2168, 628, 602, 220, 578, 1060, 2274, 2057, 762, 2517, 1550, 3138, 2931, 207, 3327, 2323, 2556, 1208, 1573, 281, 1964, 850, 1708, 2369, 2183, 566, 3024, 1668, 140, 3161, 1117, 79, 1929, 1056, 742, 1685, 489, 1608, 2611, 271, 1645, 3175, 206, 2278, 2206, 1791, 2933, 2768, 3096, 1571, 3210, 2759, 1361, 934, 785, 3116, 136, 1433, 613, 220, 2890, 2745, 1577, 1661, 676, 1296, 2236, 567, 303, 2945, 1198, 2992, 1425, 2762, 1312, 683, 1146, 1207, 1707, 1142, 2796, 2202, 184, 174, 1986, 1031, 1002, 1772, 3020, 1211, 1255, 250, 848, 2432, 2272, 1378, 764, 750, 523, 1310, 1146, 1692, 662, 1993, 691, 273, 1055, 2359, 2521, 806, 1438, 3036, 2348, 3017, 1499, 2933, 2416, 497, 3175, 524, 3312, 2248, 1895, 410, 3259, 1996, 681, 3093, 543, 1088, 1890, 2657, 2648, 2157, 1074, 893, 634, 358, 1859, 608, 1233, 1481, 1745, 3327, 1090, 2564, 1013, 1373, 2318, 3261, 432, 2784, 180, 15, 1956, 2500, 359, 297, 1724, 2404, 2740, 1306, 2973, 2027, 2479, 1947, 2957, 3234, 1838, 2792, 2873, 2814, 1430, 1925, 2999, 2932, 509, 1153, 2091, 808, 1612, 2441, 1342], [2804, 2793, 2684, 2670, 3135, 2888, 2598, 244, 1960, 480, 3315, 1827, 3014, 782, 1090, 1338, 1933, 995, 3035, 1184, 3324, 417, 198, 746, 1283, 1082, 3039, 1804, 2478, 550, 1206, 1513, 2837, 2730, 807, 57, 746, 2764, 381, 2421, 144, 3315, 2507, 1487, 1443, 1796, 1426, 401, 1108, 2236, 1377, 2427, 307, 542, 1667, 1305, 949, 766, 483, 3130, 3145, 2579, 570, 886, 2129, 2242, 1613, 240, 1463, 351, 3180, 1201, 2740, 781, 3251, 2702, 1764, 1046, 1481, 2888, 2517, 1703, 86, 521, 3078, 2558, 1949, 2410, 1568, 94, 1013, 717, 247, 378, 1952, 1927, 3240, 1392, 782, 3023, 2299, 2478, 1758, 2049, 1710, 3092, 3288, 2593, 1307, 142, 253, 139, 965, 2649, 3034, 148, 2296, 2432, 1096, 2630, 2340, 2238, 2577, 1850, 658, 1307, 2354, 2113, 2006, 1606, 2597, 1571, 2255, 900, 827, 1446, 1876, 3157, 1619, 1027, 188, 989, 2942, 2544, 1386, 1188, 2152, 405, 857, 2565, 1080, 2485, 2802, 254, 219, 1104, 1268, 2522, 1923, 1201, 880, 1130, 1647, 2094, 1792, 3079, 2208, 1577, 1380, 1838, 95, 3022, 3212, 10, 2613, 1079, 85, 2584, 2995, 2772, 991, 929, 2480, 3203, 252, 1570, 919, 2028, 2938, 1477, 2124, 3055, 71, 2687, 2058, 472, 1450, 2294, 3208, 1597, 3015, 2778, 1364, 885, 3003, 721, 634, 3293, 2239, 193, 2675, 3292, 2241, 1013, 396, 764, 2677, 399, 1287, 3282, 2695, 741, 1292, 685, 898, 1101, 2217, 1212, 3132, 1561, 3252, 2329, 2746, 1506, 2007, 3205, 1905, 2177, 1918, 1337, 231, 2530, 1817, 1486, 3086, 3278, 765, 2573, 2295, 2667, 1970, 1762, 588, 2410, 1184, 2318], [1066, 1563, 2850, 1114, 1007, 2546, 1986, 44, 1719, 974, 2071, 3199, 2394, 2627, 3052, 398, 969, 228, 2661, 2231, 1429, 2042, 135, 2096, 2188, 925, 219, 290, 520, 200, 1983, 1203, 1408, 221, 3309, 2579, 2969, 1439, 3189, 2629, 17, 2245, 2609, 2462, 2363, 2342, 2781, 2824, 365, 826, 2457, 2887, 2586, 970, 1467, 2273, 3085, 2760, 1074, 370, 3166, 1207, 2684, 1012, 2601, 1118, 2237, 3167, 2590, 2677, 1843, 1439, 532, 279, 2557, 2890, 1497, 3032, 302, 822, 2774, 476, 1731, 118, 1270, 1931, 1778, 654, 554, 2135, 1882, 2658, 2467, 1593, 2621, 1646, 3322, 861, 555, 2359, 940, 708, 3157, 2440, 691, 1526, 378, 1709, 1977, 2639, 2704, 2698, 1377, 1228, 2951, 1411, 1947, 1144, 1231, 3020, 2677, 686, 1423, 820, 2296, 2265, 1956, 2072, 1703, 1506, 3098, 842, 1575, 2905, 1311, 2494, 2502, 3119, 1650, 612, 1749, 999, 1293, 2558, 1788, 2612, 223, 2401, 2847, 724, 1873, 2791, 3264, 1623, 2037, 2871, 386, 2840, 807, 2928, 2527, 2828, 754, 1359, 610, 2350, 2819, 512, 1198, 178, 1332, 1548, 984, 496, 892, 2599, 531, 2252, 2437, 1891, 2311, 1479, 1441, 1509, 1675, 402, 1669, 435, 708, 531, 1761, 3132, 1390, 1254, 139, 902, 3300, 3161, 3317, 2413, 2877, 1298, 1532, 1989, 2446, 1919, 1686, 465, 1972, 1929, 2209, 424, 2154, 224, 1231, 2702, 1772, 1218, 1344, 62, 1619, 2557, 187, 1222, 2996, 1431, 1851, 2399, 2976, 1863, 66, 829, 350, 1321, 2616, 2218, 2319, 2242, 762, 212, 664, 1806, 142, 2739, 441, 2362, 449, 2371, 14, 1276, 1829, 692, 1964, 1140, 1891, 2619]], [[2969, 364, 2109, 2109, 944, 2810, 685, 936, 2351, 942, 3308, 2687, 3264, 2404, 2898, 3092, 197, 3253, 3039, 1696, 3118, 1362, 2478, 824, 131, 1304, 3297, 1659, 2575, 1044, 2588, 434, 1853, 695, 2046, 1330, 1920, 1817, 2042, 1862, 85, 1906, 1526, 455, 356, 1132, 311, 274, 530, 2967, 2344, 1542, 2241, 972, 2078, 3201, 246, 3316, 2083, 803, 2794, 2479, 336, 1961, 256, 1555, 977, 1824, 406, 137, 214, 76, 934, 565, 829, 1875, 929, 657, 2453, 2004, 2087, 2357, 3079, 1666, 1331, 998, 2255, 149, 1473, 3229, 1403, 2448, 1707, 1669, 1533, 3276, 2592, 1923, 610, 171, 2653, 1755, 1461, 1410, 733, 754, 2210, 989, 68, 1132, 2770, 85, 846, 517, 2035, 2926, 1293, 3260, 3022, 2349, 2388, 2678, 720, 1663, 1136, 3251, 2820, 1869, 1909, 1917, 803, 1541, 2507, 2545, 1979, 3058, 333, 2800, 2125, 183, 707, 224, 194, 3064, 1183, 1180, 1473, 1418, 1777, 1888, 1194, 3309, 664, 461, 1616, 2693, 2108, 1873, 1762, 2683, 1165, 641, 2678, 3123, 1182, 1304, 35, 2739, 1252, 951, 1590, 840, 431, 1041, 801, 2808, 2362, 2429, 3017, 2184, 1038, 3280, 2569, 1505, 465, 2804, 1476, 1565, 445, 161, 1878, 939, 1343, 1321, 3163, 1499, 762, 3091, 2383, 271, 544, 1682, 2329, 1278, 1476, 2296, 1642, 2425, 216, 1671, 2340, 2779, 80, 2074, 1357, 3048, 3026, 1090, 2633, 501, 2202, 2825, 2754, 251, 2418, 321, 2937, 1061, 700, 1757, 405, 776, 2517, 2604, 2297, 2399, 1517, 602, 69, 1149, 546, 1629, 978, 1161, 3019, 3245, 596, 2371, 2783, 922, 868, 1828, 1011, 2876, 2194, 1324], [605, 3270, 1954, 1889, 816, 2873, 3317, 2439, 1484, 10, 1401, 480, 750, 1630, 1261, 2894, 1537, 585, 2060, 1720, 689, 167, 3118, 2117, 1891, 1343, 2247, 2293, 2963, 2725, 295, 826, 2165, 457, 1534, 800, 15, 1560, 1613, 18, 1278, 615, 658, 764, 1759, 1900, 2730, 867, 1718, 2447, 1058, 1082, 3131, 1375, 454, 323, 3292, 2084, 2344, 1914, 392, 2533, 2710, 2623, 1101, 1525, 902, 1585, 1182, 144, 2408, 941, 1478, 2665, 594, 525, 2070, 16, 3091, 2952, 674, 2445, 1922, 2188, 1088, 2951, 1149, 1683, 582, 2391, 1402, 470, 1157, 3296, 1644, 64, 222, 1674, 2554, 1300, 2680, 252, 2116, 2860, 2650, 2779, 1538, 990, 1107, 2635, 445, 3196, 1724, 1318, 2298, 194, 1210, 1719, 1914, 1697, 1510, 2725, 1152, 1256, 2778, 228, 1002, 1033, 1814, 1964, 3083, 2496, 1330, 1627, 1511, 3024, 813, 2026, 2485, 2479, 614, 418, 2968, 1559, 737, 666, 1221, 294, 1398, 417, 82, 362, 1809, 1570, 1869, 2532, 3020, 2954, 720, 2568, 1621, 2879, 482, 2602, 115, 2279, 1977, 2530, 1873, 2981, 2859, 2195, 46, 1816, 1722, 1440, 1565, 612, 2994, 852, 3315, 1549, 1037, 407, 543, 1367, 1913, 1584, 120, 1034, 2850, 2383, 1734, 3135, 2075, 69, 2728, 2146, 1138, 1133, 1603, 902, 2910, 877, 917, 2455, 1082, 539, 2108, 3038, 3166, 2452, 349, 1694, 1681, 1521, 3157, 213, 1189, 2326, 3308, 2460, 1286, 376, 2344, 2709, 2542, 936, 1959, 1549, 2227, 842, 2523, 2345, 406, 805, 593, 497, 1398, 1396, 2357, 146, 1444, 2060, 2618, 2452, 1684, 131, 1969, 2807, 2545, 3324, 866, 838, 2643, 2820], [3074, 946, 699, 2360, 3284, 869, 2741, 2437, 403, 138, 1479, 3100, 1659, 794, 1730, 1410, 1659, 1924, 2899, 3125, 2395, 2904, 495, 1586, 902, 737, 395, 1954, 434, 1671, 550, 2737, 2514, 541, 2529, 771, 679, 187, 1290, 2656, 1169, 2201, 1620, 1640, 2949, 626, 1693, 2041, 2679, 23, 1627, 957, 1937, 3140, 1007, 1177, 1029, 1386, 1437, 255, 1715, 2096, 2140, 3282, 2835, 3102, 2220, 3253, 3288, 2311, 2584, 1433, 483, 1167, 2153, 664, 1387, 2578, 3116, 3171, 2304, 2681, 1453, 1536, 626, 1647, 2189, 2760, 3134, 1012, 185, 2069, 532, 2209, 3090, 1122, 19, 163, 2718, 132, 2075, 796, 2073, 3196, 2119, 2662, 2339, 2385, 2895, 1772, 1401, 1128, 152, 1561, 1013, 2488, 13, 2187, 2155, 936, 2275, 1749, 102, 1524, 3120, 1219, 1256, 372, 2263, 1886, 959, 621, 1065, 925, 768, 742, 2948, 1238, 2255, 92, 150, 1670, 3324, 1392, 763, 2795, 2843, 949, 1497, 1763, 398, 70, 2841, 2547, 2491, 1320, 2328, 82, 761, 1763, 3107, 1419, 370, 2524, 2667, 3272, 2041, 792, 385, 869, 103, 1282, 503, 2951, 41, 813, 1683, 1899, 2667, 2252, 1887, 779, 192, 2493, 3256, 2260, 2628, 2734, 2317, 2915, 1483, 869, 985, 2107, 61, 2273, 809, 466, 1603, 2916, 2543, 3108, 865, 94, 2696, 1213, 1277, 2696, 674, 2416, 1972, 1388, 2193, 3089, 1189, 795, 2503, 1671, 3111, 1827, 2094, 556, 1585, 69, 2416, 1811, 1675, 3012, 3179, 3242, 124, 2227, 818, 2940, 216, 1151, 1997, 2070, 246, 1955, 2409, 1996, 1279, 951, 2576, 2178, 1884, 1016, 3308, 2614, 303, 2956, 96, 2249, 2331, 2642], [2345, 807, 563, 1066, 1579, 1614, 317, 261, 674, 1044, 3238, 1330, 1482, 1880, 901, 2270, 2513, 2257, 1636, 869, 2410, 2277, 2542, 951, 2777, 1161, 548, 1812, 168, 674, 1375, 499, 169, 2052, 1243, 2911, 758, 1518, 900, 678, 142, 3063, 335, 968, 947, 190, 1913, 2847, 1250, 1866, 3056, 1092, 2627, 3255, 664, 1583, 1784, 2454, 2131, 1933, 1196, 1688, 909, 3257, 1365, 851, 1262, 2352, 2464, 663, 1514, 2634, 669, 22, 1610, 2040, 1159, 1714, 499, 1388, 2654, 3090, 2542, 1951, 1604, 2515, 1000, 850, 2970, 2874, 1273, 1301, 1883, 1091, 875, 2189, 3144, 439, 2364, 1662, 1898, 507, 2927, 550, 1415, 113, 399, 1726, 3068, 2799, 289, 1040, 2578, 298, 260, 2581, 1007, 2457, 2794, 889, 2573, 2914, 1382, 1941, 619, 2300, 1533, 2698, 707, 1471, 1473, 2151, 14, 655, 1569, 2909, 2369, 3123, 708, 1190, 2025, 1351, 1085, 3021, 1197, 672, 2710, 2010, 1832, 2327, 2061, 1735, 156, 1742, 890, 179, 1182, 1813, 37, 3306, 713, 1251, 3117, 2084, 3099, 2895, 2171, 1954, 2197, 2587, 81, 41, 2295, 650, 370, 2149, 1976, 2025, 2921, 2562, 3043, 2887, 1516, 80, 720, 1344, 373, 744, 1835, 3299, 3260, 12, 467, 1840, 638, 67, 2152, 1866, 192, 387, 3039, 1371, 1095, 2653, 837, 1681, 2058, 1527, 2924, 593, 2474, 2083, 412, 926, 3266, 3065, 701, 1439, 2678, 2344, 3058, 1880, 1698, 2916, 1214, 698, 2859, 2608, 862, 1165, 1053, 480, 1567, 2899, 3046, 2962, 2717, 10, 207, 318, 1383, 1784, 972, 2996, 3242, 174, 3154, 339, 178, 1667, 725, 2915, 1265, 883, 639, 1905]], [[2365, 1266, 2849, 1275, 548, 561, 1179, 2946, 687, 1099, 2510, 1315, 1438, 2146, 2139, 3288, 139, 3246, 2153, 123, 3115, 1287, 1993, 775, 201, 787, 49, 308, 269, 946, 375, 2129, 767, 1699, 2139, 959, 2959, 2141, 2145, 2681, 2594, 1879, 784, 2516, 2582, 3169, 2886, 2278, 3147, 2971, 1923, 271, 342, 2002, 332, 1386, 2954, 468, 2997, 1087, 1574, 1637, 1068, 281, 2390, 196, 3271, 3318, 663, 3027, 1928, 3164, 2294, 1543, 459, 1702, 2518, 371, 1612, 3081, 3163, 795, 3265, 2508, 3082, 669, 619, 2344, 222, 145, 225, 1602, 742, 348, 2075, 1794, 243, 2857, 1571, 1413, 345, 2659, 1408, 3008, 1022, 470, 457, 933, 1851, 792, 1015, 584, 763, 1668, 2289, 872, 320, 409, 1703, 2836, 46, 2937, 2667, 2075, 2149, 1966, 1755, 437, 1843, 1898, 1686, 1170, 743, 3054, 647, 395, 1672, 1333, 65, 665, 2435, 2133, 2227, 2249, 1211, 1782, 2706, 2030, 2923, 453, 99, 2365, 2452, 2565, 1333, 1762, 292, 485, 626, 736, 1601, 1599, 1779, 1014, 1964, 2591, 2180, 1877, 1835, 2109, 2418, 596, 9, 1309, 1890, 404, 64, 1433, 1348, 389, 1775, 2945, 3034, 3293, 1702, 2862, 72, 1654, 600, 1061, 2456, 2448, 1906, 590, 1943, 608, 1685, 3139, 3047, 2248, 2493, 933, 2476, 1683, 1885, 787, 2348, 542, 2071, 2213, 1807, 2371, 1054, 2942, 63, 2026, 2238, 2692, 3007, 1133, 2669, 2217, 1865, 132, 1424, 991, 2629, 2114, 2353, 988, 2469, 1482, 3309, 1476, 324, 1517, 2860, 684, 2483, 2030, 3273, 1606, 844, 263, 3222, 2916, 484, 3135, 130, 2728, 2211, 406, 655, 3093, 197, 3193], [1712, 1394, 145, 2844, 1948, 2192, 2370, 513, 2183, 2290, 2056, 2771, 2563, 853, 2403, 2026, 1086, 2065, 1238, 1455, 2215, 304, 2203, 495, 1533, 2888, 965, 1635, 500, 1487, 2013, 2375, 2036, 2000, 2839, 1638, 2278, 3134, 348, 3008, 2404, 914, 1821, 2713, 1155, 1851, 421, 279, 2313, 1096, 175, 2157, 3000, 564, 1670, 2428, 1902, 1705, 3009, 385, 3316, 3151, 1442, 2501, 1764, 512, 2838, 1490, 934, 3216, 136, 1071, 18, 85, 1628, 2685, 537, 588, 2786, 2331, 2683, 1023, 62, 3141, 1856, 2911, 1166, 2158, 152, 336, 1760, 1158, 2198, 2721, 1298, 1070, 337, 2277, 969, 815, 2317, 1358, 3247, 2107, 20, 1832, 696, 1135, 2555, 1022, 2254, 831, 1816, 1057, 3062, 683, 1264, 1502, 3311, 1865, 2802, 606, 14, 888, 1297, 1122, 571, 2968, 288, 1014, 2922, 1087, 1637, 3151, 74, 486, 1663, 1565, 2503, 878, 2585, 1898, 547, 1500, 645, 733, 1120, 2309, 1789, 1921, 3169, 513, 736, 3138, 1980, 1186, 2148, 949, 2970, 2402, 312, 1148, 1260, 297, 2717, 1516, 1280, 2000, 697, 349, 3220, 3050, 1525, 1574, 3032, 733, 263, 2195, 1045, 3095, 2452, 1619, 1128, 1644, 111, 2168, 39, 1699, 2666, 1544, 2845, 985, 2846, 1853, 2182, 287, 320, 426, 2158, 2292, 3131, 1519, 1120, 1319, 1974, 2875, 2684, 2308, 3133, 77, 3209, 1927, 404, 986, 2135, 2576, 169, 2499, 333, 1720, 1293, 695, 1486, 1470, 1089, 3167, 2412, 53, 2799, 2423, 2450, 3245, 437, 2724, 1249, 1404, 2004, 871, 1813, 553, 121, 1390, 713, 478, 3198, 2283, 282, 2391, 945, 135, 1423, 2407, 1598, 597, 933, 1708], [354, 221, 2080, 3251, 804, 1387, 3049, 56, 2710, 1630, 2480, 1811, 1041, 3195, 2626, 3274, 2785, 30, 2718, 1953, 890, 2750, 1894, 687, 1784, 916, 518, 1460, 1770, 3055, 2914, 1869, 133, 1597, 447, 267, 1985, 225, 2375, 444, 1139, 1324, 2256, 2917, 833, 3125, 1460, 3102, 1848, 1542, 2631, 2467, 2941, 1130, 2903, 12, 1240, 556, 1033, 1161, 1051, 621, 1364, 2550, 2314, 1690, 1176, 1860, 1308, 2842, 550, 2759, 307, 494, 2556, 1049, 972, 1625, 237, 395, 2307, 293, 2621, 1381, 1812, 535, 1591, 39, 195, 1428, 3301, 602, 1505, 2453, 2358, 216, 646, 1965, 1543, 512, 1891, 1687, 1725, 316, 1168, 861, 3247, 1114, 2962, 949, 3211, 2070, 2615, 2693, 3226, 155, 189, 2203, 477, 819, 1655, 377, 364, 551, 1940, 2884, 2704, 2831, 2533, 1099, 1187, 284, 346, 2287, 1431, 236, 3188, 2099, 3302, 29, 2603, 2226, 822, 776, 2037, 2196, 585, 2166, 2966, 1618, 688, 855, 2489, 812, 174, 1221, 1491, 58, 831, 15, 9, 1654, 736, 1996, 2712, 2865, 2057, 162, 1288, 2866, 1368, 3164, 324, 306, 2569, 721, 3250, 375, 57, 1342, 2490, 1421, 377, 1557, 494, 11, 1562, 892, 1332, 915, 1746, 1274, 36, 2471, 1427, 2391, 1327, 1329, 46, 390, 2445, 2152, 3176, 1868, 2831, 1870, 2856, 807, 3001, 3300, 2334, 362, 1147, 712, 3206, 11, 2976, 1392, 2401, 1916, 2246, 2328, 2268, 1670, 52, 949, 791, 911, 1575, 2720, 2983, 293, 1665, 1792, 2998, 920, 2407, 442, 1920, 2204, 1520, 668, 1084, 2588, 1643, 3094, 3178, 1646, 873, 1303, 3115, 226, 950, 381, 1552, 3142], [2864, 1188, 1418, 1457, 1252, 3318, 531, 2402, 461, 159, 1891, 1633, 744, 1336, 2711, 205, 883, 916, 1815, 1212, 3114, 1381, 2045, 557, 2808, 1461, 2749, 1509, 2502, 491, 2328, 399, 2763, 208, 1072, 1216, 451, 3293, 2945, 3052, 2879, 67, 2180, 1184, 2000, 1534, 2749, 2425, 3139, 2893, 3117, 2580, 2012, 11, 2366, 832, 3264, 2973, 2905, 57, 2431, 548, 2091, 435, 2574, 1466, 57, 627, 591, 2485, 2464, 2641, 238, 725, 2952, 3277, 2062, 1804, 993, 2697, 1415, 114, 2273, 711, 34, 847, 2697, 2394, 2913, 1456, 653, 2849, 138, 2649, 224, 2500, 2097, 77, 1278, 1136, 1607, 689, 2353, 3224, 3281, 248, 2795, 414, 2609, 3216, 961, 2489, 2680, 988, 2596, 1061, 2772, 2266, 1269, 996, 3061, 1473, 373, 1802, 1431, 637, 651, 1875, 351, 317, 2908, 796, 702, 317, 2421, 591, 1893, 443, 575, 3083, 1304, 887, 1312, 1834, 1082, 589, 2385, 1098, 1322, 862, 1974, 1730, 1552, 767, 537, 2304, 524, 1798, 2627, 2330, 644, 2732, 296, 2331, 875, 1402, 2872, 451, 2923, 674, 698, 813, 639, 11, 2256, 3135, 1224, 2430, 2759, 1475, 3222, 2654, 1639, 367, 1966, 404, 2916, 1110, 1374, 3123, 1629, 841, 2582, 2528, 1295, 26, 1476, 1931, 2752, 2170, 3030, 2842, 3309, 2768, 561, 3246, 2396, 3202, 1019, 1043, 578, 1441, 1177, 1047, 2101, 732, 3176, 192, 3109, 2618, 1528, 687, 2795, 1103, 2879, 472, 226, 466, 1802, 1347, 2673, 2096, 602, 1282, 3082, 3085, 1120, 3240, 1802, 1092, 2457, 489, 2875, 1486, 2430, 774, 897, 1392, 2477, 906, 980, 615, 772, 1209, 954, 148]]] s: [[3327, 3328, 3328, 3327, 2, 1, 1, 1, 3327, 1, 3327, 0, 1, 1, 0, 3328, 3328, 1, 3328, 3328, 0, 1, 2, 0, 3327, 1, 3328, 3328, 0, 1, 1, 1, 3327, 0, 3328, 1, 3328, 1, 3328, 0, 1, 0, 3328, 3328, 0, 0, 3328, 3328, 3328, 3327, 3328, 3327, 1, 0, 3327, 2, 3328, 3327, 3328, 3328, 1, 0, 0, 3327, 1, 1, 3328, 2, 1, 3328, 0, 3328, 3328, 1, 0, 0, 0, 0, 0, 3328, 1, 1, 2, 0, 3328, 0, 0, 3327, 3328, 3328, 0, 0, 0, 1, 0, 0, 1, 1, 0, 3328, 1, 1, 0, 0, 1, 0, 3327, 1, 0, 0, 2, 3328, 0, 0, 3328, 3328, 1, 0, 1, 1, 2, 1, 3328, 1, 1, 0, 0, 1, 0, 0, 0, 3328, 3327, 3327, 2, 0, 1, 0, 1, 2, 0, 1, 0, 0, 0, 1, 1, 1, 0, 0, 1, 0, 1, 0, 1, 1, 3328, 3328, 0, 0, 0, 3327, 3327, 1, 3328, 0, 0, 3327, 3328, 1, 1, 3328, 0, 1, 0, 1, 1, 3328, 1, 1, 1, 0, 1, 2, 3328, 0, 1, 1, 1, 1, 1, 0, 0, 3327, 0, 3328, 2, 1, 0, 2, 1, 1, 1, 0, 0, 0, 0, 3327, 3328, 0, 1, 3328, 0, 3327, 3328, 0, 0, 3328, 3328, 3328, 3328, 3327, 3328, 0, 3328, 3328, 1, 0, 0, 3328, 0, 0, 0, 3328, 0, 1, 3328, 1, 3328, 1, 3328, 2, 2, 1, 0, 3328, 3328, 3328, 1, 1, 2, 3327, 0, 1, 0, 0], [3328, 0, 3327, 1, 0, 3327, 1, 3328, 0, 3328, 0, 2, 3327, 3328, 1, 0, 2, 3328, 0, 0, 0, 0, 1, 3327, 3328, 3328, 1, 1, 0, 3328, 0, 3327, 3328, 0, 2, 0, 0, 3327, 3328, 1, 1, 0, 0, 3328, 0, 0, 3328, 1, 1, 3328, 1, 1, 1, 3328, 3328, 2, 0, 1, 3327, 0, 1, 3327, 3328, 0, 3328, 1, 1, 1, 0, 3328, 0, 1, 1, 0, 0, 1, 3328, 0, 3328, 1, 3328, 2, 0, 3328, 1, 3328, 3328, 0, 1, 3328, 0, 3328, 0, 0, 3328, 2, 0, 3328, 0, 1, 1, 3328, 3327, 1, 1, 0, 2, 3328, 0, 0, 0, 1, 1, 0, 3328, 2, 1, 0, 0, 0, 3328, 1, 0, 2, 0, 3328, 1, 1, 1, 0, 0, 1, 0, 0, 0, 1, 1, 1, 2, 0, 1, 0, 2, 3328, 1, 3328, 3328, 0, 0, 0, 3328, 0, 0, 1, 3327, 3327, 1, 1, 1, 1, 1, 0, 2, 0, 1, 0, 3328, 0, 2, 3327, 3328, 0, 3328, 3328, 3328, 3328, 0, 1, 3327, 0, 1, 3328, 0, 1, 3328, 1, 0, 1, 3328, 0, 1, 1, 3328, 0, 0, 3328, 3328, 3328, 3328, 1, 3328, 1, 2, 0, 0, 2, 2, 0, 1, 1, 3328, 0, 1, 1, 2, 1, 1, 0, 3328, 1, 0, 1, 0, 0, 1, 2, 1, 0, 0, 0, 0, 3328, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1, 3327, 0, 3327, 1, 0, 3328, 2, 1, 0, 1, 0, 1], [1, 0, 1, 3328, 1, 3327, 3328, 3328, 1, 0, 1, 1, 0, 3328, 2, 0, 3327, 0, 0, 1, 0, 0, 0, 3327, 0, 0, 3328, 0, 1, 1, 0, 1, 3328, 2, 0, 1, 1, 1, 0, 0, 3327, 2, 0, 0, 0, 1, 1, 1, 3327, 0, 3327, 2, 2, 1, 0, 1, 0, 3328, 0, 3328, 0, 3328, 3327, 1, 3328, 0, 3328, 1, 3328, 0, 3328, 0, 0, 1, 1, 0, 0, 1, 3328, 0, 0, 0, 0, 3328, 0, 0, 0, 1, 0, 1, 3327, 3327, 3328, 3328, 1, 1, 1, 3328, 3328, 1, 1, 1, 3328, 1, 2, 1, 3328, 0, 0, 3328, 3327, 3328, 1, 1, 3328, 1, 0, 1, 0, 3328, 3328, 3328, 3328, 1, 3328, 0, 3328, 3328, 3328, 0, 1, 0, 1, 3328, 0, 1, 0, 3327, 0, 3327, 1, 0, 3328, 1, 3328, 0, 3328, 1, 3328, 0, 0, 2, 0, 1, 1, 3328, 1, 0, 0, 0, 1, 0, 1, 0, 0, 2, 3327, 1, 0, 0, 0, 0, 1, 0, 0, 3328, 1, 3328, 1, 3328, 0, 0, 0, 3328, 1, 3328, 1, 1, 0, 3328, 3328, 0, 0, 2, 3328, 1, 0, 3328, 1, 1, 3328, 1, 1, 3328, 0, 3328, 1, 0, 0, 1, 2, 1, 0, 1, 0, 0, 0, 0, 3328, 1, 3328, 1, 3328, 1, 3328, 0, 0, 0, 1, 3328, 0, 0, 3328, 0, 3328, 3328, 1, 3328, 1, 3328, 3328, 3328, 1, 3328, 2, 0, 0, 3327, 0, 2, 0, 3327, 0, 3328, 1, 3328], [0, 3328, 2, 1, 1, 1, 1, 0, 3328, 0, 1, 0, 0, 0, 0, 0, 1, 0, 3328, 3328, 2, 1, 1, 1, 3328, 0, 0, 3327, 0, 3327, 1, 3328, 3327, 1, 2, 3328, 1, 3328, 3327, 3328, 3328, 0, 2, 0, 0, 3328, 0, 0, 0, 3327, 0, 0, 3328, 3328, 1, 1, 0, 0, 3328, 0, 0, 0, 0, 0, 0, 3328, 1, 1, 3328, 3328, 0, 1, 2, 0, 0, 2, 0, 0, 3328, 0, 0, 0, 2, 3328, 1, 0, 0, 3328, 3328, 2, 0, 0, 0, 0, 0, 3328, 1, 2, 0, 3328, 0, 3328, 0, 2, 0, 0, 3328, 2, 0, 3328, 3328, 3328, 3328, 1, 1, 1, 3328, 0, 0, 1, 0, 0, 0, 1, 1, 0, 1, 0, 3328, 0, 0, 0, 1, 0, 3328, 0, 2, 1, 3327, 1, 0, 1, 3328, 2, 1, 0, 3328, 3328, 1, 1, 0, 3328, 2, 0, 1, 0, 3328, 1, 0, 0, 0, 0, 1, 3328, 3327, 0, 0, 0, 1, 3327, 1, 1, 3328, 0, 3328, 0, 0, 3328, 0, 3328, 0, 1, 0, 0, 1, 1, 3327, 1, 0, 2, 1, 3328, 1, 0, 1, 0, 0, 1, 2, 0, 0, 1, 0, 0, 0, 2, 1, 1, 2, 0, 1, 3328, 0, 3327, 3328, 3327, 1, 3328, 3328, 3327, 0, 0, 0, 3328, 2, 0, 0, 1, 3328, 3328, 2, 0, 0, 3328, 3328, 0, 0, 1, 2, 1, 1, 0, 1, 0, 3328, 3327, 3328, 2, 3328, 3328, 3327, 2, 3328, 3327, 2, 1]] e: [[3327, 0, 0, 3328, 3328, 0, 3328, 1, 3328, 3328, 1, 0, 0, 1, 3328, 3327, 0, 3328, 3328, 1, 0, 3328, 3327, 3328, 1, 3327, 3328, 1, 0, 3328, 0, 1, 3328, 3327, 3328, 2, 0, 1, 1, 1, 0, 1, 1, 1, 0, 0, 3327, 0, 1, 0, 0, 3328, 3328, 1, 2, 3328, 0, 0, 0, 0, 0, 1, 1, 1, 3328, 1, 0, 3328, 0, 3328, 1, 3328, 3327, 3328, 1, 1, 0, 3328, 3328, 0, 1, 3328, 3328, 0, 0, 1, 3328, 3328, 0, 3328, 0, 3328, 1, 3328, 1, 1, 3328, 3328, 1, 1, 3328, 1, 3328, 0, 1, 3328, 1, 1, 0, 0, 3328, 3328, 1, 0, 0, 1, 0, 1, 3328, 0, 0, 1, 0, 3328, 0, 3328, 0, 1, 0, 1, 2, 0, 3328, 0, 1, 0, 0, 2, 2, 0, 0, 3327, 0, 1, 3328, 3328, 1, 0, 0, 2, 0, 0, 1, 0, 0, 1, 0, 3328, 2, 0, 1, 1, 1, 3328, 3328, 0, 0, 3328, 0, 0, 0, 3328, 0, 3328, 0, 3328, 0, 3328, 0, 3328, 0, 0, 2, 1, 3328, 3328, 0, 0, 0, 0, 1, 0, 1, 1, 1, 1, 0, 0, 1, 3327, 0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 0, 1, 0, 0, 1, 3328, 1, 3328, 0, 0, 3328, 3327, 0, 0, 1, 1, 2, 1, 3328, 0, 0, 3328, 3328, 0, 3328, 1, 3328, 1, 0, 3328, 3328, 0, 0, 3328, 0, 3328, 3328, 0, 0, 3328, 3328, 1, 1, 3328, 1, 0], [3328, 3327, 3328, 3328, 1, 0, 0, 3328, 1, 0, 3328, 1, 3327, 3328, 0, 0, 1, 3328, 0, 2, 0, 1, 0, 3328, 1, 1, 0, 0, 1, 1, 1, 1, 1, 3328, 0, 0, 0, 1, 3328, 1, 1, 1, 3328, 0, 3328, 0, 1, 0, 1, 3328, 0, 3327, 3328, 0, 3328, 3328, 2, 1, 0, 3328, 3328, 0, 0, 3328, 1, 1, 3328, 0, 0, 0, 0, 3328, 3328, 0, 0, 0, 3328, 1, 2, 0, 3328, 1, 1, 3327, 0, 3328, 0, 1, 0, 0, 1, 3327, 1, 0, 0, 0, 3328, 1, 3328, 3328, 0, 0, 0, 1, 3328, 3327, 3328, 0, 1, 3327, 3327, 3328, 0, 1, 1, 1, 0, 1, 0, 2, 3328, 0, 3328, 3328, 0, 0, 3328, 3328, 0, 0, 3328, 3327, 0, 3327, 1, 1, 0, 3328, 3328, 0, 3327, 1, 0, 0, 1, 0, 3328, 0, 1, 3328, 0, 3327, 0, 0, 0, 3328, 0, 0, 2, 1, 1, 0, 1, 1, 1, 1, 3328, 0, 3328, 0, 1, 3327, 0, 3328, 3328, 3328, 1, 2, 1, 1, 3328, 0, 3328, 1, 1, 1, 3327, 0, 1, 3328, 0, 0, 0, 1, 0, 3328, 0, 1, 0, 1, 3328, 0, 0, 0, 1, 3327, 3328, 3327, 3328, 0, 0, 0, 0, 0, 1, 0, 2, 0, 3328, 1, 3328, 2, 0, 0, 3328, 1, 3328, 3328, 2, 0, 0, 0, 3328, 0, 0, 3328, 3328, 3328, 1, 0, 1, 2, 0, 0, 1, 0, 3328, 1, 3328, 3327, 0, 3327, 3328, 3327, 0, 1], [0, 0, 0, 3328, 1, 0, 3328, 3328, 1, 0, 0, 0, 3328, 3327, 1, 0, 3328, 0, 0, 0, 3327, 3328, 0, 3328, 3327, 0, 3327, 3328, 1, 0, 0, 1, 3327, 3328, 3328, 1, 0, 1, 0, 0, 0, 1, 1, 3328, 0, 1, 0, 0, 3328, 3328, 0, 0, 1, 1, 0, 0, 0, 1, 3328, 3328, 0, 1, 3328, 3328, 1, 0, 1, 3328, 1, 0, 3327, 0, 0, 1, 0, 3328, 0, 2, 3328, 0, 0, 1, 2, 3328, 3328, 0, 0, 0, 3328, 0, 1, 3328, 3328, 3328, 1, 0, 1, 0, 2, 3328, 1, 0, 0, 2, 3328, 3327, 0, 3328, 3328, 1, 0, 0, 1, 1, 2, 0, 3327, 0, 1, 3328, 1, 3328, 0, 0, 3328, 3328, 1, 0, 1, 3328, 1, 3328, 3328, 0, 3327, 0, 3328, 0, 0, 0, 0, 3328, 3328, 0, 0, 3327, 0, 0, 0, 1, 1, 3328, 3327, 0, 3328, 0, 0, 0, 3328, 0, 0, 1, 0, 1, 0, 0, 0, 3328, 1, 2, 0, 3328, 3328, 1, 3328, 3328, 0, 3328, 3328, 1, 0, 3328, 3328, 0, 0, 0, 1, 0, 1, 0, 0, 0, 3328, 1, 1, 0, 0, 1, 3328, 3327, 0, 1, 3328, 3328, 1, 2, 0, 0, 0, 3328, 0, 0, 0, 3328, 1, 1, 3328, 0, 3327, 3328, 3328, 0, 1, 3328, 3328, 3327, 2, 3328, 3327, 1, 0, 3328, 1, 1, 1, 3328, 3328, 3328, 3328, 0, 0, 1, 0, 3328, 0, 3328, 1, 1, 0, 1, 0, 1, 1, 3328, 1, 0], [1, 3328, 1, 1, 1, 1, 1, 3328, 1, 0, 1, 1, 3327, 0, 0, 3327, 3328, 0, 2, 0, 3328, 1, 1, 1, 1, 1, 0, 0, 1, 0, 1, 2, 3328, 0, 3328, 1, 1, 3328, 3327, 0, 3328, 3328, 1, 0, 1, 0, 0, 3328, 0, 1, 0, 3328, 3328, 3328, 1, 0, 1, 2, 1, 0, 1, 0, 0, 1, 0, 3328, 3328, 0, 2, 0, 0, 0, 1, 3328, 0, 3328, 1, 1, 3328, 1, 1, 0, 1, 3328, 0, 3328, 3328, 0, 3328, 3328, 0, 0, 1, 0, 0, 3328, 0, 0, 1, 0, 3328, 0, 3328, 1, 3327, 1, 0, 3328, 0, 0, 1, 0, 2, 2, 0, 0, 3328, 1, 0, 0, 0, 1, 3327, 1, 1, 2, 3328, 1, 0, 3328, 2, 1, 0, 3327, 1, 3328, 1, 1, 1, 0, 3327, 0, 2, 1, 0, 0, 1, 2, 3328, 0, 1, 0, 3328, 1, 3328, 0, 3327, 0, 3328, 1, 0, 0, 3328, 0, 0, 0, 0, 1, 0, 1, 0, 3328, 2, 1, 3328, 3327, 1, 3327, 0, 0, 1, 0, 0, 3328, 2, 3328, 3327, 1, 3328, 0, 1, 0, 0, 0, 3328, 0, 3328, 3327, 1, 3327, 0, 0, 3328, 0, 1, 3327, 1, 1, 3328, 0, 0, 0, 0, 0, 0, 2, 2, 0, 1, 0, 0, 1, 0, 3328, 1, 1, 3328, 1, 0, 0, 3328, 0, 0, 0, 0, 3328, 0, 1, 1, 3328, 0, 0, 1, 1, 0, 3328, 3328, 3328, 1, 1, 1, 0, 2, 1, 0, 1]] sHat: [[138, 2909, 2800, 601, 938, 1497, 2777, 845, 683, 3240, 373, 730, 2406, 2510, 3060, 3240, 2373, 2859, 1243, 436, 1986, 441, 2524, 553, 2229, 3023, 1596, 1920, 1876, 1430, 3079, 2947, 1678, 2978, 465, 2875, 1188, 1702, 2405, 3170, 2610, 2622, 839, 1191, 1339, 2110, 468, 1927, 3081, 1188, 3175, 3008, 3137, 110, 1673, 1383, 1128, 741, 1391, 2673, 1749, 3224, 2786, 1702, 1795, 332, 617, 3164, 2879, 327, 795, 722, 390, 1698, 1829, 2700, 2291, 1318, 3205, 120, 681, 1253, 3041, 2663, 2612, 2592, 1442, 3089, 1514, 536, 1639, 2203, 284, 1644, 2754, 319, 1952, 162, 2082, 841, 19, 2766, 1220, 3060, 576, 2254, 325, 1262, 7, 1268, 2402, 1593, 2409, 2037, 3088, 3103, 3200, 2766, 2733, 1649, 2841, 2554, 1051, 1956, 2785, 713, 2736, 2002, 4, 1554, 1650, 2241, 2639, 2448, 2746, 2367, 1581, 1174, 1256, 2697, 2032, 1973, 1665, 1612, 1411, 2908, 207, 2790, 1141, 1098, 2642, 2486, 1078, 807, 2655, 907, 757, 2403, 2626, 1921, 336, 3089, 989, 2667, 1945, 1111, 987, 3288, 3160, 195, 1857, 3191, 1175, 173, 2383, 2550, 31, 3156, 2625, 3139, 996, 1842, 2889, 1698, 2604, 1030, 877, 2036, 1858, 181, 1118, 2537, 1524, 211, 2538, 199, 2046, 731, 1810, 1304, 895, 638, 3133, 2659, 858, 3233, 878, 3154, 123, 2015, 2976, 2132, 796, 2815, 2977, 2808, 94, 527, 2169, 1394, 1961, 542, 3056, 2545, 3050, 1559, 3118, 1764, 1833, 2352, 102, 555, 2182, 3048, 1578, 2032, 702, 2121, 557, 2061, 1971, 1244, 2042, 1563, 998, 2689, 3168, 1140, 1390, 1121, 1382, 3176, 3221, 858, 2681, 2321], [1113, 761, 1888, 193, 1186, 3185, 3008, 425, 2891, 3265, 3151, 3172, 13, 431, 2320, 337, 681, 3018, 341, 403, 102, 805, 2524, 1149, 2671, 1979, 432, 1399, 3283, 2499, 2702, 1727, 3280, 906, 3265, 618, 1375, 395, 87, 349, 279, 1334, 2598, 236, 1288, 182, 2726, 1039, 3203, 1970, 332, 2916, 324, 1543, 1570, 1323, 689, 2009, 2389, 2876, 639, 1534, 1562, 1963, 922, 3184, 3072, 2120, 3248, 1175, 1574, 907, 30, 3316, 468, 68, 1298, 387, 1652, 3297, 1731, 3238, 1903, 1787, 2976, 1770, 2610, 616, 3137, 1151, 2012, 1773, 2705, 2380, 305, 2494, 767, 3296, 2146, 3106, 819, 2086, 504, 234, 670, 3214, 1521, 2359, 656, 10, 292, 1466, 2363, 192, 19, 3241, 771, 1940, 1138, 584, 2155, 2381, 1845, 2928, 1958, 507, 2755, 51, 2231, 2106, 1126, 2814, 493, 1397, 1337, 3182, 2719, 616, 2670, 500, 1875, 925, 2352, 2174, 2389, 790, 1835, 50, 3198, 2037, 389, 2, 2754, 875, 328, 2971, 449, 1179, 1526, 226, 2826, 102, 850, 305, 79, 595, 1385, 1463, 3212, 1269, 2300, 182, 503, 392, 1093, 3, 309, 1807, 2224, 2982, 1127, 3130, 1712, 1745, 3075, 2092, 1121, 24, 656, 250, 2970, 483, 1524, 3110, 2290, 721, 2728, 2269, 3131, 2243, 2481, 338, 2551, 1005, 2052, 2125, 1292, 1651, 2597, 1973, 1238, 829, 207, 1665, 1240, 1320, 463, 508, 2969, 1985, 2531, 631, 2774, 2796, 136, 1857, 559, 324, 2443, 1768, 3012, 2910, 820, 2144, 2865, 709, 2846, 1074, 3217, 69, 3156, 3209, 2753, 2889, 2830, 1987, 2865, 1057, 97, 2705, 443, 2267, 2363, 681, 66, 396], [146, 3049, 2663, 915, 124, 2308, 2884, 2179, 1477, 3165, 357, 250, 1514, 1536, 1597, 579, 2634, 2692, 1513, 1474, 1265, 2792, 873, 1445, 2435, 3097, 1990, 1743, 1266, 675, 2783, 1710, 2884, 2887, 2896, 2465, 1132, 1428, 62, 1083, 1511, 1290, 2095, 1733, 243, 2004, 2795, 247, 3011, 1010, 326, 591, 1372, 2405, 480, 3055, 2009, 515, 1404, 148, 2273, 2445, 1883, 1118, 2557, 3062, 68, 2344, 67, 643, 1470, 2386, 912, 275, 1351, 2153, 2979, 724, 73, 1857, 3088, 1211, 1746, 1337, 3095, 1903, 2869, 1586, 909, 2879, 1443, 801, 1616, 2050, 2974, 3139, 3168, 184, 2092, 1243, 2544, 1468, 704, 1797, 383, 2620, 631, 2891, 2917, 1966, 1117, 1190, 1972, 2258, 1500, 2926, 2846, 2866, 167, 1313, 3157, 2869, 1722, 2364, 751, 1520, 1008, 1328, 1787, 2375, 2651, 2616, 1513, 249, 914, 2071, 391, 3273, 1709, 2181, 2118, 325, 2858, 1234, 1523, 2028, 970, 2769, 1092, 2491, 1635, 3172, 2110, 2318, 2168, 2533, 2462, 2715, 2688, 52, 2751, 631, 1647, 2968, 3175, 1414, 2003, 478, 1836, 1800, 2688, 1556, 345, 1922, 2484, 3188, 2965, 3045, 1164, 767, 1841, 598, 483, 1755, 1365, 635, 719, 811, 2920, 529, 2994, 764, 3120, 1898, 2817, 2901, 2625, 70, 273, 1868, 600, 1049, 2094, 934, 1944, 877, 2797, 1217, 217, 1560, 2173, 528, 3010, 42, 1922, 160, 2657, 273, 2001, 25, 1531, 1453, 1825, 2866, 1572, 2318, 1053, 2440, 1132, 1600, 478, 519, 1455, 260, 2479, 469, 3033, 1947, 3143, 1529, 1960, 328, 2502, 2426, 1812, 1711, 30, 708, 2191, 1187, 1614, 3022, 1492, 1, 3186, 3092], [2681, 3059, 984, 3117, 243, 914, 1137, 2819, 1551, 727, 1466, 2600, 314, 1375, 3302, 60, 115, 3096, 1245, 2710, 2931, 861, 1207, 1796, 2884, 584, 33, 1570, 1910, 2164, 2533, 938, 72, 1816, 1905, 1818, 3164, 2207, 3260, 2539, 2068, 2145, 2040, 2576, 1785, 2125, 712, 1780, 513, 2178, 3197, 1225, 2599, 1694, 1484, 433, 2381, 2900, 2590, 1253, 1450, 2778, 2822, 2698, 2413, 1071, 1769, 2648, 2517, 519, 3200, 1167, 1539, 2873, 1684, 1672, 2299, 707, 3272, 351, 2119, 3252, 1840, 1611, 543, 1792, 1224, 899, 3252, 991, 281, 608, 88, 1032, 1873, 3015, 1151, 1924, 386, 2741, 1220, 631, 309, 531, 1578, 630, 158, 823, 890, 146, 1277, 2543, 2821, 3033, 2479, 1844, 1957, 1955, 333, 1973, 1447, 1797, 1836, 3267, 1589, 2133, 3136, 2388, 1583, 2027, 2308, 3185, 1421, 2113, 1232, 2345, 84, 1181, 1874, 591, 315, 1039, 808, 3216, 1020, 1847, 2085, 312, 2680, 1916, 1518, 3151, 2837, 63, 2173, 2470, 1112, 2581, 3026, 1620, 1319, 2490, 1691, 2385, 1171, 856, 652, 964, 1145, 1478, 463, 819, 3042, 1201, 1380, 1977, 1556, 1023, 554, 1594, 343, 3115, 610, 2719, 3087, 3271, 1322, 2353, 2409, 2825, 1185, 2443, 2987, 803, 67, 803, 2761, 572, 3080, 1361, 3283, 2769, 2358, 206, 28, 2910, 1276, 1986, 2280, 1084, 2290, 856, 1572, 1611, 506, 2860, 1547, 46, 2721, 2800, 869, 2151, 2944, 267, 1061, 612, 3065, 156, 1441, 1241, 1463, 1382, 34, 2291, 1454, 95, 1196, 2427, 2645, 2292, 2511, 1706, 1413, 1442, 1752, 1348, 800, 2945, 2369, 1301, 1213, 1485, 769, 489, 2238, 997]] eHat: [[1188, 957, 1854, 1760, 2017, 88, 868, 2372, 693, 1472, 2585, 1400, 703, 433, 285, 1530, 1630, 2272, 151, 2609, 1180, 2761, 644, 2679, 2660, 335, 601, 2078, 3050, 1130, 2149, 3115, 1708, 1655, 1728, 494, 2085, 1845, 398, 1935, 193, 1201, 2097, 1450, 1750, 2345, 444, 1826, 2013, 1078, 2698, 8, 1490, 588, 130, 2570, 497, 2623, 1411, 2635, 466, 697, 1232, 113, 935, 957, 2798, 518, 2017, 171, 3124, 2448, 2324, 433, 1140, 233, 562, 776, 2263, 2529, 2292, 2029, 122, 2008, 1839, 867, 138, 1193, 1029, 2575, 2162, 1872, 291, 1241, 433, 1926, 1072, 2199, 2765, 798, 1817, 1096, 3029, 2758, 995, 1389, 2676, 2342, 2735, 2718, 2927, 827, 3324, 262, 1621, 1702, 2966, 2568, 2212, 3290, 1192, 1794, 1833, 2804, 1974, 1438, 537, 854, 2601, 3328, 2472, 65, 3102, 1983, 1985, 1727, 2215, 3125, 1182, 1622, 1919, 781, 571, 2067, 1131, 208, 1586, 3043, 464, 614, 3057, 3259, 432, 1740, 1201, 2758, 3090, 1868, 9, 2816, 335, 1950, 1187, 107, 955, 1508, 1527, 567, 962, 810, 644, 376, 789, 2117, 146, 2175, 1674, 879, 2940, 3181, 1699, 290, 1965, 197, 1920, 287, 3289, 3003, 165, 1990, 3272, 2143, 724, 1268, 1132, 131, 473, 1610, 2858, 702, 2468, 351, 1270, 335, 2578, 251, 2873, 156, 566, 2502, 2806, 764, 2318, 2692, 2792, 2681, 563, 1522, 1042, 1447, 577, 627, 1958, 0, 1693, 203, 2669, 2636, 16, 2995, 1292, 107, 1634, 818, 2654, 493, 2990, 793, 2980, 2797, 1474, 1209, 2521, 3217, 1852, 1183, 1452, 915, 276, 952, 373, 2961, 377, 2848, 1334, 1992], [660, 1462, 1225, 231, 1832, 1747, 446, 2909, 2260, 2983, 2541, 3043, 1601, 334, 2664, 576, 2804, 1440, 222, 886, 66, 827, 3269, 932, 622, 525, 2296, 2905, 2910, 1715, 975, 3096, 912, 3042, 816, 499, 3290, 1148, 710, 2164, 2767, 3112, 251, 1747, 359, 1338, 108, 3324, 801, 2445, 221, 156, 576, 3201, 2284, 2898, 2066, 2724, 504, 1961, 1593, 1258, 2258, 1285, 919, 510, 3319, 2749, 2221, 871, 3145, 1993, 2248, 1477, 3079, 2211, 1060, 541, 2461, 486, 2779, 2527, 2636, 3035, 1625, 2428, 1154, 1902, 112, 1179, 1357, 2583, 1665, 650, 3121, 812, 2923, 2451, 1643, 1659, 2761, 2880, 2319, 2781, 600, 1259, 281, 371, 1043, 1112, 746, 1141, 1719, 1515, 3002, 1431, 1716, 2137, 1529, 2076, 3236, 2321, 2396, 2645, 3058, 590, 2011, 2822, 3227, 1063, 1030, 423, 2421, 2647, 1887, 1873, 661, 3080, 3053, 856, 1540, 112, 1608, 151, 1822, 2253, 2260, 2572, 13, 888, 2506, 1945, 651, 360, 1111, 1906, 1704, 2273, 2852, 2268, 2021, 1101, 2451, 11, 1018, 2909, 1157, 1102, 2921, 1325, 2566, 2084, 934, 1191, 2414, 1459, 700, 447, 1178, 843, 2590, 836, 1371, 2535, 2327, 247, 286, 3135, 3043, 3282, 3287, 749, 1565, 922, 522, 2734, 2843, 1879, 1602, 1287, 3306, 3003, 1355, 2699, 2926, 461, 3195, 363, 730, 1433, 2374, 165, 917, 2990, 1976, 847, 2761, 2088, 923, 776, 305, 311, 1511, 2786, 2987, 3298, 687, 626, 344, 130, 2444, 2642, 2218, 1765, 2093, 3202, 2462, 3218, 1164, 3204, 1215, 2887, 3254, 622, 2544, 2340, 2047, 1413, 1246, 1099, 3313, 2317, 601, 2352, 411, 2615], [153, 1005, 2013, 532, 1130, 2665, 1355, 739, 3165, 2693, 371, 3127, 1007, 1010, 2105, 2202, 956, 1878, 1528, 2279, 221, 2621, 153, 398, 1973, 1308, 1451, 80, 3200, 589, 1017, 2428, 737, 3132, 2638, 487, 1023, 1676, 3103, 2390, 655, 2497, 1654, 2329, 1154, 505, 1204, 1810, 1805, 3262, 785, 353, 994, 658, 2437, 1148, 2197, 3229, 70, 1811, 1271, 162, 2431, 2246, 690, 2678, 1875, 2044, 264, 985, 1210, 2388, 308, 2081, 1676, 2471, 805, 2364, 728, 526, 1248, 3246, 623, 2912, 355, 391, 631, 1596, 542, 1146, 1476, 565, 2831, 1362, 2943, 2944, 2544, 390, 2626, 1996, 1103, 3135, 628, 1411, 2217, 1858, 1445, 2566, 1438, 2031, 2535, 220, 596, 1747, 1331, 2503, 86, 779, 3149, 2835, 2958, 2333, 1812, 604, 7, 472, 2046, 1230, 3019, 2780, 1362, 2592, 918, 1585, 1458, 2473, 3249, 2330, 298, 2364, 2580, 699, 3088, 208, 1969, 2024, 85, 2280, 361, 251, 909, 3156, 196, 3037, 853, 2215, 1397, 1255, 2016, 2247, 163, 3180, 1817, 694, 3254, 2878, 2937, 3280, 1957, 2267, 1003, 2286, 3020, 2037, 2688, 1570, 2071, 352, 2374, 3295, 1935, 2634, 2133, 1590, 2202, 2574, 3140, 2541, 1782, 683, 1009, 1293, 2297, 3325, 2875, 2390, 1811, 2168, 2221, 1348, 1140, 1525, 1503, 1550, 492, 508, 227, 1523, 432, 2674, 896, 1324, 357, 2279, 2312, 3028, 907, 892, 3222, 404, 1767, 105, 2378, 109, 2900, 3090, 1661, 964, 3320, 341, 1636, 724, 2551, 2540, 2273, 1818, 326, 3148, 488, 1760, 706, 221, 3306, 453, 1264, 877, 2571, 3193, 716, 290, 3106, 1728, 2563, 892, 920, 2144], [688, 1592, 214, 3271, 2431, 1606, 831, 1479, 388, 3003, 2320, 1682, 1456, 3211, 2513, 2272, 1060, 1871, 969, 1896, 648, 3000, 95, 3075, 3277, 386, 363, 470, 294, 1239, 371, 1109, 2835, 138, 2534, 540, 2522, 1460, 3243, 2434, 772, 3161, 3184, 69, 2491, 1174, 344, 973, 2366, 1649, 2468, 1888, 2030, 940, 3055, 712, 1197, 103, 939, 1873, 2083, 1011, 3315, 2546, 2746, 3025, 3218, 279, 1662, 2881, 979, 1158, 2828, 846, 1158, 2539, 1638, 2212, 560, 117, 2418, 2844, 2013, 1115, 970, 1551, 1891, 1294, 332, 1761, 563, 3145, 738, 1892, 3232, 648, 2870, 8, 809, 1136, 2962, 2893, 2419, 3060, 1695, 795, 348, 2859, 2331, 2900, 1581, 2299, 826, 993, 1165, 61, 2560, 3189, 1196, 3274, 690, 1564, 207, 3256, 2970, 1760, 1721, 3136, 1601, 2694, 706, 2503, 2281, 1899, 2084, 1341, 949, 2015, 1584, 2203, 1352, 1384, 1812, 417, 1662, 2599, 2747, 1867, 2197, 903, 3188, 2060, 1078, 601, 1630, 3177, 259, 1388, 1220, 1330, 175, 866, 1614, 902, 1314, 969, 1663, 1014, 1733, 2308, 1780, 3041, 336, 3067, 935, 2283, 2630, 2566, 754, 378, 2058, 1559, 450, 475, 666, 1407, 255, 1817, 2301, 2155, 1624, 59, 2518, 2096, 454, 1, 1817, 1957, 1852, 602, 1822, 1713, 441, 3058, 1699, 761, 338, 3151, 1758, 1360, 823, 2014, 967, 2460, 2305, 2457, 581, 3114, 155, 3225, 337, 2637, 866, 2055, 496, 2471, 2985, 2190, 2676, 2213, 2936, 2675, 296, 736, 1084, 2315, 419, 2485, 165, 1288, 811, 296, 2261, 1224, 1333, 212, 132, 987, 3258, 2750, 2510, 1364, 337, 712, 2877, 766]] aHat * sHat: [[2509, 65, 2803, 1938, 2517, 130, 780, 1456, 1710, 2897, 2632, 206, 2222, 1377, 281, 188, 1646, 1437, 1397, 693, 2361, 432, 433, 1853, 2559, 3145, 1827, 1581, 2872, 2857, 1481, 771, 79, 900, 1054, 654, 2518, 2823, 2717, 121, 1805, 842, 2412, 2876, 1846, 2327, 2737, 1696, 3282, 938, 2467, 2146, 3162, 2040, 1422, 3259, 1492, 813, 2104, 788, 74, 1714, 589, 522, 356, 1978, 2852, 1744, 1355, 1629, 1549, 2462, 109, 641, 1787, 1186, 3008, 234, 2719, 1125, 2418, 2371, 989, 2567, 2821, 2765, 844, 3211, 2329, 17, 1930, 2225, 2726, 1266, 2860, 185, 397, 1023, 1960, 3303, 3081, 1488, 1182, 12, 3135, 2583, 2960, 1142, 2103, 2273, 427, 2172, 437, 2889, 1326, 1249, 1197, 415, 451, 3116, 204, 2203, 1763, 977, 1392, 178, 1879, 3296, 1653, 2351, 337, 715, 876, 614, 607, 3011, 3041, 2978, 290, 1405, 1653, 3127, 2479, 400, 280, 2364, 3208, 1354, 653, 2828, 540, 2798, 1322, 1238, 1810, 201, 2243, 1455, 997, 2849, 2792, 3048, 2976, 1196, 2340, 90, 1385, 2434, 142, 785, 2909, 1964, 2673, 1363, 1343, 783, 1684, 1128, 2457, 975, 1066, 3219, 936, 2524, 1171, 879, 1458, 375, 1547, 30, 797, 2146, 2668, 2875, 2908, 469, 1581, 537, 2233, 1574, 2653, 2993, 1297, 403, 182, 1458, 707, 1574, 2908, 1924, 61, 2511, 2979, 2427, 2139, 2892, 2317, 12, 1863, 1029, 2977, 232, 1856, 1298, 2159, 164, 308, 622, 777, 1278, 110, 2075, 53, 602, 2071, 3153, 1188, 2864, 2300, 3069, 1683, 2106, 1767, 2426, 720, 606, 85, 2599, 1121, 1081, 479, 3093, 501, 23, 2232, 2098], [2537, 897, 572, 210, 2232, 2325, 1387, 775, 710, 90, 525, 2028, 337, 17, 1446, 194, 403, 55, 999, 1580, 108, 3272, 1122, 2223, 87, 254, 1628, 685, 971, 2207, 115, 2376, 1808, 172, 3130, 383, 839, 3051, 651, 699, 2169, 1797, 2488, 1839, 2796, 1342, 2781, 326, 1814, 2750, 2071, 566, 1234, 1369, 1969, 1672, 2529, 2526, 611, 1758, 1293, 1086, 2580, 2686, 305, 1446, 1062, 1134, 1101, 2335, 2374, 825, 1170, 3067, 2589, 2963, 767, 226, 1698, 380, 541, 1945, 580, 3275, 1292, 505, 3006, 2175, 936, 1762, 58, 601, 1281, 2612, 787, 1122, 1010, 709, 2885, 1159, 3097, 2951, 1261, 1152, 796, 684, 641, 2114, 254, 2467, 3172, 1802, 2372, 2000, 1055, 449, 865, 2084, 790, 1004, 1841, 1164, 2471, 2075, 1931, 2928, 1326, 3153, 2241, 341, 3111, 1309, 175, 463, 2584, 2710, 2793, 927, 184, 2496, 1891, 274, 716, 306, 3326, 2561, 2985, 552, 1595, 1123, 1198, 2206, 2812, 1713, 1517, 204, 2392, 1559, 631, 1178, 1672, 2249, 1234, 2274, 2316, 1921, 19, 2042, 2009, 1239, 118, 1240, 227, 1241, 383, 2271, 3063, 907, 2712, 1676, 1188, 3196, 2340, 1044, 1673, 1810, 68, 1311, 3177, 2595, 1426, 1713, 883, 2585, 217, 2826, 2840, 2834, 2642, 1455, 1319, 630, 2769, 2696, 306, 2651, 1349, 638, 699, 1428, 2518, 2567, 3112, 2181, 892, 2345, 611, 277, 540, 787, 1865, 1735, 1401, 176, 2015, 2845, 2325, 1442, 3066, 1760, 3096, 2585, 1847, 3098, 1899, 3013, 3013, 511, 2298, 882, 2664, 2613, 1005, 1131, 107, 973, 1277, 3178, 784, 1612, 2523, 3070, 2450, 2506, 1091, 2049], [1286, 2474, 3112, 1474, 1364, 73, 1088, 2985, 2631, 1792, 2704, 2856, 2219, 3121, 2733, 1009, 1919, 170, 1978, 1755, 2298, 1873, 1170, 2086, 2487, 3196, 2676, 124, 1996, 1409, 2867, 2090, 278, 2976, 978, 352, 2335, 1011, 1617, 2413, 154, 703, 524, 1112, 1297, 1854, 86, 1832, 1767, 364, 93, 326, 2378, 1721, 2619, 1918, 1910, 792, 1415, 195, 1720, 442, 585, 1430, 814, 2148, 950, 3150, 2551, 248, 300, 113, 2210, 3239, 2733, 3110, 236, 871, 1108, 1819, 2916, 434, 443, 95, 1665, 2278, 1861, 564, 259, 1193, 2377, 392, 2864, 765, 269, 2061, 2390, 759, 2932, 3208, 3081, 1817, 671, 730, 2232, 2775, 1005, 1386, 947, 326, 2632, 457, 564, 2842, 306, 2720, 1462, 2998, 26, 76, 818, 998, 2178, 3059, 1235, 863, 2138, 464, 2508, 305, 2325, 1172, 806, 2167, 2414, 2181, 707, 1492, 3202, 986, 1522, 2587, 2389, 2422, 2362, 3025, 1048, 750, 1474, 1506, 561, 2256, 785, 1995, 1803, 2479, 1684, 2729, 920, 2467, 1045, 2941, 1666, 352, 1450, 2104, 2003, 79, 1202, 3052, 1283, 1368, 368, 2651, 0, 1444, 2717, 2244, 528, 3182, 2246, 1781, 1182, 374, 2629, 2137, 748, 0, 700, 1162, 3211, 2030, 157, 3032, 2736, 1949, 2206, 2784, 954, 1091, 2453, 2601, 1851, 1054, 1473, 611, 2299, 355, 1348, 1364, 598, 69, 1358, 2547, 2852, 1053, 1653, 1780, 1099, 998, 3067, 889, 357, 1937, 395, 2587, 381, 628, 534, 296, 2825, 26, 395, 2469, 1008, 2262, 1025, 1, 944, 3035, 1657, 2901, 1125, 1857, 3150, 1075, 935, 1172, 600, 2007, 591, 657, 1267, 113, 2607, 2904], [1492, 3021, 868, 2511, 2212, 612, 741, 516, 527, 956, 2887, 329, 2931, 235, 1121, 2871, 2234, 2848, 168, 2285, 583, 273, 2453, 2787, 308, 3180, 1259, 83, 2452, 854, 921, 2976, 1043, 2634, 2827, 1084, 1777, 1333, 2958, 941, 89, 630, 2704, 1794, 153, 755, 1741, 3150, 2464, 2928, 3044, 2668, 2674, 198, 2321, 2172, 962, 3121, 500, 2609, 2247, 1648, 2306, 2828, 3169, 740, 879, 2263, 3205, 685, 1918, 392, 304, 2692, 1530, 748, 581, 764, 1906, 2326, 2808, 1968, 2502, 1857, 1177, 1351, 1461, 1738, 1490, 3036, 2270, 2728, 708, 2819, 3304, 878, 2835, 1999, 2785, 3089, 1638, 3225, 1726, 1250, 919, 303, 93, 2273, 271, 2643, 2346, 2748, 694, 2756, 682, 2701, 1563, 1935, 202, 549, 2136, 1819, 305, 3269, 1527, 2651, 2246, 2459, 829, 2887, 2175, 1715, 493, 527, 3041, 3061, 2731, 1034, 1452, 1624, 771, 2293, 1911, 2420, 2167, 2033, 2741, 2052, 915, 1296, 2552, 1709, 2836, 758, 127, 1003, 2200, 1820, 1632, 3021, 1971, 2499, 1329, 1877, 2603, 1366, 1177, 278, 38, 1624, 1455, 1623, 298, 822, 2121, 2852, 2112, 629, 2811, 1500, 870, 774, 963, 1986, 2408, 2541, 967, 780, 899, 1386, 316, 2299, 1539, 1563, 2748, 1273, 492, 1402, 1575, 220, 1279, 3036, 1283, 3077, 153, 657, 3075, 710, 1677, 2587, 1796, 3141, 1175, 1109, 878, 2337, 2597, 2736, 775, 1473, 2503, 1901, 2868, 2165, 225, 2380, 2941, 996, 804, 2727, 244, 1976, 2542, 692, 1334, 31, 450, 1993, 3159, 2896, 2919, 1237, 41, 2559, 3026, 697, 2888, 563, 1026, 841, 2282, 2774, 312, 2848, 1008, 1401]] tHat = aHat * sHat + eHat: [[368, 1022, 1328, 369, 1205, 218, 1648, 499, 2403, 1040, 1888, 1606, 2925, 1810, 566, 1718, 3276, 380, 1548, 3302, 212, 3193, 1077, 1203, 1890, 151, 2428, 330, 2593, 658, 301, 557, 1787, 2555, 2782, 1148, 1274, 1339, 3115, 2056, 1998, 2043, 1180, 997, 267, 1343, 3181, 193, 1966, 2016, 1836, 2154, 1323, 2628, 1552, 2500, 1989, 107, 186, 94, 540, 2411, 1821, 635, 1291, 2935, 2321, 2262, 43, 1800, 1344, 1581, 2433, 1074, 2927, 1419, 241, 1010, 1653, 325, 1381, 1071, 1111, 1246, 1331, 303, 982, 1075, 29, 2592, 763, 768, 3017, 2507, 3293, 2111, 1469, 3222, 1396, 772, 1569, 2584, 882, 2770, 801, 643, 2307, 155, 1509, 1662, 25, 2999, 432, 3151, 2947, 2951, 834, 2983, 2663, 3077, 1396, 668, 267, 452, 37, 1616, 2416, 821, 925, 2350, 2809, 780, 649, 2597, 2592, 1409, 1927, 2774, 1472, 3027, 243, 579, 3050, 2467, 1411, 2572, 1465, 1068, 1117, 113, 268, 2728, 1754, 2978, 3011, 2959, 2004, 3323, 1006, 2336, 3127, 1669, 834, 1303, 3295, 1598, 2912, 3001, 1104, 1595, 224, 2340, 133, 151, 1489, 2958, 29, 2007, 2068, 827, 2765, 180, 2901, 2721, 3091, 1166, 1418, 49, 1712, 2020, 740, 960, 63, 814, 711, 600, 2054, 2147, 1762, 2276, 1792, 15, 2567, 738, 2760, 1709, 251, 1730, 145, 1097, 2867, 3275, 1968, 1790, 1602, 2244, 2880, 1534, 2905, 2476, 225, 859, 485, 1298, 523, 367, 2977, 3258, 793, 944, 1402, 2182, 1687, 1420, 1396, 317, 849, 328, 1951, 2537, 3157, 3315, 959, 2314, 2572, 1789, 1537, 185, 1397, 2033, 852, 2725, 878, 2871, 237, 761], [3197, 2359, 1797, 441, 735, 743, 1833, 355, 2970, 3073, 3066, 1742, 1938, 351, 781, 770, 3207, 1495, 1221, 2466, 174, 770, 1062, 3155, 709, 779, 595, 261, 552, 593, 1090, 2143, 2720, 3214, 617, 882, 800, 870, 1361, 2863, 1607, 1580, 2739, 257, 3155, 2680, 2889, 321, 2615, 1866, 2292, 722, 1810, 1241, 924, 1241, 1266, 1921, 1115, 390, 2886, 2344, 1509, 642, 1224, 1956, 1052, 554, 3322, 3206, 2190, 2818, 89, 1215, 2339, 1845, 1827, 767, 830, 866, 3320, 1143, 3216, 2981, 2917, 2933, 831, 748, 1048, 2941, 1415, 3184, 2946, 3262, 579, 1934, 604, 3160, 1199, 2818, 2529, 2502, 251, 604, 1396, 1943, 922, 2485, 1297, 250, 589, 2943, 762, 186, 728, 1880, 2581, 892, 2319, 3080, 1748, 156, 1538, 1391, 1660, 189, 8, 2646, 2139, 1404, 812, 1732, 2596, 3110, 1142, 1254, 125, 678, 3237, 23, 102, 386, 2324, 457, 1819, 1485, 1916, 3124, 1608, 2011, 375, 822, 134, 2073, 2628, 2110, 767, 503, 154, 117, 364, 21, 356, 2285, 5, 1501, 1176, 3144, 1601, 2564, 2684, 3324, 1161, 2432, 2797, 401, 434, 1354, 561, 2519, 449, 703, 382, 250, 671, 2057, 354, 1117, 2891, 2548, 1384, 2462, 2448, 178, 739, 2231, 2354, 1384, 915, 2742, 1296, 304, 795, 2066, 3232, 3112, 1215, 1001, 1429, 2861, 1563, 2732, 700, 1842, 2868, 3192, 43, 2365, 1463, 1563, 2170, 2046, 2912, 2962, 1673, 2814, 3012, 2068, 81, 1890, 2211, 1898, 736, 1534, 663, 2886, 2146, 400, 133, 757, 550, 2171, 930, 1753, 2651, 3313, 3324, 1262, 2030, 2711, 2507, 2058, 3051, 1529, 1502, 1335], [1439, 150, 1796, 2006, 2494, 2738, 2443, 395, 2467, 1156, 3075, 2654, 3226, 802, 1509, 3211, 2875, 2048, 177, 705, 2519, 1165, 1323, 2484, 1131, 1175, 798, 204, 1867, 1998, 555, 1189, 1015, 2779, 287, 839, 29, 2687, 1391, 1474, 809, 3200, 2178, 112, 2451, 2359, 1290, 313, 243, 297, 878, 679, 43, 2379, 1727, 3066, 778, 692, 1485, 2006, 2991, 604, 3016, 347, 1504, 1497, 2825, 1865, 2815, 1233, 1510, 2501, 2518, 1991, 1080, 2252, 1041, 3235, 1836, 2345, 835, 351, 1066, 3007, 2020, 2669, 2492, 2160, 801, 2339, 524, 957, 2366, 2127, 3212, 1676, 1605, 1149, 2229, 1875, 855, 1623, 1299, 2141, 1120, 1304, 2450, 623, 2385, 2357, 1838, 677, 1160, 1260, 1637, 1894, 1548, 448, 3175, 2911, 447, 2, 661, 334, 1242, 1335, 855, 1694, 2198, 3085, 358, 435, 1724, 423, 543, 1325, 627, 493, 171, 21, 773, 3286, 2148, 2630, 1002, 1720, 1133, 3030, 1835, 1757, 1470, 2083, 981, 1703, 2656, 1365, 3081, 655, 2936, 1385, 1208, 2792, 154, 1046, 1375, 1653, 1611, 30, 3159, 1990, 2286, 325, 59, 1359, 2688, 3014, 1459, 2596, 2902, 3148, 852, 1086, 3315, 1964, 1502, 1382, 559, 2541, 2482, 1845, 891, 3323, 2454, 3028, 2282, 1010, 688, 1623, 3175, 2439, 264, 797, 25, 2604, 1965, 1119, 2526, 1878, 1780, 709, 1494, 1393, 1715, 1497, 1835, 752, 2560, 2672, 992, 1402, 1505, 994, 2735, 2046, 3295, 2348, 2042, 1592, 525, 637, 1132, 750, 2946, 1680, 3281, 751, 1351, 3149, 1432, 1466, 2363, 3122, 1102, 2310, 1085, 1952, 177, 1036, 1316, 2297, 368, 2385, 501, 1005, 198, 1719], [2180, 1284, 1082, 2453, 1314, 2218, 1572, 1995, 915, 630, 1878, 2011, 1058, 117, 305, 1814, 3294, 1390, 1137, 852, 1231, 3273, 2548, 2533, 256, 237, 1622, 553, 2746, 2093, 1292, 756, 549, 2772, 2032, 1624, 970, 2793, 2872, 46, 861, 462, 2559, 1863, 2644, 1929, 2085, 794, 1501, 1248, 2183, 1227, 1375, 1138, 2047, 2884, 2159, 3224, 1439, 1153, 1001, 2659, 2292, 2045, 2586, 436, 768, 2542, 1538, 237, 2897, 1550, 3132, 209, 2688, 3287, 2219, 2976, 2466, 2443, 1897, 1483, 1186, 2972, 2147, 2902, 23, 3032, 1822, 1468, 2833, 2544, 1446, 1382, 3207, 1526, 2376, 2007, 265, 896, 1271, 2789, 816, 981, 2614, 1098, 441, 1803, 2602, 2214, 598, 1718, 1520, 420, 1847, 2762, 794, 1795, 1398, 494, 2826, 54, 512, 3196, 1168, 1082, 638, 2266, 2430, 2252, 2881, 889, 2774, 2426, 1796, 1073, 351, 3049, 3036, 498, 2123, 348, 394, 2837, 500, 1303, 2159, 590, 3112, 2199, 2411, 440, 585, 1359, 1757, 851, 2459, 3208, 2852, 1022, 2146, 36, 2943, 2779, 588, 2335, 2840, 1292, 1771, 603, 3235, 1335, 634, 560, 3056, 1806, 1413, 3195, 236, 1878, 2928, 2333, 1413, 2461, 3074, 619, 1222, 2597, 3200, 212, 1940, 2358, 728, 330, 3202, 1274, 2309, 30, 98, 822, 3101, 1420, 1724, 2806, 1852, 1418, 84, 532, 106, 618, 2619, 1826, 2142, 240, 3183, 1465, 3178, 2521, 930, 1369, 2840, 1209, 405, 891, 721, 1522, 2597, 3186, 151, 1611, 3180, 1322, 2838, 1428, 2418, 2346, 869, 1149, 3324, 855, 401, 1533, 2302, 454, 1030, 909, 3020, 1550, 955, 262, 1463, 809, 649, 231, 556, 2167]] ek: 70E13F301517B5A40D70361F6309416067646D2B7136626BCCCC170C66CED490C735344B6277097CA914212A292DD122FBB69FDECA47FAB4532B8C80CEB77F9C543E0BF1536D1C0CAE077E2CA7862B45A410469CC5B706BAE0051CB2961DB7270B75B711698D2B807040D5628129436FBB58F1203F75561465F54257E44D33F512D633431D00A2FB0230C9BB9CDDFC83BD65C97445302186A17223AD21332803B909E5E5671970BBB0F1C4837BB84273BA675AC074C5290B411C2500657059339DE392F9CA308952A2201A588767ADC035BDF33024EA3B9A83C5A0B9C5425D14070C81AADA26BAC3FBB8D4B7CFEE0392375C68427351DFEC63609BBB50B463E04092857009D1E5B81D707D14B833CD4A0B551BAA13EC488A1503B0467EE4023C3FE032C78225063886E2468E00F700072A2EC8DA6AFB206C91904433BBCCB0E76F42468C40EB5F59CB9AE1B035E521510BF216A1ABCB19033B7A658897C65874D5135183149F979E553CCFBFA3900CDA6F01960B75157F5453AA6E73B3ED902F7D7C9305971BDF722E2937169A1BC0FAEB6C92F7150D2330877C5DC5249AAE20302634C5C5B23053521028122542F485A0EAC869223720633651F5B247C662B31A10538CA7491B1437AA74F4282D12974D9C934DF214785B6418468B92E52528C8447A1CA422FA6CC88E28B059F04B23597323F72F3E2336F87C47905CBA655BB73FC32E18D4B78705C782EBCB43E2785C82C5AF24B0E1699CFBC0257475799A539B11A50F4DF2B7FAA20BD8827515CA370F89C0D4C60902F6567CD60B0860A55BC8572C436C246AC276644E7D602AA57C0166201814991C1BD75C7C47C348B67D77613386908144EA83FF721F9A50076C510164D18E05D05D9884C44146A07CCACF890498ED1A19B2A15431729DC1F12B7EA10F9F928062D1454B4B9F68E59990290BE3728B3289569363AB1005131B2381A08CC2BF943E95D5B21BC6AABC2273348BC72BD093B7B5617AE87F602BB989E6AFC44B81512076A3A876E0E25F9762B462081985502F26B287A2936D5B1ACFFCEC4EEE77A9CBA980EB9B5FDE75539F650904677DBE29AB8BB918A3494803ECA59A2C32E5B5C83B0B80B1102CD7D9482B459B6B74491EC30C4BE77C2B524AF7B3AD1F71341DF0A76F255C2903C88208079379930A9513F390126E732A2BB094BFA6BF0A432BCD657DAFCB25C8BB15E0955D099B74FF1A4DE6559CD6797C38C48C1134CA2C979243F3152AF4BBE4D7A6BC09872133920CD23B3EF9848CCC6845D647B5387557736513D58560845192F9265159932E572A88C44E6566760C061C67FCB5BF210095E214DA745357E36996D8C066311BBC761A1FD25273D21EAB50010563CD6468A4EA836B6D64BD2BD76DBE3582D5736A605A5509FC28789B56B884AE9A60415F55674BE601576C7CEE58143BF054806ABCB345A256CBC454E343F3CC7ADE65562FD29EB259737BB3CF9649BDEA283FB07265677C9808D13119C0A2ADF745DE6975F4562CD61557B3965D2B072F000AA7E0A357E1253EAFEA7FDFCC92FA87630DD2276CE42E820B69D1FC2E47D5C498A55B3B29C34E64903D047AB1C04024958F701195F5D13EC6706B8448503A549922A58A24B67C93632756B77D225407316171DEEC56714435CF94CCF4599E00D10E569622BADA820C452F2542ADF08765CA93AE38EB025DE31CFF7974549A7825A831DD054E87B84C5F2547FF47B46F88C99F1548E933A6F4D87F1A4A1B00E39E02D60E51EB603C1C0D807ACDAB08BAA2B99869B75CA2C4B96368B51780BD1EC75B110B9FA66556876C5F48797D090138F754AE30533D36AA44B9B1702A6A8A56626BF0451A37A7AC1A337076E51E0A6B0300C2C790A4437EA28D7EC98C419B37D6AA970417435F91BEDC2B1F4BC8158A51B1F471516FE824287C896B891B49F254DD36359B89C824EB3F6248027FBBAD4CF29118CB50EBB625A37C537A0223F0EB7085B5C7EC607570DB9185D59902BC26C654A2804C0D946793D8A21482AC4F05E9016260331DCC58BC66AF3CA7585440216AA0263B2A725E080F6F9C5B6A9C9DA29355189B4B95B137D1225F252AC797B0646CAC52164B5972A99265D347FC7C3591D15FFE681C06D438CCEB60BB6310B7953289720E2C728730052337ACA7C8521AB44F1E2A049B83E0774C96CD8C876FA675D0923977271B dk: 8AD0B5F09A25AA935DD9DA34AB82CA75A12D66E99CF48BCA45B9B2DB441BC2971BDC9922B5F8BC3C0678546759073CB88E26BAD1B1B3A4646A6529C632EAA347734A3BE583D47178094C4A670CBC41EC0689765668542E6F15A7D586C9E26A6A03C71469C2C53F7B141B232D86216A25C7A8F36852858C07A9524EE17BA6340AA2A215C1EA852167B6891CC166C2FA13A0270A22983413E0ACC444BF40E28C45E14E07404F62996369597F10FCC180ECACAD1A6719AB9F1B447AE19A2CB02A7D04206172168C4F0A99BAFA932D6649E894A8F0577B81C66483C5B5CF60AE75A444526A9B3674325FBA38F53296421A785011C1DDB3A6997745DB83CD583C0C4177C797D40A4F699F1F40C5413AC4E42373492B6A2C6A406D437F42570B5E949EF4350DEA790CFEB72D1287517FE3273D3CA65A13CA6E23C57BF07DA04B851CF3AFA18BAF5EF020792857A9E721F01B9FEA7B612E4C6E29079366B0228688BE2A067FBE92842DD280B3C74DFAB761E613A8604C476E15466685C695AC35791A9159942F60170CA214C7C09B1A4B1BCC4F4CC60DF01A101915A9A2BC553119665032DCD9476FBA7BB07157D33C9C8EFA6BD0AC38C1AC265FB51857D01517615326CA0E08650BA6FA40832C7B4C41B644716022B652B1927D55C9B37FE25F1AB67A9A03C7008C84B07C4926B6381E40CFD441041235187416CEC366CA6FB76FA0AB6E328A2641FC47DCD76E91CA9431E19BFF02CE6228C2336382F8A10E9EE2C8F1759390A20024A15B3B090C1390CA0343797284246BD8943507B7A6B71FC33A03B7A88366E4AFED515739E5C69F8A266E4A1F53D73930E9875569312B27037E5C7F852100C2BA3648B1B9C1B149F6250E0A6B065213134F302569755B8C5C4FFC680BF7811845340035F170B068BA67A4C3B0166D03CC8261840190A20F9A3B1EF465C2F2182DA8DA8D3B3C8CB12915F7D93E04D8840C3567255A7BD6D433CF1068D88452CFC11F991B7CE37927D6CAAE8810742F42148B896EC4EBB5340386315B2C1E2B43915C04549CC8C19AB40E3B7C311B426110A9BBB18D3B992A42C0189290BE673A397C4090443B88C5D5C565A10FEA05603D36244A4AA8E9255CF184AE69535A8399C1C6F76CF2342ADFEA6A447BB4501B9A6C44593EB043E7A5502F586CF3407DEB7A0FC32B3F46F1245C5596E0F1BED937207C4509E1D8985BE745FD69BF448092433028BE2595903311479586A34B2D49107410BC4BD2965317FC76352B638DF3B3A315325026809E3BC4608C0B2CB84DF0C95BC052707FC1A377B2B465EB7A5D644AB4278DDCE5B61E2BB3A71052555CB3BAC693EF025FF00353FB76945B8AA3E9950F9273818791CCAD56884658142A2B4DF3C57ECA13AD44B49B6346C63EE89078589E9EB9A9804A03BF7A276F86B9676C58D3E71D2C8770804A61592178B449C7955BBE8CF42F316725E3B16D55B527CFB232681B21B2CB2F30AC76015BB5416A0411C1745892412E683A98D736ED1A4CD980617D0821C2AB0282070A611A11D19701FBD55A2127B324E6901D84986C0464DE7120AF4510AF591DD9BB79479C5FA88714C6A99714F76A1E402C8F384A4EE6BCD41500724CC1793ABFD8D3C2F320397134B00F762DBA85A23AF155E6CC037380C1DD64A973DB35B74470448B24212062764787E5A93A48807171A7715CFC89BCBC9E141886F807A1F9D684C8426F0122887D9C4C27EA69CC151B4D49B51E5A4EAAA5AD06ABA86DF942E986A5D5792080FC480396B3948668FB382CC8FC154748CB30B7641F0270C83438B4FC3D1901265880405177BC7F44788251ABC474273531212A66279E70337A2309FDF49E059BBDAF4973A5377A4D517BA755702C37CC355685404C952FB67E0419C78D1584D0949254D04952F7243BF1402803C9FC737325881378CA77EEF5C415FB037D689A5854A1D24B6527A59B9B16959384358C423C79645CCF3133E21B4B64957B14F63F2AA26357B1C262F2A90F7CCC2A15936999B0A1B498AB3B32433032C9CA23081C55D31CAD36E90C1CE0B5FC247CE8C843F2883524B664FAC1B20BE602A10AAF65738680BB10254426F9CB09A1954DB7655622308FAEF505ACB497554A8FCFA96A85255AD846542013B8415951BDD45C01931EBE583E70E13F301517B5A40D70361F6309416067646D2B7136626BCCCC170C66CED490C735344B6277097CA914212A292DD122FBB69FDECA47FAB4532B8C80CEB77F9C543E0BF1536D1C0CAE077E2CA7862B45A410469CC5B706BAE0051CB2961DB7270B75B711698D2B807040D5628129436FBB58F1203F75561465F54257E44D33F512D633431D00A2FB0230C9BB9CDDFC83BD65C97445302186A17223AD21332803B909E5E5671970BBB0F1C4837BB84273BA675AC074C5290B411C2500657059339DE392F9CA308952A2201A588767ADC035BDF33024EA3B9A83C5A0B9C5425D14070C81AADA26BAC3FBB8D4B7CFEE0392375C68427351DFEC63609BBB50B463E04092857009D1E5B81D707D14B833CD4A0B551BAA13EC488A1503B0467EE4023C3FE032C78225063886E2468E00F700072A2EC8DA6AFB206C91904433BBCCB0E76F42468C40EB5F59CB9AE1B035E521510BF216A1ABCB19033B7A658897C65874D5135183149F979E553CCFBFA3900CDA6F01960B75157F5453AA6E73B3ED902F7D7C9305971BDF722E2937169A1BC0FAEB6C92F7150D2330877C5DC5249AAE20302634C5C5B23053521028122542F485A0EAC869223720633651F5B247C662B31A10538CA7491B1437AA74F4282D12974D9C934DF214785B6418468B92E52528C8447A1CA422FA6CC88E28B059F04B23597323F72F3E2336F87C47905CBA655BB73FC32E18D4B78705C782EBCB43E2785C82C5AF24B0E1699CFBC0257475799A539B11A50F4DF2B7FAA20BD8827515CA370F89C0D4C60902F6567CD60B0860A55BC8572C436C246AC276644E7D602AA57C0166201814991C1BD75C7C47C348B67D77613386908144EA83FF721F9A50076C510164D18E05D05D9884C44146A07CCACF890498ED1A19B2A15431729DC1F12B7EA10F9F928062D1454B4B9F68E59990290BE3728B3289569363AB1005131B2381A08CC2BF943E95D5B21BC6AABC2273348BC72BD093B7B5617AE87F602BB989E6AFC44B81512076A3A876E0E25F9762B462081985502F26B287A2936D5B1ACFFCEC4EEE77A9CBA980EB9B5FDE75539F650904677DBE29AB8BB918A3494803ECA59A2C32E5B5C83B0B80B1102CD7D9482B459B6B74491EC30C4BE77C2B524AF7B3AD1F71341DF0A76F255C2903C88208079379930A9513F390126E732A2BB094BFA6BF0A432BCD657DAFCB25C8BB15E0955D099B74FF1A4DE6559CD6797C38C48C1134CA2C979243F3152AF4BBE4D7A6BC09872133920CD23B3EF9848CCC6845D647B5387557736513D58560845192F9265159932E572A88C44E6566760C061C67FCB5BF210095E214DA745357E36996D8C066311BBC761A1FD25273D21EAB50010563CD6468A4EA836B6D64BD2BD76DBE3582D5736A605A5509FC28789B56B884AE9A60415F55674BE601576C7CEE58143BF054806ABCB345A256CBC454E343F3CC7ADE65562FD29EB259737BB3CF9649BDEA283FB07265677C9808D13119C0A2ADF745DE6975F4562CD61557B3965D2B072F000AA7E0A357E1253EAFEA7FDFCC92FA87630DD2276CE42E820B69D1FC2E47D5C498A55B3B29C34E64903D047AB1C04024958F701195F5D13EC6706B8448503A549922A58A24B67C93632756B77D225407316171DEEC56714435CF94CCF4599E00D10E569622BADA820C452F2542ADF08765CA93AE38EB025DE31CFF7974549A7825A831DD054E87B84C5F2547FF47B46F88C99F1548E933A6F4D87F1A4A1B00E39E02D60E51EB603C1C0D807ACDAB08BAA2B99869B75CA2C4B96368B51780BD1EC75B110B9FA66556876C5F48797D090138F754AE30533D36AA44B9B1702A6A8A56626BF0451A37A7AC1A337076E51E0A6B0300C2C790A4437EA28D7EC98C419B37D6AA970417435F91BEDC2B1F4BC8158A51B1F471516FE824287C896B891B49F254DD36359B89C824EB3F6248027FBBAD4CF29118CB50EBB625A37C537A0223F0EB7085B5C7EC607570DB9185D59902BC26C654A2804C0D946793D8A21482AC4F05E9016260331DCC58BC66AF3CA7585440216AA0263B2A725E080F6F9C5B6A9C9DA29355189B4B95B137D1225F252AC797B0646CAC52164B5972A99265D347FC7C3591D15FFE681C06D438CCEB60BB6310B7953289720E2C728730052337ACA7C8521AB44F1E2A049B83E0774C96CD8C876FA675D0923977271BE6E832F2498CA5A3431F40D3187B1ED965FDD6693B37F6EB408A99977AE496447AF65022E0A472ED6388638EA29D82DA68B4CF9FFDF2B67CD708EA5A370C6A7C fips203-0.2.1/tests/nist_vectors/Key Generation -- ML-KEM-512.txt000064400000000000000000000643351046102023000216600ustar 00000000000000Key Generation -- ML-KEM-512 z: CD119AFDC8559442424A87C13EA101E29FCA11881869077E4092E751BEDCA8BC d: CD119AFDC8559442424A87C13EA101E29FCA11881869077E4092E751BEDCA8BC rho: B9B477C70E6C46586B1CCEBE87BCF6DF03C2B27CB09FA03F63160958383BE636 sigma: AC0901D990F43DD3FBC28234B27082414B64B340950CB71059DC2EE2712BF19C aHat: [[[874, 2151, 1834, 1833, 1123, 1560, 1623, 2685, 2968, 1755, 479, 522, 3279, 3134, 2578, 1373, 1613, 1975, 2734, 2886, 2848, 2425, 3302, 1229, 35, 2238, 1168, 1710, 2456, 109, 2249, 2281, 856, 98, 2411, 1748, 646, 2423, 1182, 501, 2636, 3290, 2232, 2204, 1912, 553, 1609, 2800, 1034, 2472, 1002, 2938, 1255, 1057, 2987, 2203, 1005, 3160, 136, 1693, 2708, 2228, 3141, 2666, 1886, 2059, 3154, 724, 456, 2863, 1913, 2237, 1847, 665, 2204, 1641, 791, 3068, 756, 81, 709, 2728, 2207, 1650, 1620, 2345, 854, 2044, 3255, 1014, 1710, 695, 2732, 1558, 1211, 527, 2351, 684, 1557, 655, 2771, 1658, 1508, 3022, 2189, 2389, 698, 365, 517, 1479, 2069, 211, 2498, 303, 195, 2883, 1279, 2888, 1430, 542, 1408, 2098, 1702, 1521, 165, 1755, 2634, 2979, 517, 878, 2569, 1750, 2099, 3296, 2834, 2898, 1754, 3182, 2974, 1779, 906, 2264, 3227, 523, 2593, 124, 590, 1108, 1741, 1521, 2489, 510, 1081, 1153, 531, 117, 866, 443, 347, 2026, 17, 241, 1803, 2857, 1806, 3317, 2301, 32, 2694, 2336, 1767, 832, 2127, 2642, 447, 231, 1849, 561, 3131, 133, 2619, 1571, 1669, 81, 2340, 2208, 2989, 949, 2962, 48, 2159, 1060, 977, 801, 1283, 564, 2120, 1236, 1824, 2651, 1362, 834, 2749, 1383, 991, 196, 2701, 3234, 1294, 888, 998, 679, 1821, 666, 2277, 2962, 2453, 2188, 807, 2175, 2682, 1058, 2254, 849, 1796, 2731, 568, 858, 2107, 2649, 715, 2217, 2404, 73, 821, 24, 1050, 1367, 356, 2395, 2238, 1378, 1125, 258, 2965, 917, 1166, 2616, 620, 1385, 1126, 1895, 864, 2923, 2356, 671], [3311, 1836, 162, 1739, 606, 1712, 627, 1758, 1002, 3101, 946, 1310, 2995, 1857, 2569, 2796, 1743, 1146, 3210, 168, 94, 1700, 628, 3077, 1949, 1668, 1601, 1698, 835, 814, 2372, 1960, 1896, 1507, 1715, 1590, 1310, 1269, 1591, 2109, 3041, 4, 1484, 779, 341, 1192, 3099, 1440, 931, 2552, 2114, 2837, 1259, 3039, 3312, 1146, 1360, 2275, 1836, 789, 1545, 1665, 2107, 145, 1914, 2633, 1890, 2732, 2083, 75, 2826, 2165, 2518, 1587, 1961, 349, 2697, 1315, 69, 3259, 1570, 447, 587, 2759, 3091, 525, 2125, 2702, 178, 1374, 633, 3177, 2760, 2028, 3214, 3275, 2911, 3019, 3032, 79, 2180, 2971, 974, 941, 3024, 873, 506, 1825, 2951, 3030, 3065, 1523, 30, 2625, 1916, 959, 43, 1866, 3188, 2534, 316, 1647, 2692, 2318, 1881, 1579, 324, 73, 2897, 1170, 673, 1402, 1377, 2819, 2723, 1685, 123, 1814, 2583, 986, 2878, 542, 1762, 1513, 1639, 1309, 3325, 1432, 1284, 2587, 2444, 1861, 2898, 1994, 1878, 2072, 1689, 501, 2896, 102, 2572, 1928, 3125, 1480, 1420, 286, 1988, 2536, 132, 1335, 1795, 420, 1503, 623, 1228, 2807, 2741, 2155, 80, 2800, 2546, 661, 1914, 2439, 1421, 1650, 535, 3059, 982, 1519, 635, 5, 1519, 643, 2693, 2774, 1813, 1940, 3021, 384, 1287, 2782, 114, 2365, 2690, 1973, 289, 356, 123, 1710, 2328, 2540, 2418, 3259, 2268, 1529, 2479, 1824, 483, 260, 786, 89, 1767, 2085, 56, 3052, 3155, 2485, 925, 1483, 2331, 1902, 2798, 2526, 1532, 2792, 694, 3039, 1848, 3173, 1998, 552, 1978, 2634, 2084, 217, 992, 139, 407, 365, 274, 1279, 1682, 782, 2133, 2292]], [[704, 1581, 1782, 3300, 319, 2966, 3229, 425, 636, 465, 2507, 2501, 599, 2768, 2663, 1274, 2799, 1206, 2202, 1994, 312, 1774, 3064, 2777, 582, 1277, 1448, 2237, 1577, 1039, 1440, 2351, 1103, 1239, 1957, 3022, 163, 64, 845, 1905, 94, 2267, 1063, 2277, 2053, 2900, 1759, 2027, 614, 2596, 1196, 633, 1624, 2855, 2133, 434, 459, 579, 213, 573, 804, 1256, 2377, 3263, 646, 1464, 2950, 1846, 2594, 2737, 746, 1866, 2663, 1472, 151, 2479, 2680, 1863, 2361, 2532, 607, 1070, 2194, 275, 514, 242, 2025, 1254, 3147, 2015, 2301, 594, 794, 1753, 2774, 1728, 470, 1067, 916, 2934, 412, 3062, 1254, 2672, 2712, 2972, 1068, 2144, 2791, 3262, 1345, 774, 2646, 1092, 1905, 3148, 228, 517, 1634, 2077, 2564, 1485, 1116, 2445, 2830, 1978, 971, 165, 742, 1118, 1262, 276, 3221, 319, 1708, 1129, 2544, 1548, 2239, 1855, 1386, 1718, 1449, 1424, 1765, 1483, 1748, 361, 1434, 339, 1651, 790, 401, 2347, 1058, 588, 3088, 1579, 326, 1413, 3050, 3161, 3086, 1880, 253, 1307, 1630, 1074, 1664, 2738, 396, 1987, 714, 1243, 651, 261, 173, 741, 2760, 318, 198, 2501, 2361, 1523, 3066, 2218, 36, 354, 1117, 330, 2148, 517, 1221, 3152, 1845, 1099, 1897, 3159, 3008, 79, 542, 1244, 2627, 2347, 2259, 884, 1088, 74, 652, 408, 3248, 2727, 376, 2805, 2253, 1925, 339, 1447, 1973, 120, 2949, 2273, 1850, 1528, 2211, 2211, 2411, 1920, 2173, 2688, 2943, 2864, 2904, 508, 1412, 1454, 687, 541, 2408, 3258, 795, 3013, 1824, 330, 1047, 1375, 469, 41, 3100, 2334, 1321, 1654, 1849, 2078, 909, 374], [206, 3093, 1216, 1950, 1396, 3065, 1119, 3323, 2732, 1581, 70, 2075, 1035, 658, 354, 777, 1357, 650, 2033, 2517, 896, 2303, 3237, 186, 2106, 2128, 596, 3180, 1400, 2980, 495, 2122, 843, 339, 261, 315, 841, 2221, 2768, 2702, 1567, 218, 2327, 1797, 1780, 1334, 490, 2946, 592, 2803, 804, 348, 3227, 1956, 885, 3316, 20, 2295, 2938, 1893, 2630, 1058, 2222, 2449, 1682, 1110, 1651, 2703, 1651, 89, 2228, 2831, 2312, 2897, 999, 2236, 3085, 220, 2765, 3270, 2998, 1891, 2798, 3083, 2197, 1517, 1253, 1666, 1681, 3101, 2775, 1721, 600, 2112, 387, 284, 468, 1330, 1440, 1938, 2252, 2404, 698, 2402, 1883, 2558, 1112, 706, 1007, 2571, 2375, 408, 565, 2839, 1182, 1976, 817, 920, 2775, 580, 437, 3071, 2833, 711, 200, 1973, 1621, 3198, 3065, 128, 1765, 208, 2197, 3151, 2237, 706, 229, 2769, 1253, 3268, 507, 1662, 748, 2455, 1707, 2980, 2562, 1470, 33, 1591, 1455, 2926, 1047, 2430, 50, 217, 430, 727, 3182, 2318, 2416, 1565, 2153, 2128, 3106, 2065, 1435, 1245, 1012, 1932, 339, 1886, 3281, 764, 1224, 2563, 749, 2787, 21, 536, 2171, 1779, 392, 1624, 1824, 45, 1676, 276, 3251, 2499, 330, 2474, 1113, 239, 1247, 1242, 2332, 1877, 2354, 2776, 1236, 3186, 1896, 2231, 1648, 397, 2655, 753, 1402, 3278, 1426, 2605, 426, 2943, 1831, 3009, 1896, 2127, 1823, 1368, 559, 1859, 84, 3240, 599, 882, 1729, 244, 2235, 317, 1229, 2630, 2312, 2969, 2388, 2336, 3299, 3151, 1772, 1745, 2530, 494, 2589, 3316, 2421, 1328, 309, 2978, 569, 470, 604, 1655, 2522, 2450, 2711, 2823]]] s: [[1, 3328, 3327, 1, 1, 1, 3328, 3328, 2, 3328, 0, 2, 0, 1, 3328, 0, 0, 3327, 2, 0, 0, 3, 3327, 3328, 3328, 3327, 3326, 0, 3327, 0, 1, 3328, 0, 0, 0, 2, 0, 0, 0, 0, 3, 1, 0, 1, 1, 3328, 1, 3327, 1, 1, 3328, 3328, 3327, 3328, 0, 3328, 1, 0, 0, 0, 0, 0, 0, 3328, 1, 3327, 3328, 0, 1, 1, 0, 1, 0, 0, 0, 3328, 1, 0, 3327, 2, 3327, 0, 0, 3328, 0, 3328, 0, 1, 1, 3328, 3328, 1, 1, 3328, 2, 1, 0, 0, 1, 0, 3328, 0, 1, 3328, 3328, 1, 3327, 3327, 0, 3328, 3327, 1, 2, 0, 2, 3328, 3328, 0, 3328, 0, 1, 3328, 1, 2, 0, 3328, 0, 3328, 3, 2, 2, 1, 0, 0, 1, 3328, 0, 3328, 3328, 1, 3327, 1, 0, 2, 3327, 2, 0, 0, 0, 0, 0, 3327, 0, 0, 3328, 0, 1, 3328, 0, 3327, 3327, 1, 3328, 0, 0, 0, 0, 3328, 0, 3328, 1, 2, 3328, 0, 0, 3328, 1, 3328, 0, 0, 3326, 3328, 1, 1, 1, 3328, 3328, 3328, 1, 2, 3327, 0, 3328, 3327, 3328, 1, 1, 0, 3327, 3328, 2, 0, 0, 3328, 0, 3, 0, 3327, 0, 1, 0, 1, 0, 3326, 0, 1, 0, 3328, 0, 3328, 3328, 1, 0, 3328, 3326, 0, 3328, 0, 0, 1, 0, 3328, 0, 3328, 0, 3327, 3328, 0, 1, 1, 0, 0, 1, 0, 0, 3328, 0, 1, 1, 0, 0, 2, 1, 2, 2, 3326], [2, 0, 3327, 2, 2, 0, 0, 1, 3328, 2, 3327, 3328, 3328, 1, 0, 3328, 3328, 3328, 0, 3328, 3328, 3327, 0, 3327, 0, 1, 0, 3328, 3327, 0, 3328, 1, 0, 1, 3328, 0, 2, 3326, 0, 1, 2, 3328, 3327, 0, 3328, 0, 0, 3328, 3327, 1, 3328, 2, 0, 0, 3328, 3328, 1, 2, 1, 0, 1, 0, 0, 0, 1, 1, 3328, 3327, 3328, 1, 3328, 3328, 3327, 3327, 1, 2, 0, 3328, 3328, 1, 0, 1, 3328, 3327, 0, 0, 0, 0, 2, 1, 0, 0, 3328, 0, 1, 3327, 0, 0, 0, 0, 1, 3328, 1, 3328, 3328, 3328, 0, 2, 3327, 1, 3328, 0, 0, 3327, 0, 1, 1, 0, 3327, 0, 2, 1, 3328, 1, 3328, 0, 1, 3328, 1, 3328, 0, 0, 3328, 1, 1, 3328, 3328, 0, 2, 3328, 1, 0, 3328, 3328, 0, 0, 3, 3, 1, 3328, 3328, 1, 0, 3327, 0, 0, 3328, 3328, 0, 0, 3328, 1, 3328, 3328, 3327, 3328, 3328, 0, 0, 0, 0, 3328, 3328, 1, 3328, 1, 0, 0, 0, 3328, 3328, 3328, 2, 3327, 0, 3327, 1, 3328, 3328, 3327, 3327, 0, 3326, 0, 3327, 0, 3328, 0, 3328, 0, 1, 3327, 3328, 1, 0, 3328, 3328, 0, 3326, 3327, 0, 0, 1, 1, 0, 1, 3328, 0, 1, 3327, 1, 3327, 3328, 0, 3, 2, 3328, 0, 0, 0, 2, 3328, 1, 1, 0, 1, 3328, 0, 2, 0, 0, 0, 1, 0, 0, 3327, 2, 1, 0, 3328, 0, 2, 3328, 0, 2, 0]] e: [[1, 0, 1, 0, 3328, 1, 1, 0, 1, 3327, 3328, 2, 0, 3326, 1, 1, 3328, 0, 1, 2, 1, 3328, 3328, 3327, 3326, 3327, 3328, 2, 3328, 0, 1, 2, 3326, 2, 3326, 2, 3327, 3327, 1, 2, 3328, 0, 1, 3328, 3328, 0, 0, 0, 0, 0, 1, 1, 3328, 3328, 0, 3328, 0, 1, 3328, 3328, 3327, 1, 0, 0, 1, 1, 0, 3328, 2, 3, 2, 3328, 1, 3327, 3328, 2, 0, 1, 3326, 3328, 3328, 1, 1, 3326, 3328, 1, 1, 0, 0, 3, 1, 0, 3328, 3, 3328, 3, 3328, 3328, 3328, 1, 3327, 3327, 0, 1, 3328, 1, 3327, 1, 3328, 0, 0, 1, 3328, 0, 3327, 3327, 3327, 3328, 1, 3326, 1, 1, 0, 0, 0, 2, 2, 1, 3328, 3328, 0, 0, 0, 0, 1, 3327, 0, 0, 3328, 1, 0, 3327, 2, 3328, 3326, 0, 1, 0, 3328, 3328, 1, 3328, 0, 0, 3328, 2, 3328, 2, 3328, 3328, 2, 3328, 1, 1, 0, 2, 2, 3328, 1, 0, 2, 0, 0, 0, 2, 3328, 3327, 2, 3328, 3328, 0, 2, 0, 3328, 3328, 3327, 0, 1, 0, 3327, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 3328, 1, 0, 0, 3327, 3328, 1, 3328, 1, 0, 0, 1, 3328, 0, 3327, 0, 1, 0, 0, 1, 3328, 2, 1, 1, 3328, 0, 0, 0, 3328, 0, 0, 3328, 3328, 0, 0, 3327, 0, 3327, 1, 1, 3328, 0, 0, 0, 0, 0, 0, 1, 2, 3328, 3, 1, 3327, 3327], [0, 1, 3328, 1, 3327, 3, 0, 1, 0, 2, 0, 3327, 1, 3328, 1, 0, 1, 3327, 2, 0, 0, 0, 0, 0, 1, 1, 3328, 1, 2, 1, 2, 3328, 0, 0, 0, 1, 1, 2, 3328, 0, 3327, 1, 3328, 3, 3328, 0, 3328, 0, 1, 3328, 3328, 0, 2, 0, 3328, 1, 2, 0, 0, 3328, 1, 1, 3328, 1, 0, 1, 1, 1, 0, 0, 0, 3327, 0, 3328, 3327, 0, 0, 3328, 3327, 0, 3328, 1, 0, 0, 1, 0, 0, 3328, 3327, 0, 0, 3328, 1, 0, 1, 1, 3327, 3327, 0, 3328, 3328, 3328, 2, 0, 0, 0, 3328, 3328, 0, 0, 1, 0, 0, 0, 3328, 0, 0, 3327, 1, 3327, 3328, 0, 3328, 0, 0, 3328, 0, 3328, 3328, 1, 1, 1, 0, 1, 3327, 0, 3328, 0, 0, 1, 0, 3328, 3328, 0, 3328, 3327, 3327, 1, 3328, 2, 0, 2, 3328, 2, 0, 0, 3327, 2, 1, 1, 3328, 1, 3327, 2, 3328, 0, 3327, 3328, 3327, 1, 0, 0, 3327, 3328, 3328, 3328, 1, 3327, 3328, 0, 1, 3327, 1, 3328, 0, 3328, 3328, 3328, 0, 3328, 0, 3328, 2, 1, 0, 0, 3328, 3328, 0, 3328, 0, 3327, 1, 3328, 0, 1, 0, 0, 3328, 3328, 3327, 0, 0, 0, 0, 3328, 0, 0, 3, 0, 0, 3327, 0, 3328, 2, 1, 1, 0, 0, 0, 2, 1, 0, 0, 0, 1, 3328, 3328, 1, 1, 0, 2, 0, 3326, 0, 0, 3327, 0, 1, 1, 0, 2, 1, 3327, 3328, 3328]] sHat: [[3127, 1150, 382, 1970, 251, 900, 1356, 232, 337, 2108, 2161, 3029, 956, 2610, 536, 3011, 2341, 444, 305, 1090, 1098, 1341, 823, 2979, 2047, 3232, 2945, 1607, 2738, 1068, 2713, 618, 3141, 2980, 1531, 2915, 427, 398, 1116, 1995, 1612, 429, 1017, 2104, 452, 1208, 2848, 2170, 3156, 1311, 847, 114, 1089, 3121, 2277, 266, 932, 2949, 2645, 2042, 19, 3185, 2891, 16, 2789, 2858, 488, 1847, 3215, 634, 1926, 2572, 2909, 950, 50, 1290, 3024, 559, 1593, 3221, 92, 3114, 1473, 1053, 1876, 1978, 2003, 883, 2724, 9, 357, 1069, 2634, 2978, 765, 2725, 3219, 2436, 772, 2345, 8, 1487, 3023, 2232, 1664, 792, 2414, 1072, 1952, 264, 3152, 2320, 2954, 530, 1933, 2947, 602, 2062, 2850, 28, 2868, 1183, 1269, 1500, 920, 3085, 1355, 1447, 2144, 72, 1570, 2278, 43, 435, 1304, 413, 2381, 2334, 1458, 3062, 2452, 2022, 2922, 2068, 2128, 2956, 850, 912, 789, 1510, 1584, 1462, 474, 2322, 1498, 90, 980, 1091, 2557, 3218, 508, 3164, 2311, 470, 2887, 1557, 1148, 2297, 1228, 2840, 2736, 456, 3171, 1000, 2067, 197, 2531, 1925, 2202, 1545, 1765, 2500, 1223, 2821, 910, 1022, 265, 3026, 1519, 2705, 1542, 2553, 1325, 1964, 2085, 206, 1252, 1532, 17, 1198, 2641, 2825, 2955, 2345, 2684, 307, 416, 3320, 506, 241, 3244, 1516, 653, 2380, 1941, 2233, 853, 261, 1869, 932, 2327, 389, 2989, 1349, 2951, 2667, 663, 2785, 1683, 351, 2758, 2256, 2872, 3303, 1343, 486, 2134, 168, 2898, 722, 952, 1302, 1738, 1499, 1043, 1691, 61, 2859, 2504, 864, 506, 3309, 615, 1513, 1899, 3099], [1040, 1004, 1155, 2002, 34, 2262, 140, 561, 3139, 2913, 146, 2633, 2552, 1434, 315, 591, 797, 1991, 268, 1757, 2933, 1294, 1222, 712, 736, 474, 2510, 1028, 566, 1224, 742, 1315, 745, 1523, 1797, 843, 2885, 290, 657, 2835, 2198, 1184, 2103, 3000, 689, 175, 567, 3117, 2483, 239, 1805, 2605, 2420, 2844, 169, 751, 1991, 542, 1268, 986, 2624, 601, 2555, 2476, 1092, 1901, 1841, 3184, 647, 150, 1601, 487, 3284, 2360, 1065, 2978, 2402, 2144, 1999, 1954, 1827, 452, 891, 817, 829, 1737, 1037, 2541, 783, 1231, 2979, 2090, 1076, 684, 1259, 1438, 710, 81, 1835, 361, 3049, 518, 1982, 396, 18, 1030, 2473, 496, 2411, 1098, 1375, 2052, 2922, 1774, 1592, 1809, 3087, 3063, 493, 17, 582, 2113, 1757, 697, 635, 65, 2684, 160, 2704, 86, 1161, 2715, 1700, 1122, 2715, 925, 2374, 416, 2871, 405, 2386, 458, 3107, 241, 1510, 2043, 2428, 2028, 254, 3021, 272, 864, 888, 3042, 1560, 776, 2699, 531, 2885, 2018, 69, 1637, 3185, 3273, 1770, 2687, 3110, 559, 956, 2456, 3061, 3060, 1994, 3247, 2659, 1851, 3095, 1955, 424, 2470, 2111, 1476, 830, 67, 33, 1648, 1126, 1783, 1614, 1631, 1086, 228, 3164, 1437, 83, 388, 707, 3077, 2083, 1221, 1979, 1251, 2487, 2938, 2179, 806, 958, 2805, 2599, 98, 1431, 3301, 559, 2511, 984, 2379, 1221, 546, 1971, 228, 295, 1524, 833, 2427, 2387, 1429, 241, 6, 1339, 708, 1780, 2425, 1463, 874, 1417, 696, 3262, 3318, 1247, 187, 2376, 814, 397, 350, 34, 2637, 305, 347, 165, 3116, 244, 2003, 664, 3078, 3037, 1025]] eHat: [[522, 1963, 2339, 1049, 383, 728, 639, 1380, 2621, 1800, 108, 2626, 634, 1542, 1849, 2631, 2057, 2926, 497, 1024, 565, 1356, 2933, 794, 318, 3186, 2569, 993, 2342, 739, 2976, 3282, 3032, 614, 16, 1012, 786, 1595, 196, 15, 2915, 1049, 2749, 1800, 1800, 2324, 3241, 3304, 1155, 2244, 1769, 2734, 3169, 3178, 601, 2361, 555, 2812, 2264, 759, 875, 542, 2092, 2831, 215, 413, 1225, 1877, 1896, 2264, 2780, 634, 1826, 2287, 1868, 1290, 234, 710, 2712, 2357, 1067, 1119, 1206, 2304, 183, 1410, 1768, 746, 65, 440, 1037, 2510, 3325, 1563, 1922, 2168, 1858, 1235, 196, 1795, 1950, 1141, 886, 2853, 3304, 2031, 1706, 2689, 3312, 2787, 3313, 1111, 3282, 205, 1245, 2005, 2284, 1949, 3225, 677, 314, 3257, 1812, 3316, 2891, 2844, 319, 1207, 826, 1901, 2413, 1690, 3215, 1750, 173, 1810, 1593, 1712, 1216, 2008, 3036, 404, 2263, 1792, 1185, 3043, 2914, 833, 1165, 717, 1122, 1198, 1764, 2877, 2924, 815, 548, 2566, 1423, 2030, 535, 913, 1190, 589, 3046, 1151, 445, 2512, 2388, 3097, 1571, 1220, 1915, 3117, 114, 3107, 64, 174, 1921, 908, 275, 1711, 2969, 1215, 2424, 1707, 3059, 2024, 2928, 3214, 1456, 243, 2870, 1789, 1505, 2588, 2603, 2617, 3309, 2012, 156, 2381, 2128, 3147, 2309, 871, 2153, 3153, 3160, 749, 807, 1840, 984, 876, 245, 94, 1118, 1698, 1691, 1317, 213, 59, 1997, 2128, 2415, 2561, 1121, 2771, 2243, 1712, 129, 2363, 2232, 79, 1043, 1351, 733, 1938, 39, 2265, 2798, 1649, 2423, 2892, 1116, 2102, 2354, 1351, 1280, 1952, 519, 1486, 3181, 1942, 2437, 875], [1744, 65, 540, 293, 2235, 2869, 395, 195, 83, 89, 2366, 631, 50, 426, 3199, 1907, 538, 644, 488, 2131, 464, 1969, 2439, 3121, 2213, 3302, 828, 1346, 2442, 2660, 596, 2958, 1917, 1177, 1398, 421, 3194, 1342, 1305, 2364, 1478, 2589, 1094, 555, 1316, 2753, 887, 3000, 1232, 1322, 627, 303, 421, 2032, 1001, 1328, 2856, 834, 2074, 1789, 1275, 2949, 2616, 722, 2763, 581, 74, 1768, 1669, 498, 1515, 533, 117, 358, 2153, 2987, 1524, 443, 225, 1568, 2600, 1429, 274, 2060, 1899, 1735, 1973, 1804, 2735, 419, 3305, 535, 767, 128, 239, 2055, 3257, 901, 3260, 1816, 853, 2397, 2657, 1576, 3207, 406, 1248, 1743, 816, 1842, 2258, 760, 332, 680, 1648, 1286, 1550, 1901, 476, 1134, 1500, 496, 742, 2744, 527, 1463, 2268, 614, 1007, 941, 756, 749, 2518, 1085, 683, 3020, 1473, 3147, 1002, 2834, 3030, 1384, 1012, 1311, 2789, 2302, 1744, 719, 2852, 955, 2699, 442, 494, 2390, 658, 411, 971, 1910, 1739, 539, 243, 3213, 2858, 117, 1723, 84, 1883, 591, 2856, 1185, 2782, 2394, 625, 428, 487, 1156, 2619, 2041, 1354, 1233, 30, 148, 2611, 2197, 88, 439, 3262, 3215, 1344, 1842, 477, 1536, 945, 1503, 506, 2115, 1709, 3191, 3133, 1956, 1262, 1948, 2944, 1456, 1393, 2697, 1491, 667, 1941, 3058, 1087, 2870, 51, 141, 232, 1503, 1838, 1816, 2519, 2632, 1939, 1552, 2752, 1677, 1687, 2481, 1299, 1732, 3052, 1015, 1926, 479, 1969, 1999, 2080, 1209, 96, 2246, 2278, 2613, 1020, 132, 1465, 554, 2822, 927, 1808, 3031, 2614, 1438, 1706, 2851, 2059, 2839, 3035, 178]] aHat * sHat: [[2236, 1835, 2939, 1371, 1272, 1590, 3036, 1269, 1935, 2891, 2736, 1191, 216, 1652, 2371, 1488, 1078, 2642, 1383, 1041, 1821, 1305, 1849, 1617, 2823, 1356, 1705, 755, 2604, 3276, 2410, 885, 1240, 1294, 21, 2125, 219, 2965, 2586, 1441, 757, 67, 2602, 1456, 3200, 1758, 3160, 554, 2631, 122, 1890, 1023, 2127, 401, 2976, 2809, 2812, 57, 1107, 2957, 572, 2991, 2988, 2437, 395, 2789, 2787, 1876, 2347, 784, 1089, 2771, 1954, 2641, 1217, 1977, 2545, 1754, 2470, 2333, 2561, 298, 522, 2279, 2470, 1989, 968, 133, 1437, 1708, 541, 102, 1442, 865, 2093, 956, 2512, 1529, 2398, 33, 2105, 202, 3142, 1329, 784, 923, 2311, 1887, 1572, 20, 1896, 17, 3106, 2078, 38, 1442, 1436, 1289, 1057, 1955, 2156, 1106, 655, 2442, 3002, 2780, 1527, 2916, 942, 2749, 1738, 290, 356, 1707, 386, 1991, 401, 1976, 4, 700, 47, 938, 560, 1188, 2488, 1098, 2910, 1770, 2848, 2593, 1639, 428, 1450, 750, 198, 2429, 3097, 2723, 2308, 1711, 837, 2159, 571, 1008, 954, 1630, 40, 2356, 3114, 2460, 337, 3255, 2645, 2259, 3160, 2451, 737, 3064, 2691, 208, 3291, 2419, 1248, 2310, 1513, 2529, 2600, 2361, 784, 896, 1096, 2818, 2344, 110, 1017, 2229, 2976, 781, 1038, 810, 2107, 2993, 1626, 1658, 621, 440, 542, 2610, 1864, 983, 2161, 1348, 1396, 2070, 3183, 308, 108, 1823, 2562, 197, 3150, 2203, 1502, 2056, 1548, 573, 3149, 2150, 348, 1995, 2509, 917, 829, 2990, 553, 872, 808, 2746, 1555, 1683, 3233, 2977, 1850, 1150, 2236, 1398, 1250, 1504, 2779, 2428, 2290, 2917, 1427, 2774, 3148, 2335], [950, 2207, 1036, 133, 1127, 2447, 1077, 1553, 1105, 569, 455, 3174, 2827, 2598, 3075, 376, 712, 1987, 1108, 996, 3137, 415, 654, 3311, 2716, 2015, 1015, 2178, 1021, 2949, 886, 2653, 446, 3090, 2231, 1884, 3277, 2452, 2530, 1734, 2139, 403, 2149, 2281, 3264, 1318, 2177, 949, 1632, 223, 2271, 2804, 1395, 792, 1430, 920, 1214, 1828, 3249, 490, 165, 461, 1614, 1199, 2820, 2421, 53, 756, 3213, 3272, 897, 1248, 1054, 319, 2353, 2486, 2139, 3089, 1775, 1819, 3252, 773, 1295, 1693, 1565, 2981, 1181, 9, 1530, 945, 1110, 2800, 376, 759, 3034, 1214, 1480, 2371, 1873, 188, 1809, 2025, 1049, 936, 1222, 663, 1559, 2550, 936, 703, 1649, 2190, 2523, 809, 234, 1920, 2228, 1850, 2514, 3178, 2858, 2579, 1183, 946, 3055, 1544, 2189, 1699, 2470, 767, 39, 2474, 724, 1940, 3145, 1656, 1917, 228, 2495, 2283, 2495, 694, 2070, 1558, 1423, 1659, 117, 3135, 68, 440, 1982, 2221, 632, 2692, 880, 1790, 1908, 2845, 286, 613, 2970, 2236, 1632, 1752, 798, 2478, 3328, 406, 2479, 3318, 806, 237, 764, 952, 1252, 1063, 3184, 1230, 244, 395, 790, 1245, 1338, 77, 2527, 3219, 270, 3051, 1143, 1924, 1340, 1498, 2695, 1643, 1753, 2645, 2269, 540, 3080, 862, 1227, 1039, 3048, 2828, 2128, 3029, 2038, 301, 598, 2237, 1984, 907, 1250, 1782, 3258, 1780, 83, 1501, 3230, 1822, 2864, 287, 429, 1933, 2961, 2723, 2622, 593, 1609, 2960, 1128, 2273, 1107, 1224, 2149, 1020, 2871, 501, 2071, 2120, 1248, 2583, 726, 849, 1988, 3134, 267, 1953, 19, 126, 1247, 624, 362, 2547, 376, 2142]] tHat = aHat * sHat + eHat: [[2758, 469, 1949, 2420, 1655, 2318, 346, 2649, 1227, 1362, 2844, 488, 850, 3194, 891, 790, 3135, 2239, 1880, 2065, 2386, 2661, 1453, 2411, 3141, 1213, 945, 1748, 1617, 686, 2057, 838, 943, 1908, 37, 3137, 1005, 1231, 2782, 1456, 343, 1116, 2022, 3256, 1671, 753, 3072, 529, 457, 2366, 330, 428, 1967, 250, 248, 1841, 38, 2869, 42, 387, 1447, 204, 1751, 1939, 610, 3202, 683, 424, 914, 3048, 540, 76, 451, 1599, 3085, 3267, 2779, 2464, 1853, 1361, 299, 1417, 1728, 1254, 2653, 70, 2736, 879, 1502, 2148, 1578, 2612, 1438, 2428, 686, 3124, 1041, 2764, 2594, 1828, 726, 1343, 699, 853, 759, 2954, 688, 1247, 1555, 2807, 1880, 1128, 3059, 2283, 1283, 118, 391, 3238, 953, 2632, 2470, 1034, 2467, 2429, 2564, 2295, 1846, 794, 1768, 1321, 822, 1980, 242, 128, 559, 472, 1994, 359, 1220, 2708, 3083, 1342, 2823, 2980, 344, 812, 2495, 2603, 684, 3310, 2761, 1626, 3214, 298, 3122, 3244, 316, 1960, 402, 412, 1372, 3072, 1761, 1597, 671, 2781, 485, 1539, 2173, 2228, 1908, 1146, 1231, 2047, 3274, 2229, 801, 3238, 1283, 1116, 237, 801, 888, 196, 608, 907, 2330, 1056, 383, 781, 2552, 3061, 1885, 1899, 2522, 1488, 2250, 69, 1018, 2822, 2263, 2045, 425, 1476, 2930, 1311, 2695, 2434, 1695, 1732, 2968, 3188, 2380, 2946, 99, 402, 1226, 192, 924, 1514, 34, 2262, 170, 855, 634, 3134, 941, 1592, 2591, 378, 2638, 3280, 3061, 3069, 1596, 2223, 1541, 1355, 1594, 619, 2702, 1297, 944, 713, 23, 171, 275, 2855, 730, 1051, 2809, 1074, 1279, 1387, 2256, 3210], [2694, 2272, 1576, 426, 33, 1987, 1472, 1748, 1188, 658, 2821, 476, 2877, 3024, 2945, 2283, 1250, 2631, 1596, 3127, 272, 2384, 3093, 3103, 1600, 1988, 1843, 195, 134, 2280, 1482, 2282, 2363, 938, 300, 2305, 3142, 465, 506, 769, 288, 2992, 3243, 2836, 1251, 742, 3064, 620, 2864, 1545, 2898, 3107, 1816, 2824, 2431, 2248, 741, 2662, 1994, 2279, 1440, 81, 901, 1921, 2254, 3002, 127, 2524, 1553, 441, 2412, 1781, 1171, 677, 1177, 2144, 334, 203, 2000, 58, 2523, 2202, 1569, 424, 135, 1387, 3154, 1813, 936, 1364, 1086, 6, 1143, 887, 3273, 3269, 1408, 3272, 1804, 2004, 2662, 1093, 377, 2512, 1100, 1069, 2807, 964, 1752, 2545, 578, 2950, 2855, 1489, 1882, 3206, 449, 422, 2990, 983, 1029, 3075, 1925, 361, 253, 3007, 1128, 2313, 148, 1708, 795, 3223, 3242, 3025, 499, 1347, 61, 46, 168, 1788, 2196, 2078, 3082, 2869, 883, 632, 1861, 525, 2920, 1395, 1352, 2663, 1126, 1753, 1538, 2201, 2879, 1426, 2025, 1152, 3213, 2120, 1161, 1869, 2521, 2562, 1882, 997, 2006, 1174, 259, 2631, 1389, 1380, 1739, 2219, 2474, 3271, 1598, 1628, 820, 1393, 620, 2274, 2615, 329, 203, 2937, 2487, 437, 1817, 3034, 311, 3146, 2259, 1431, 649, 402, 2884, 2818, 2489, 2987, 2663, 955, 192, 2397, 200, 968, 2539, 1966, 3071, 448, 1301, 1923, 161, 3283, 1921, 3317, 2420, 1125, 1474, 1839, 3181, 281, 1319, 1875, 592, 2325, 1332, 646, 3054, 2752, 3076, 3223, 900, 2229, 2967, 2747, 1020, 1404, 2268, 2715, 2191, 1403, 1481, 732, 2075, 1655, 2633, 1564, 2953, 146, 2421, 2057, 82, 2320]] ek: C65A1D9D479777E6905A91A5CB24551C8B1E52A3C77B63313FFC8B5817815259A6ADB59645DC4BB1436D51E62A096834AF43772510C4EDF34CDE0A5B57C145E687CB87162F001C21C9E1934AC11AAFA70FF810732650B32A3018A7C50CD736796222C8AB821A9283BE1CC204C3F1630D3CCCDB0A9A3D17552B9158C0664E5D6A04B0FA36DE45862A46A39EC597AE42C311C4AC224A72D6F253BB5235F7A2B8B0F24D1376AF588746F3BB8E0365078761CAB983A4A6A940A3D997047A8F36A731E8965236C37BF200082F821DCA7716C444A90BEC53074BBA58C132BFB9A2ACE2CEC9AA658EAC1232CCCA3C817A92C1195C05C0E1D6639FD2ADE531607D488B74A747CFF47FCA5C8B2163CA03C545ED103278430C60B2381A09427FD130F859BF5DB776DA095DCA5804FA63B0D7D87FA9415C72FB51872A989F466C984BC74C29B8632019CA040C9CA35E22608DAA70357AE2C3AD83631FAA174E0ACDF5DBBF3CF68A05B6543AB6268E1A51B0932C17B00A1371B2DAB241F92A43FFB456D0A8C8860A8E28A61A21307CC0456DA4242905CB1D3D0BBD81BB8EE274A43C76C310019515FCC140467C33370C86808ECAA58E3BA93A2C1190461C1DFA11302001BBAB4CB1E3642EF8CB26309B60523BC21887B07F898CE562A6CA778EA01505851378CEA8BB7FC09D11961B6C596F93542A9904864EB10CD0A703DBA98921861A87B056525C71A843553E6400777437C95CCC8085CC0C477D665A4479019D4CD442F74A3CD8169F4262B8271B5D5A67C8C1611AAE7B3D0534C0859716FDF0BB68949094C06A1B73C9AA1CBDF331543DE002A8C06F94E8810A5CB373832745D720683B574875A666946D0296893F2B59E907488D8C8489D474D929A05A573ED667490371A46D4556CBB68AAA79CC3EC6653413576C228E379A14CB90B7B7591B19A7BD37A1C4D37859892219442BB0B9B9BA67BA3BC0D095C8803CEBE97AFF0B1C153578A130CD8157CF745946C2F5726D9C11273575505291346528EE0BAC047CC984538B97BBABFCC357DCB8A98FB857C9C52D1B786749CA61892B09759980520091B9B477C70E6C46586B1CCEBE87BCF6DF03C2B27CB09FA03F63160958383BE636 dk: 37EC477E217BFB40384C850E51C1837158BDBC23A31832BC25C91B3121444AD4533733BAFF07CA817B64B2CA4299AA26454CBAFB35B6ABE1185CB47C4CD61AF98383C4814B20AB8754FC514F23074114C3E5A810A453B855AA7F1310C74B0B01E5AAB2E871738FAC2786C7A05D6B3B32A050D0FB223956C95CA0C2C1D54154A77BD33737A49A0065D1424A2ABAFD52AA934C9804939208F05CCF8B8B8086316E0943A08710500C918A2B218D37B85AE28022CB0134FB49F5C45D98D3C04B755A60880422668E2B301B18D5194DE991B265BF94697E6A4B8150C8B852033915635E30665BDA2191DAA505D43344FD29C9FCC1C507691D475B617C948FCC84B1B08A1C638C3E13580CE359789A9860E5469CC754B08EE33F0921BDEF15A906969F2DC57A25E80CE4C45F11E04A519AB08B9B927C3A13A081CFFA110FACCC5E8DC29495978B5553104D473A175918AD5B5487BBA69712AE93F615C60A8D387BCE3F651E56880A522B2DB86351CAB65D13B4693DB0B2C80936FAD1CE67925E6BB7C110C43E83247D22608D8C1023431CB69290A4F8A9593BF1241D737C0CD16D75EB50C6842CE0A21DCE494036824CE63252E9325F05B734452B129132B196084A3788BBB1F20A37D2C2B3F90E0DD7A274C9B1A9F02EC7E721F4A43D409A25FBC99A44D4763107C787620941761ED48C932924BA620986CF277A23471C7B13333D936C0DD49E0FF34CA3AB8234C42AEBE459C612052B9716E96B20BEC718126040A9091F6BA9445F45806AEB6E3816710F7CBFED1101461284DD962B7B12047C0A0A906A0589B4A9A426469BDA3946091A375B1952A91C231C0FE6B57F7CC97EFED0BC1001367823BE1886308B3A21452B7E455066719CCCEAF6A726FC22BC8399F54BBFCAF7CA63BA73173C7AA8619A3F485C3E330421006766746F4EF6653E440E5CDC59534018C352C023584CBB374EB7A9B7836832BE53AF272A069755CE2FF29CD8B394C52422B3470E27415F41B397535959F160003B452CF49697B7A53689852BBE6CCFDFB40B48E9328DE11522D0A431B115A5C0C2F4307D9862C0DD1B40C65A1D9D479777E6905A91A5CB24551C8B1E52A3C77B63313FFC8B5817815259A6ADB59645DC4BB1436D51E62A096834AF43772510C4EDF34CDE0A5B57C145E687CB87162F001C21C9E1934AC11AAFA70FF810732650B32A3018A7C50CD736796222C8AB821A9283BE1CC204C3F1630D3CCCDB0A9A3D17552B9158C0664E5D6A04B0FA36DE45862A46A39EC597AE42C311C4AC224A72D6F253BB5235F7A2B8B0F24D1376AF588746F3BB8E0365078761CAB983A4A6A940A3D997047A8F36A731E8965236C37BF200082F821DCA7716C444A90BEC53074BBA58C132BFB9A2ACE2CEC9AA658EAC1232CCCA3C817A92C1195C05C0E1D6639FD2ADE531607D488B74A747CFF47FCA5C8B2163CA03C545ED103278430C60B2381A09427FD130F859BF5DB776DA095DCA5804FA63B0D7D87FA9415C72FB51872A989F466C984BC74C29B8632019CA040C9CA35E22608DAA70357AE2C3AD83631FAA174E0ACDF5DBBF3CF68A05B6543AB6268E1A51B0932C17B00A1371B2DAB241F92A43FFB456D0A8C8860A8E28A61A21307CC0456DA4242905CB1D3D0BBD81BB8EE274A43C76C310019515FCC140467C33370C86808ECAA58E3BA93A2C1190461C1DFA11302001BBAB4CB1E3642EF8CB26309B60523BC21887B07F898CE562A6CA778EA01505851378CEA8BB7FC09D11961B6C596F93542A9904864EB10CD0A703DBA98921861A87B056525C71A843553E6400777437C95CCC8085CC0C477D665A4479019D4CD442F74A3CD8169F4262B8271B5D5A67C8C1611AAE7B3D0534C0859716FDF0BB68949094C06A1B73C9AA1CBDF331543DE002A8C06F94E8810A5CB373832745D720683B574875A666946D0296893F2B59E907488D8C8489D474D929A05A573ED667490371A46D4556CBB68AAA79CC3EC6653413576C228E379A14CB90B7B7591B19A7BD37A1C4D37859892219442BB0B9B9BA67BA3BC0D095C8803CEBE97AFF0B1C153578A130CD8157CF745946C2F5726D9C11273575505291346528EE0BAC047CC984538B97BBABFCC357DCB8A98FB857C9C52D1B786749CA61892B09759980520091B9B477C70E6C46586B1CCEBE87BCF6DF03C2B27CB09FA03F63160958383BE636C0ECC8DDAE8B594A14037868BEC0B22300DEFDFAA1D973AC5CEC84AE4386B8FBCD119AFDC8559442424A87C13EA101E29FCA11881869077E4092E751BEDCA8BC fips203-0.2.1/tests/nist_vectors/Key Generation -- ML-KEM-768.txt000064400000000000000000001261731046102023000216740ustar 00000000000000Key Generation -- ML-KEM-768 z: 92AC7D1F83BAFAE6EE86FE00F95D813375772434860F5FF7D54FFC37399BC4CC d: 92AC7D1F83BAFAE6EE86FE00F95D813375772434860F5FF7D54FFC37399BC4CC rho: 7E6948E65281250416C349C8100B3B4D3D0F62ACAD8D161175B134F7564937CD sigma: E71CB52F313F38B4CF0ADD7270390FB1ADE0AEE2D1EF704562409F6F9F825F2F aHat: [[[503, 2488, 1249, 1628, 3202, 1319, 414, 1890, 2741, 1035, 2249, 881, 402, 455, 2452, 1726, 610, 1860, 2796, 2467, 1906, 1982, 2045, 298, 1925, 2123, 1925, 1486, 1733, 1907, 1152, 2585, 1259, 1341, 2565, 1580, 1308, 2806, 1535, 780, 1417, 9, 831, 377, 2838, 1062, 2037, 111, 1148, 396, 1151, 1545, 1380, 1520, 912, 3104, 3245, 515, 2156, 2341, 613, 42, 1262, 2597, 1121, 2364, 897, 2206, 3019, 2194, 628, 890, 1345, 2183, 0, 1138, 1315, 2939, 356, 482, 1065, 514, 1033, 2523, 1791, 2845, 436, 3038, 643, 813, 2979, 1867, 3056, 2369, 1542, 2820, 344, 232, 3302, 1791, 2607, 3293, 2915, 774, 3072, 1977, 3295, 950, 2318, 1807, 111, 3001, 307, 2725, 1142, 361, 1118, 1309, 2969, 528, 2827, 1406, 2579, 1436, 2059, 438, 1942, 823, 704, 3234, 2247, 1902, 2097, 2143, 1700, 414, 2370, 1503, 1930, 2643, 1340, 2640, 842, 617, 2757, 410, 2400, 2905, 2636, 1854, 598, 1598, 3256, 2780, 2094, 215, 1285, 368, 364, 2328, 2187, 229, 1425, 1028, 1304, 17, 1313, 613, 29, 2378, 2316, 515, 890, 2648, 568, 763, 566, 1078, 315, 2898, 13, 925, 1052, 3132, 3276, 2750, 145, 1410, 1541, 1684, 2488, 3249, 1427, 3197, 3175, 1711, 1076, 2583, 1127, 1319, 629, 3238, 1244, 1272, 1548, 2882, 818, 2576, 1325, 1555, 3210, 1553, 2269, 681, 1180, 2870, 72, 1058, 1018, 1243, 1907, 3263, 2172, 2016, 1962, 191, 1585, 1174, 1300, 1399, 867, 342, 2750, 2353, 1341, 1064, 1004, 680, 1720, 792, 166, 943, 3243, 1543, 2988, 2333, 2223, 2080, 2610, 2275, 57, 1481, 1374, 1436, 1895, 1779], [170, 3122, 168, 852, 273, 11, 87, 3134, 1240, 623, 349, 894, 2031, 2474, 2364, 2688, 791, 1502, 3253, 3225, 1850, 75, 661, 37, 2792, 1555, 2110, 2365, 711, 916, 967, 2584, 1940, 1388, 2500, 1102, 2625, 3112, 2519, 2890, 1729, 2487, 432, 1730, 2935, 1104, 2177, 369, 2456, 1882, 1416, 713, 494, 2002, 530, 223, 1129, 271, 789, 3011, 2723, 2920, 1672, 3062, 1211, 844, 922, 317, 2353, 1828, 245, 2530, 2496, 2560, 3015, 1780, 795, 443, 2755, 2605, 1379, 405, 2053, 1079, 1548, 2758, 1472, 858, 2939, 1358, 2786, 1832, 1107, 1205, 2992, 2699, 313, 91, 617, 3040, 2353, 2693, 1646, 1818, 3079, 2548, 1590, 1806, 1074, 2930, 3288, 3204, 2051, 2131, 2763, 2782, 2248, 1621, 2857, 2887, 514, 2412, 114, 202, 487, 17, 1475, 600, 826, 105, 679, 721, 2067, 324, 556, 671, 386, 1627, 1094, 778, 2684, 3285, 2071, 2071, 2938, 608, 3276, 739, 1303, 1530, 2443, 2880, 3177, 1933, 2643, 2657, 800, 753, 1540, 1306, 1628, 1057, 3306, 2064, 299, 366, 1699, 1352, 226, 1254, 682, 1525, 2404, 112, 55, 568, 610, 1097, 2022, 1897, 733, 1611, 2291, 957, 1701, 1240, 388, 2126, 634, 1782, 2581, 2346, 784, 1618, 1516, 667, 2958, 839, 2691, 684, 331, 1725, 594, 252, 2425, 2261, 2981, 1930, 2399, 948, 2755, 2735, 1881, 1280, 1740, 863, 1849, 882, 2766, 279, 2854, 694, 892, 1802, 445, 198, 2152, 2448, 2609, 2649, 3208, 333, 3207, 1460, 69, 2927, 3308, 235, 2466, 3030, 180, 218, 1033, 492, 2020, 1757, 2780, 653, 1137, 1437, 195, 660, 2614, 1499, 2041, 806], [1374, 59, 66, 1050, 2591, 2316, 593, 2806, 162, 2198, 3073, 2638, 145, 1038, 1027, 2730, 736, 1123, 204, 2989, 974, 2145, 1750, 784, 417, 583, 1694, 1072, 736, 1124, 1603, 3279, 1478, 1043, 2154, 1322, 2709, 2841, 2283, 1171, 601, 988, 735, 2892, 2516, 1596, 575, 3267, 484, 2051, 618, 1776, 744, 2682, 2762, 2886, 1855, 573, 458, 1921, 746, 2738, 1954, 1501, 1494, 27, 2999, 1362, 1430, 1903, 1829, 2282, 1920, 1572, 1717, 706, 2400, 684, 1193, 3192, 1902, 2209, 2493, 2289, 380, 220, 2308, 1791, 2876, 1727, 2071, 1681, 1453, 666, 1431, 215, 2436, 3158, 400, 616, 1759, 646, 2966, 1337, 295, 1106, 141, 1981, 134, 2597, 1052, 2939, 1763, 2219, 1771, 2965, 756, 2143, 2055, 479, 314, 2364, 2507, 401, 672, 383, 1532, 1356, 2485, 1911, 747, 506, 2203, 1040, 1363, 3318, 1533, 1154, 2224, 876, 2211, 1896, 3153, 2607, 463, 2613, 1208, 2891, 759, 511, 2951, 1867, 2710, 1808, 1384, 1090, 1916, 196, 2471, 2310, 1781, 380, 79, 2937, 1650, 387, 1971, 2708, 359, 2622, 1884, 1559, 2280, 2928, 1588, 2198, 591, 3313, 3167, 342, 94, 304, 2877, 1272, 3121, 1303, 2367, 381, 1221, 1727, 136, 543, 170, 1495, 1140, 8, 2629, 1281, 2408, 389, 1418, 2520, 2085, 2977, 2133, 2043, 1705, 585, 2964, 2524, 301, 463, 1253, 1685, 1342, 2489, 2230, 2392, 993, 1870, 2287, 3285, 3152, 2416, 2121, 1802, 672, 2850, 2884, 1130, 363, 1192, 1470, 1163, 2282, 806, 2472, 2719, 3122, 2266, 1165, 1482, 2823, 957, 2694, 1350, 3299, 2023, 1730, 573, 1409, 1205, 1427, 1099, 2442, 2460]], [[2477, 657, 1008, 914, 2644, 3115, 1701, 124, 1237, 2897, 2444, 2579, 1646, 1288, 1786, 1949, 3202, 767, 1479, 2484, 2355, 3029, 3175, 621, 2647, 1535, 2320, 2744, 1065, 1369, 649, 266, 1964, 52, 1017, 1651, 2300, 385, 3154, 2545, 2585, 2808, 2427, 1894, 1101, 2881, 2864, 2131, 1168, 210, 191, 663, 2270, 2921, 2626, 155, 3305, 1858, 236, 3250, 1448, 874, 509, 1827, 66, 727, 2581, 1007, 108, 796, 3099, 1302, 2163, 783, 1520, 2983, 2560, 3306, 1078, 1912, 2986, 1053, 2098, 1540, 2134, 3065, 2171, 612, 233, 2026, 2027, 683, 2595, 656, 2127, 842, 965, 2274, 1436, 1170, 996, 3176, 1757, 474, 1745, 2129, 200, 2537, 48, 2472, 2944, 1920, 1180, 2961, 665, 32, 1911, 2182, 205, 3010, 2598, 356, 2980, 1208, 3159, 947, 609, 2166, 1714, 2162, 696, 1457, 906, 896, 183, 434, 2534, 2493, 3019, 1019, 1691, 1910, 3071, 251, 974, 3132, 974, 906, 1754, 912, 1849, 345, 2120, 509, 366, 3174, 1248, 2425, 1866, 1913, 2382, 2335, 1353, 370, 998, 69, 1760, 316, 1007, 1425, 1337, 2521, 2915, 2570, 2043, 2808, 2911, 2687, 2946, 1640, 331, 3093, 2922, 3208, 333, 866, 1564, 962, 1768, 943, 3239, 883, 3075, 1084, 821, 444, 1020, 947, 1381, 249, 2621, 1579, 1604, 2626, 1923, 1772, 2675, 257, 520, 129, 1126, 2349, 2476, 1234, 2760, 873, 1105, 1285, 746, 3035, 430, 286, 1376, 2601, 505, 1415, 1643, 2312, 694, 1562, 3012, 2342, 2117, 2785, 1796, 1636, 1123, 2184, 1658, 2308, 850, 609, 534, 1294, 804, 27, 170, 3094, 2549, 1432, 2006, 2967, 731, 1757, 2042, 983], [2415, 302, 2224, 160, 2409, 2914, 570, 216, 119, 562, 1106, 2122, 220, 66, 884, 2875, 602, 1463, 145, 974, 2728, 436, 1227, 1445, 1876, 102, 2273, 3068, 635, 3217, 2866, 2440, 2103, 1964, 1136, 1284, 1888, 3080, 2933, 1696, 1812, 3267, 2910, 400, 1673, 1177, 2239, 3092, 849, 2846, 2365, 1527, 1284, 1305, 434, 2138, 367, 761, 638, 472, 1132, 16, 3217, 52, 2708, 1545, 987, 3314, 642, 182, 2977, 300, 2319, 165, 2594, 835, 884, 564, 2909, 1570, 2651, 2401, 243, 638, 2602, 493, 233, 2260, 1668, 2980, 2889, 2405, 2627, 2662, 2891, 488, 730, 2451, 569, 3056, 1898, 1746, 1939, 2420, 1989, 2450, 2360, 646, 84, 2192, 1014, 3230, 2302, 1567, 173, 3172, 2516, 2120, 2135, 70, 1598, 1446, 1844, 867, 830, 203, 3315, 3107, 1804, 2836, 876, 2924, 1000, 1048, 483, 2937, 2600, 2906, 641, 1655, 1450, 1531, 1840, 2212, 2902, 2930, 181, 2936, 1776, 172, 282, 2041, 183, 363, 2135, 3171, 122, 1731, 1582, 2383, 2294, 2999, 3076, 1134, 2405, 1781, 120, 2644, 1080, 3150, 1842, 2826, 2373, 3089, 3278, 2364, 2102, 3037, 2028, 1219, 1376, 619, 2897, 3287, 2694, 1064, 2328, 1477, 115, 2585, 42, 1810, 689, 625, 2129, 1404, 1992, 2436, 520, 2555, 2787, 1155, 795, 323, 2595, 618, 2432, 530, 397, 2967, 1276, 2950, 3151, 989, 569, 1134, 2608, 2692, 1997, 1191, 1909, 2416, 2131, 2321, 2670, 1623, 186, 1381, 2268, 81, 2274, 1437, 2557, 36, 3076, 2556, 1562, 369, 1796, 2765, 3234, 3159, 2353, 140, 756, 335, 275, 1688, 3192, 3118, 753, 2313, 1668, 361, 1894, 1348], [1387, 669, 2843, 320, 1888, 1947, 3000, 173, 3061, 2470, 336, 189, 2719, 810, 237, 1545, 1053, 3226, 725, 1754, 1844, 549, 3293, 2417, 196, 1852, 794, 235, 1922, 3, 262, 3259, 3281, 1843, 177, 3285, 1980, 2359, 1584, 2869, 2202, 404, 2439, 2874, 2901, 1309, 1118, 1333, 724, 217, 757, 2605, 474, 342, 2761, 818, 607, 2074, 1586, 183, 241, 1589, 1884, 1145, 1511, 2981, 332, 3187, 1481, 182, 2156, 2337, 2911, 1263, 3072, 2458, 3294, 685, 553, 2181, 1539, 644, 2851, 263, 1591, 2685, 1399, 1783, 2323, 1319, 2618, 871, 3251, 329, 755, 1819, 2855, 2252, 149, 1525, 1842, 3213, 815, 111, 1016, 2601, 881, 1191, 962, 193, 575, 727, 2807, 680, 2077, 2205, 1826, 1701, 2804, 1228, 2797, 70, 3035, 2617, 430, 1780, 1190, 851, 253, 648, 3004, 2685, 1855, 2552, 3096, 2489, 1887, 333, 823, 1169, 3255, 615, 1990, 66, 1233, 2168, 2752, 416, 1117, 2408, 2343, 1249, 2128, 3245, 2747, 1606, 472, 991, 875, 2280, 2077, 2662, 2250, 79, 1123, 1282, 3075, 3142, 1229, 226, 2220, 2257, 170, 1691, 561, 2270, 2436, 960, 487, 1867, 1704, 3197, 2302, 2704, 2518, 2088, 2070, 1051, 1795, 815, 529, 1592, 2160, 1655, 500, 3297, 1793, 440, 1509, 999, 439, 744, 1107, 15, 2895, 1108, 545, 2390, 1997, 1530, 831, 3269, 3107, 1694, 2830, 2221, 1473, 1294, 1671, 571, 3013, 2996, 3013, 1979, 1614, 1899, 2822, 2674, 2163, 498, 2424, 1081, 2045, 2502, 2358, 2013, 59, 597, 2476, 398, 447, 2889, 2891, 3114, 804, 1983, 1683, 2293, 2450, 2233, 1213, 1355, 410, 2145, 1639, 695]], [[458, 3073, 1091, 2535, 1094, 1943, 1517, 612, 823, 2562, 961, 3148, 2102, 2898, 2302, 3274, 1990, 590, 2543, 2127, 269, 2158, 1898, 2142, 2617, 1806, 2830, 895, 3107, 2424, 3323, 654, 2317, 2595, 646, 831, 442, 839, 2546, 344, 1877, 1782, 206, 1611, 2549, 3152, 2200, 1022, 2247, 2769, 2133, 1318, 3202, 196, 2240, 2517, 509, 2046, 1217, 1162, 962, 673, 3260, 1960, 833, 2255, 2696, 2559, 2216, 1544, 672, 2335, 3137, 2870, 2134, 1478, 929, 3117, 71, 1323, 209, 885, 11, 297, 637, 918, 394, 692, 2146, 1054, 693, 1084, 2665, 397, 2290, 579, 867, 2556, 664, 1469, 2241, 1680, 279, 2432, 2276, 2922, 2817, 2906, 506, 2123, 2163, 637, 2221, 2176, 494, 583, 3173, 452, 2273, 1564, 2759, 2236, 2676, 1900, 2165, 1297, 3292, 1921, 2376, 102, 2910, 1360, 1376, 2755, 3006, 1346, 579, 301, 2897, 437, 3040, 532, 2756, 3124, 2622, 796, 2327, 2225, 2470, 1837, 21, 2810, 2394, 1202, 2418, 2068, 2669, 3009, 2605, 2708, 1689, 256, 981, 2372, 566, 121, 800, 2325, 3026, 144, 1717, 447, 3133, 482, 608, 918, 2362, 2249, 2477, 1043, 549, 2131, 1158, 2677, 1991, 2206, 91, 2383, 2315, 511, 2510, 2981, 2787, 398, 3256, 3039, 1253, 2682, 3229, 1645, 1894, 901, 200, 810, 2945, 2771, 2689, 2402, 872, 2320, 1910, 1908, 2454, 2747, 1986, 453, 1590, 361, 979, 3218, 2348, 1361, 855, 2976, 906, 2007, 2590, 2210, 2175, 1606, 1693, 987, 2643, 1760, 2347, 2341, 60, 273, 3296, 558, 1255, 1275, 1610, 2742, 660, 3157, 1586, 2457, 3022, 371, 470, 1863, 1148, 3266, 1523, 1905], [56, 2761, 2607, 2958, 1428, 73, 3236, 2181, 3088, 1588, 736, 2868, 3172, 1142, 833, 171, 1755, 2209, 1592, 190, 876, 2625, 991, 163, 1899, 2251, 1345, 1914, 2530, 2024, 1833, 1094, 2406, 2561, 1984, 1014, 1067, 2406, 353, 1217, 3007, 2788, 2864, 2042, 2472, 1902, 3295, 2420, 1327, 102, 167, 3153, 1079, 461, 3226, 554, 2561, 188, 709, 237, 1747, 2327, 2596, 771, 914, 2942, 1811, 2030, 2001, 635, 516, 1786, 3255, 2861, 723, 2557, 2285, 1591, 1883, 844, 2426, 2113, 1573, 1796, 3160, 365, 1433, 1091, 1769, 937, 244, 650, 309, 3210, 1955, 1163, 2310, 2034, 685, 1462, 1903, 1057, 1277, 883, 2106, 2582, 2792, 2110, 1969, 226, 2577, 1601, 307, 1471, 638, 2438, 1996, 146, 2879, 2799, 599, 1011, 2148, 1353, 1223, 3059, 2710, 242, 861, 1193, 1790, 40, 125, 1656, 184, 954, 2453, 957, 558, 2368, 1358, 614, 2888, 1752, 584, 1878, 1297, 1236, 2505, 805, 354, 2350, 815, 242, 2373, 881, 3055, 2177, 160, 3120, 2451, 635, 1449, 520, 3320, 1111, 28, 483, 2198, 1300, 1556, 976, 1294, 340, 2108, 1986, 1188, 2567, 1361, 2318, 42, 988, 1513, 2456, 3299, 2559, 1750, 1951, 566, 2435, 2072, 725, 2578, 3145, 1094, 1679, 1289, 3260, 2411, 3263, 2764, 1863, 800, 163, 535, 1434, 1896, 628, 905, 638, 1994, 1886, 633, 2923, 1854, 973, 3226, 1, 2995, 2480, 487, 208, 2777, 2661, 1475, 765, 2268, 1747, 2877, 3143, 2719, 400, 2759, 1817, 2237, 2715, 2308, 2123, 1163, 3184, 2705, 66, 2859, 1543, 1730, 3231, 380, 1175, 157, 1174, 3321, 1291, 2646, 268, 1462, 1694], [2401, 200, 2377, 1120, 1797, 2462, 975, 1295, 1107, 3103, 822, 2259, 478, 157, 2498, 315, 238, 373, 2218, 3326, 1328, 1479, 1224, 1117, 1824, 2327, 737, 2957, 3287, 3303, 2706, 2408, 1931, 2060, 892, 403, 1036, 3027, 2042, 570, 1233, 731, 215, 2635, 1250, 739, 1287, 109, 3125, 3246, 421, 2756, 602, 1482, 1006, 1111, 1227, 497, 1037, 1001, 3285, 3075, 1947, 1613, 882, 655, 407, 2465, 1546, 1641, 2880, 2275, 1751, 2763, 230, 1735, 1655, 1232, 207, 1521, 275, 2302, 2074, 1090, 1838, 1810, 2398, 2400, 3095, 1871, 3109, 3029, 2055, 2648, 3293, 1373, 2444, 1836, 1521, 2099, 1910, 3283, 1744, 1176, 1149, 2951, 2130, 164, 948, 2539, 2920, 2951, 1801, 84, 3229, 597, 3164, 645, 2370, 806, 2007, 2465, 2359, 2795, 2657, 573, 1119, 1978, 22, 2661, 609, 746, 1684, 2329, 1658, 2028, 132, 1510, 1913, 1867, 1774, 975, 1900, 2021, 529, 1164, 268, 1592, 57, 798, 1975, 2997, 590, 1263, 570, 1306, 552, 782, 472, 3105, 400, 580, 795, 335, 616, 1218, 1056, 2128, 885, 2161, 2594, 236, 640, 191, 3141, 215, 2020, 2870, 2042, 978, 2068, 2729, 219, 2219, 736, 2210, 222, 3225, 3071, 2663, 2110, 1827, 796, 3152, 1390, 1639, 1529, 508, 1639, 196, 3163, 599, 2540, 199, 2565, 192, 25, 614, 1343, 90, 1995, 2068, 328, 2499, 2315, 2751, 1063, 335, 1128, 1208, 1061, 2845, 272, 1685, 1659, 2745, 525, 1958, 3099, 311, 1197, 3002, 340, 3180, 2576, 2474, 622, 2704, 2922, 2248, 2015, 3049, 176, 2307, 122, 1379, 510, 149, 1777, 632, 2248, 2614, 2369, 3111, 1926, 2229]]] s: [[3328, 3328, 3328, 0, 0, 0, 1, 0, 0, 1, 3328, 1, 0, 0, 1, 0, 1, 3328, 3328, 0, 1, 3328, 1, 2, 3328, 1, 3328, 0, 1, 1, 3328, 1, 3328, 0, 2, 3328, 1, 0, 3328, 0, 1, 0, 0, 3328, 3327, 0, 1, 3328, 0, 0, 1, 1, 3328, 0, 3327, 0, 3328, 1, 0, 0, 0, 0, 3328, 0, 1, 1, 3328, 0, 3328, 3328, 0, 1, 3327, 1, 3328, 0, 1, 0, 3328, 0, 1, 3328, 3328, 2, 1, 1, 0, 3328, 0, 0, 1, 0, 3328, 0, 3328, 2, 3327, 0, 3328, 1, 3328, 3328, 0, 1, 3328, 1, 0, 3328, 0, 1, 0, 3328, 0, 3328, 1, 0, 3328, 3327, 3328, 0, 2, 1, 2, 2, 1, 3328, 3327, 0, 0, 1, 1, 3328, 0, 0, 0, 3328, 2, 0, 1, 1, 0, 3328, 0, 3328, 0, 0, 3328, 2, 2, 3328, 2, 1, 0, 0, 3328, 0, 3328, 2, 1, 1, 1, 0, 3328, 0, 0, 1, 0, 3328, 0, 0, 0, 1, 1, 3328, 1, 0, 1, 0, 3328, 3328, 3328, 3328, 0, 1, 1, 1, 0, 2, 0, 3328, 3328, 0, 0, 3328, 1, 3327, 0, 0, 1, 1, 0, 0, 0, 0, 0, 3328, 3328, 0, 3328, 0, 3327, 3328, 3328, 3328, 3328, 3328, 3328, 1, 3327, 0, 3328, 0, 0, 0, 1, 1, 3327, 0, 3327, 1, 0, 1, 2, 2, 3328, 1, 3328, 1, 0, 0, 3328, 1, 0, 1, 1, 1, 0, 0, 1, 1, 1, 1, 3328, 2, 3327, 3328], [0, 3327, 2, 3327, 0, 3327, 0, 0, 0, 1, 0, 2, 2, 0, 3327, 0, 0, 0, 0, 0, 1, 0, 2, 0, 1, 3328, 1, 1, 1, 1, 2, 3328, 3328, 3327, 1, 0, 1, 0, 1, 0, 0, 0, 0, 3328, 3328, 1, 2, 3328, 0, 0, 0, 3328, 1, 3328, 0, 0, 3328, 3328, 1, 0, 0, 3328, 0, 2, 1, 3328, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 3328, 3328, 0, 0, 0, 0, 1, 3328, 2, 3328, 2, 0, 2, 0, 3328, 1, 3327, 3327, 1, 3328, 3327, 1, 1, 2, 0, 0, 3328, 3328, 1, 0, 0, 3328, 0, 0, 3328, 3327, 3328, 3328, 0, 3328, 0, 1, 1, 1, 1, 0, 0, 0, 3327, 2, 3328, 0, 0, 3328, 0, 2, 1, 0, 0, 0, 3328, 1, 3328, 1, 1, 0, 3328, 3327, 3328, 1, 3328, 0, 0, 3328, 3328, 0, 0, 0, 3328, 1, 1, 1, 0, 1, 3328, 0, 2, 3328, 1, 1, 3328, 3327, 1, 2, 0, 0, 3327, 1, 0, 3328, 3328, 3328, 0, 2, 3328, 1, 1, 1, 1, 0, 0, 3328, 1, 0, 0, 3328, 3327, 0, 0, 0, 3327, 1, 1, 1, 0, 3328, 1, 3328, 1, 0, 1, 1, 3328, 0, 0, 0, 3328, 0, 3327, 0, 1, 3328, 0, 1, 3328, 3327, 3328, 0, 3328, 0, 1, 3327, 0, 0, 3327, 0, 3328, 0, 3328, 3328, 3328, 1, 1, 3328, 0, 1, 0, 3328, 0, 3327, 1, 1, 3328, 0, 0, 2, 0, 0, 0], [0, 1, 1, 0, 1, 0, 1, 2, 0, 3328, 0, 0, 0, 1, 3328, 3328, 0, 3328, 1, 0, 0, 1, 3328, 2, 0, 0, 0, 3327, 3328, 3328, 1, 0, 1, 3328, 0, 1, 0, 3328, 3328, 1, 1, 3327, 2, 1, 3328, 0, 3328, 3328, 1, 3328, 1, 3328, 3327, 1, 3328, 0, 1, 1, 1, 3328, 1, 1, 0, 1, 0, 3328, 0, 1, 1, 1, 0, 0, 3328, 0, 1, 3327, 3328, 0, 3328, 0, 3328, 0, 1, 3328, 3328, 2, 1, 1, 2, 3328, 3328, 0, 0, 3327, 1, 1, 3328, 0, 0, 3328, 0, 1, 3328, 1, 0, 2, 3328, 1, 1, 1, 1, 0, 3328, 3328, 3328, 2, 0, 0, 3327, 1, 1, 0, 3328, 0, 3328, 2, 1, 0, 1, 3328, 0, 1, 1, 3328, 0, 3328, 3328, 3328, 1, 0, 3328, 3327, 0, 3328, 0, 1, 1, 3328, 0, 1, 0, 3328, 0, 1, 1, 1, 0, 1, 3328, 3328, 3328, 0, 2, 0, 1, 0, 0, 1, 3328, 3328, 1, 3327, 0, 2, 3328, 1, 1, 0, 3327, 3328, 0, 1, 0, 3328, 0, 3328, 3328, 0, 0, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 3328, 0, 0, 3328, 3328, 3328, 1, 3328, 1, 3328, 2, 3327, 3327, 0, 1, 1, 0, 1, 3328, 0, 1, 3328, 0, 3328, 0, 0, 1, 1, 0, 0, 3328, 0, 1, 1, 3327, 3328, 0, 1, 1, 3328, 0, 0, 3328, 3328, 0, 3327, 1, 2, 3328, 1, 0, 3328, 3328, 1, 3328, 1, 1]] e: [[1, 3328, 0, 3327, 0, 0, 0, 3327, 1, 1, 3328, 1, 1, 0, 3328, 2, 1, 1, 2, 3328, 3328, 0, 0, 0, 3328, 3327, 0, 2, 3328, 0, 2, 0, 0, 1, 0, 3328, 0, 0, 1, 1, 0, 3328, 3328, 2, 3328, 3328, 1, 0, 1, 1, 3328, 3328, 0, 0, 3328, 1, 0, 0, 1, 1, 1, 1, 1, 0, 2, 0, 0, 1, 1, 0, 0, 1, 1, 3327, 3328, 0, 3327, 3328, 0, 0, 3328, 3328, 1, 1, 1, 3328, 0, 0, 0, 1, 3327, 0, 3328, 3327, 3328, 1, 0, 3328, 3328, 3328, 2, 1, 1, 3327, 3328, 3328, 3328, 3328, 0, 0, 3328, 3328, 3328, 3328, 0, 3328, 2, 3327, 1, 0, 0, 0, 0, 0, 3328, 2, 0, 1, 1, 3328, 3328, 2, 0, 3328, 0, 3328, 1, 3328, 1, 3328, 1, 3328, 0, 2, 3328, 1, 1, 3327, 3328, 3328, 0, 1, 0, 3328, 1, 0, 0, 0, 0, 2, 0, 1, 0, 3327, 3328, 0, 3327, 0, 0, 3327, 0, 3327, 1, 1, 1, 0, 3328, 3328, 3328, 1, 1, 0, 1, 2, 0, 3327, 0, 3328, 1, 1, 0, 0, 0, 0, 0, 0, 3328, 0, 1, 2, 2, 0, 3328, 3328, 0, 0, 0, 3328, 0, 0, 3328, 3328, 1, 3327, 0, 0, 3327, 0, 1, 0, 1, 1, 0, 0, 0, 1, 3328, 3328, 0, 0, 1, 1, 1, 2, 3327, 2, 0, 0, 0, 0, 0, 0, 1, 3328, 1, 0, 0, 1, 1, 3328, 1, 3328, 3327, 3328, 2, 1], [1, 1, 3328, 1, 3328, 0, 3328, 3328, 1, 3328, 0, 0, 3328, 3328, 3328, 0, 0, 0, 1, 3328, 1, 1, 0, 0, 3328, 1, 3327, 1, 0, 0, 3328, 0, 0, 3328, 0, 0, 0, 1, 3328, 0, 3327, 0, 0, 3328, 3328, 0, 3328, 3328, 3328, 1, 0, 1, 3327, 0, 3328, 3328, 1, 0, 3328, 3327, 0, 0, 2, 2, 1, 0, 1, 0, 3328, 0, 2, 3328, 0, 0, 2, 3327, 3328, 1, 0, 3328, 1, 1, 0, 0, 1, 1, 0, 0, 3328, 3327, 0, 0, 0, 1, 2, 2, 1, 0, 3328, 0, 3328, 3327, 3328, 3328, 0, 1, 0, 3328, 1, 0, 0, 0, 3328, 3328, 0, 1, 3327, 3328, 0, 1, 3328, 2, 1, 0, 3328, 2, 3328, 1, 3328, 3328, 1, 1, 3328, 3328, 0, 0, 0, 1, 3328, 0, 3328, 3328, 1, 0, 0, 0, 3327, 0, 3328, 1, 0, 1, 3328, 0, 3328, 0, 1, 3328, 0, 0, 0, 0, 0, 1, 3328, 0, 0, 0, 1, 3328, 0, 3328, 3328, 0, 1, 0, 0, 3327, 3328, 3328, 3328, 1, 2, 0, 0, 0, 1, 0, 0, 0, 1, 0, 3328, 0, 1, 3328, 2, 0, 1, 1, 1, 3328, 0, 3328, 0, 0, 0, 3328, 3328, 3328, 1, 1, 3328, 3328, 2, 3327, 2, 2, 1, 0, 0, 1, 3328, 1, 1, 0, 0, 3328, 1, 0, 0, 1, 1, 0, 0, 3327, 0, 1, 1, 3328, 1, 1, 0, 0, 3328, 0, 1, 0, 0, 0, 0, 0, 3328, 1, 0, 0], [3328, 1, 0, 3328, 0, 3328, 3328, 0, 0, 0, 1, 0, 3328, 3328, 1, 0, 3328, 1, 0, 1, 0, 0, 3328, 0, 3328, 0, 3328, 3327, 3328, 3328, 0, 3328, 1, 3328, 3327, 1, 0, 0, 3328, 3328, 0, 0, 0, 1, 0, 0, 1, 3328, 3327, 1, 2, 0, 0, 3328, 0, 3328, 3328, 0, 3328, 1, 0, 1, 3328, 0, 3328, 1, 3328, 1, 3328, 1, 0, 0, 0, 0, 3328, 1, 0, 3328, 1, 3328, 3328, 0, 0, 1, 0, 1, 3328, 0, 3328, 0, 1, 0, 2, 0, 2, 2, 2, 1, 0, 1, 0, 0, 1, 3328, 0, 0, 0, 0, 3328, 3327, 1, 3328, 0, 3328, 3328, 3327, 3328, 0, 0, 0, 1, 3327, 0, 2, 1, 0, 3327, 0, 3327, 3328, 0, 3327, 3328, 3328, 0, 0, 3328, 0, 1, 0, 0, 3328, 3327, 3328, 0, 0, 0, 3328, 2, 0, 3328, 1, 0, 1, 0, 0, 3328, 3327, 3328, 3328, 1, 0, 0, 0, 0, 1, 2, 0, 1, 0, 1, 3328, 0, 3328, 1, 3328, 3328, 3328, 0, 1, 1, 0, 1, 2, 0, 2, 3327, 3328, 3328, 1, 3328, 1, 3328, 0, 3328, 3328, 0, 3328, 3328, 2, 0, 1, 1, 3328, 0, 0, 0, 0, 0, 1, 0, 0, 1, 3328, 0, 3327, 3327, 0, 1, 2, 3328, 0, 0, 3327, 0, 3327, 1, 0, 0, 2, 1, 1, 3328, 1, 0, 0, 0, 0, 1, 3328, 0, 0, 0, 0, 0, 3328, 3328, 3328, 1, 0, 1, 0, 3328, 0, 2, 0]] sHat: [[1817, 1197, 2005, 676, 2955, 2722, 1490, 1658, 2306, 2876, 437, 229, 755, 1161, 1624, 464, 2391, 223, 473, 2570, 3103, 766, 1367, 428, 2184, 88, 2868, 1553, 380, 1365, 2361, 1909, 848, 1480, 1854, 2573, 51, 923, 1239, 2322, 3123, 1490, 1780, 2490, 621, 1567, 1905, 1960, 1489, 174, 453, 0, 1982, 644, 1656, 2134, 2778, 1847, 1182, 1016, 1264, 1437, 1826, 653, 286, 210, 606, 2968, 1348, 758, 584, 3318, 2483, 45, 222, 2806, 464, 1610, 2887, 609, 2580, 468, 2170, 147, 869, 144, 345, 1889, 2606, 1947, 1122, 1308, 1309, 2576, 552, 1935, 2846, 988, 2847, 2837, 548, 884, 2657, 2977, 1209, 2450, 2591, 632, 562, 1806, 1330, 1939, 288, 2431, 2503, 726, 2400, 1098, 580, 599, 1164, 1403, 1985, 443, 2423, 1353, 873, 2719, 866, 2751, 2470, 2406, 3092, 3279, 1258, 487, 1569, 12, 1476, 1971, 3007, 1114, 1833, 3122, 468, 3060, 1934, 797, 1874, 1487, 1288, 1039, 1761, 2760, 970, 611, 756, 3202, 2123, 2265, 1655, 430, 2278, 1425, 1487, 1048, 760, 153, 2276, 777, 1344, 1564, 1142, 2053, 648, 2917, 2121, 2459, 2467, 2793, 2242, 3004, 1448, 1066, 1523, 2740, 498, 1016, 2405, 2686, 913, 717, 1986, 1549, 2854, 2271, 1036, 2921, 2135, 2468, 2235, 2004, 676, 3082, 1763, 2264, 1084, 2047, 2844, 763, 3239, 1337, 1743, 623, 1863, 3079, 1947, 1985, 401, 1347, 644, 2877, 3083, 2592, 1311, 2773, 3282, 1395, 481, 457, 2111, 1712, 714, 381, 2200, 1764, 2996, 1991, 1880, 1845, 129, 2556, 594, 1413, 2861, 625, 1447, 2957, 224, 3302, 120, 2498, 3016, 2786, 1613, 106], [3200, 2256, 1713, 2290, 634, 2941, 1171, 1274, 308, 710, 974, 458, 2023, 2413, 2726, 613, 1681, 349, 512, 1526, 1923, 3054, 1879, 2016, 489, 2956, 2753, 2588, 3127, 1212, 869, 775, 2444, 1633, 1163, 2818, 1566, 1689, 2819, 3018, 2999, 1657, 2750, 992, 1342, 2208, 429, 2202, 2745, 2062, 2613, 3113, 3183, 1476, 851, 1527, 3300, 863, 804, 887, 3190, 3232, 2357, 2946, 1746, 2998, 2156, 20, 1030, 3285, 2748, 997, 1943, 1317, 1350, 2743, 964, 305, 524, 1804, 2079, 2354, 2878, 2954, 2873, 210, 1389, 2496, 2812, 771, 3122, 1270, 460, 184, 1079, 1866, 3212, 1329, 2706, 1176, 1043, 2238, 1560, 2422, 3094, 818, 3071, 111, 477, 1557, 968, 2518, 1457, 3177, 1226, 2086, 2971, 930, 3118, 2404, 1667, 1755, 3063, 415, 9, 1257, 512, 208, 954, 1249, 258, 1674, 2775, 3078, 2934, 1915, 3284, 2125, 1174, 3003, 1255, 1691, 523, 2490, 2402, 426, 702, 3047, 1011, 2626, 2380, 56, 740, 2920, 2317, 2985, 353, 3005, 3279, 2969, 1383, 835, 1729, 1149, 870, 1858, 3310, 1986, 95, 2064, 442, 1181, 756, 100, 1649, 2119, 1241, 1719, 2080, 1588, 1850, 2671, 2188, 1622, 2555, 53, 2136, 3325, 1154, 1409, 2870, 201, 2865, 1438, 1404, 3055, 2936, 1166, 14, 1258, 2613, 3279, 824, 1824, 200, 2572, 589, 1902, 1969, 538, 1313, 2414, 715, 1515, 1015, 1701, 211, 1048, 2180, 1978, 1503, 2683, 1641, 177, 251, 3243, 1596, 115, 1424, 1390, 1835, 2283, 254, 1680, 1223, 2103, 1453, 3235, 1986, 3171, 1821, 2222, 1149, 1787, 1993, 289, 332, 1882, 2832, 2013, 2210, 2193, 1039, 2276, 502, 2147], [275, 3226, 636, 2281, 2859, 1703, 340, 1974, 1740, 3291, 2290, 2791, 2900, 1378, 2989, 2903, 2284, 3149, 1642, 3142, 2554, 1280, 462, 852, 2092, 1403, 2321, 72, 600, 2463, 191, 2980, 623, 3087, 2161, 1571, 2854, 1528, 1032, 2446, 69, 2379, 2371, 1961, 2738, 1577, 3079, 211, 2200, 3073, 1568, 2001, 2375, 564, 1308, 2528, 2159, 1012, 2199, 374, 3273, 512, 2473, 892, 3079, 729, 843, 222, 1193, 2711, 2942, 3156, 2366, 1709, 1621, 2545, 842, 2610, 1258, 3026, 398, 2944, 3066, 2398, 1492, 1022, 3327, 2926, 520, 3120, 1160, 250, 70, 1350, 2827, 497, 1665, 3223, 2945, 2849, 2154, 966, 2471, 1384, 2378, 1026, 3068, 718, 2534, 682, 1054, 1518, 996, 396, 2391, 2972, 1464, 1707, 2425, 1453, 2886, 924, 314, 2595, 2931, 2807, 3306, 2070, 2566, 1654, 1067, 3091, 2314, 2202, 2391, 380, 1894, 779, 2563, 1382, 217, 2724, 3150, 2939, 88, 2107, 593, 3150, 2557, 1105, 827, 2671, 2601, 2450, 1853, 3190, 2028, 764, 1858, 2095, 3049, 2734, 2842, 952, 1551, 1957, 1203, 537, 1782, 1962, 1131, 264, 1277, 2681, 801, 1629, 1009, 2534, 2717, 3069, 1744, 3306, 1562, 84, 3005, 450, 1947, 1977, 2769, 814, 902, 1671, 1750, 926, 2512, 2753, 2064, 1329, 1468, 961, 2182, 1327, 3200, 1903, 571, 1274, 2741, 663, 364, 731, 50, 2222, 3251, 1362, 2589, 1109, 676, 2298, 3226, 653, 759, 2314, 1294, 2626, 267, 2309, 2738, 2834, 2973, 591, 623, 2852, 1871, 3273, 169, 2491, 746, 1133, 993, 1271, 1604, 1910, 2995, 1880, 1826, 2059, 3186, 279, 116, 3220, 241, 586, 3154, 320, 2330, 3286]] eHat: [[1982, 1061, 127, 1369, 2445, 716, 350, 1511, 1239, 1299, 3046, 526, 3296, 795, 2588, 640, 261, 1048, 2063, 543, 2956, 469, 2187, 2087, 2540, 919, 950, 763, 1865, 248, 2449, 552, 698, 2932, 3027, 848, 830, 2408, 2447, 1113, 3112, 1661, 2414, 1875, 3276, 2741, 2414, 774, 1121, 2867, 197, 76, 340, 1177, 1060, 2528, 1326, 2092, 169, 1024, 2774, 122, 1810, 2397, 1939, 3147, 1929, 3255, 421, 574, 1204, 3197, 170, 930, 340, 1978, 581, 1664, 2689, 112, 1670, 1082, 2171, 540, 413, 1836, 91, 2592, 2611, 2021, 1357, 1035, 1626, 860, 2475, 2502, 212, 735, 1018, 2212, 2893, 2802, 2850, 2223, 1529, 1146, 2615, 125, 2885, 2587, 1278, 1440, 14, 2962, 1450, 354, 2192, 791, 3201, 3066, 2632, 2983, 1777, 2447, 367, 2915, 1432, 1713, 2399, 2086, 379, 53, 512, 2100, 2199, 1885, 2933, 2750, 2066, 464, 34, 253, 1169, 2809, 2372, 590, 1821, 2757, 2114, 2355, 1181, 1888, 1332, 1960, 2666, 3072, 2630, 3252, 1858, 1930, 1088, 870, 2917, 1813, 2629, 2049, 1642, 1887, 661, 23, 1917, 3123, 1094, 735, 2733, 2529, 576, 423, 260, 387, 958, 2056, 440, 3268, 756, 2311, 766, 2878, 1595, 2302, 975, 1767, 1616, 3088, 2910, 732, 1635, 1755, 1548, 295, 2027, 2419, 2145, 1311, 1045, 2412, 659, 2082, 2385, 1614, 2583, 1164, 3006, 2693, 916, 2770, 1102, 2121, 2946, 109, 1861, 2020, 1841, 608, 39, 85, 1524, 1452, 167, 881, 90, 2323, 94, 372, 1544, 883, 2020, 2214, 760, 2742, 2221, 2077, 869, 1184, 2004, 3187, 2571, 1985, 2718, 1865, 2310, 3292, 1058, 3173, 249, 388], [121, 1331, 2061, 3202, 1885, 2068, 1746, 1667, 470, 1010, 1738, 3270, 354, 502, 3017, 3269, 268, 2680, 2015, 913, 1987, 228, 2231, 2319, 2877, 771, 527, 2743, 355, 287, 3250, 361, 3208, 1414, 2325, 1499, 353, 1438, 1956, 2707, 2180, 2792, 35, 2477, 1512, 2800, 2824, 1233, 500, 498, 704, 929, 2592, 2625, 1928, 1044, 2506, 1923, 2014, 2634, 48, 234, 2260, 1693, 627, 1461, 360, 1243, 2092, 1817, 1128, 1871, 2281, 2383, 1537, 943, 2848, 1096, 1949, 3299, 2784, 737, 2085, 2530, 2688, 3236, 912, 3246, 803, 3057, 460, 882, 2519, 1471, 2039, 2909, 960, 1741, 91, 1561, 2559, 3044, 1578, 3259, 3291, 2221, 3146, 975, 1561, 109, 572, 3092, 2099, 2646, 1138, 1020, 2087, 379, 2369, 361, 787, 791, 2459, 271, 470, 2309, 1667, 1930, 224, 532, 1145, 206, 3295, 828, 2180, 2473, 1454, 261, 2642, 359, 2419, 3327, 2028, 3045, 1053, 1876, 3083, 827, 1102, 116, 1185, 2527, 3221, 1232, 3120, 1201, 490, 3256, 1494, 1894, 999, 2336, 1494, 2894, 63, 1185, 1116, 301, 2783, 1031, 2383, 2973, 2463, 2371, 2446, 1812, 562, 1015, 104, 1594, 2341, 1821, 1101, 2749, 91, 2057, 1050, 2610, 1522, 623, 763, 699, 1546, 3181, 811, 728, 2816, 2123, 2725, 647, 3024, 283, 799, 970, 75, 174, 3096, 277, 549, 1202, 423, 429, 2906, 1965, 2218, 2599, 1539, 2288, 1802, 1118, 1315, 2111, 3096, 675, 1679, 3300, 29, 2835, 1177, 812, 965, 1243, 1650, 2370, 1938, 1853, 1763, 2257, 3299, 2849, 1348, 2504, 3160, 1175, 2906, 3224, 1901, 137, 1249, 2251, 3173, 1525, 2754, 1115, 1573, 1811], [1002, 3149, 2353, 1914, 1865, 1014, 1066, 1038, 1534, 2250, 1870, 2632, 976, 942, 399, 851, 370, 1962, 2930, 810, 3093, 734, 1355, 645, 1324, 777, 2584, 2503, 445, 1466, 564, 1824, 3234, 2682, 237, 212, 399, 797, 3099, 1364, 240, 1515, 1299, 1179, 950, 567, 694, 765, 1781, 2354, 121, 2522, 758, 242, 1892, 159, 737, 3036, 978, 984, 337, 438, 576, 582, 2043, 2584, 474, 1810, 2794, 117, 3150, 277, 866, 3116, 1647, 635, 3072, 1436, 2613, 2882, 974, 1070, 2912, 2123, 2672, 2929, 1981, 3045, 2296, 973, 456, 2578, 1042, 2161, 175, 2079, 228, 2500, 2740, 107, 692, 1508, 3202, 1342, 2642, 545, 1077, 2897, 2809, 1760, 939, 2155, 918, 2775, 3090, 2663, 2376, 451, 657, 1271, 305, 1693, 2221, 1765, 2845, 2778, 1238, 2530, 1261, 1576, 1310, 1608, 1168, 2028, 1120, 2735, 1824, 3052, 186, 161, 3325, 3266, 992, 1258, 2176, 1923, 2130, 1897, 1704, 239, 2763, 637, 2615, 2997, 777, 2641, 1504, 1643, 1953, 3136, 2427, 1016, 1096, 1621, 688, 849, 275, 589, 1405, 1842, 2629, 3041, 2801, 3189, 69, 2086, 2833, 2248, 3152, 2430, 1857, 1178, 969, 322, 1635, 523, 113, 25, 576, 2295, 3314, 29, 1380, 1592, 757, 545, 1521, 178, 919, 369, 2620, 2122, 2546, 1374, 2340, 2878, 1186, 56, 2160, 2170, 567, 942, 2169, 2846, 278, 2049, 3184, 2046, 3071, 2942, 2542, 890, 2961, 514, 3104, 2610, 1828, 2052, 2219, 2649, 1775, 971, 1367, 1414, 199, 910, 3181, 2399, 1183, 998, 1614, 127, 639, 220, 1109, 890, 2120, 394, 2253, 2882, 3193, 2712, 1107, 1739, 1652, 173]] aHat * sHat: [[3093, 1417, 646, 3149, 1510, 2439, 1683, 132, 1554, 208, 3069, 3249, 2119, 755, 1928, 3109, 2265, 2771, 204, 168, 2592, 2183, 1606, 506, 1584, 1269, 305, 1396, 167, 2211, 3232, 2239, 1925, 2382, 947, 1165, 1489, 1453, 2294, 1204, 1339, 2357, 2057, 2344, 2409, 806, 231, 1616, 1147, 1442, 275, 3319, 1945, 2060, 2546, 599, 104, 3325, 208, 53, 887, 3219, 2569, 813, 2945, 664, 2247, 115, 745, 2707, 596, 1811, 1018, 3188, 2488, 1370, 199, 1272, 1741, 2528, 757, 833, 56, 2481, 2390, 846, 305, 1435, 838, 1579, 2445, 3131, 1080, 652, 2483, 67, 853, 332, 1194, 3294, 3255, 1191, 929, 1665, 183, 1729, 1401, 292, 2982, 3304, 2904, 1589, 3043, 1916, 1488, 29, 3185, 746, 2351, 824, 885, 1337, 2755, 1933, 1387, 1343, 3217, 2188, 582, 2378, 1262, 1013, 564, 918, 1595, 149, 1406, 2041, 3016, 1591, 989, 2012, 2604, 759, 1618, 2117, 906, 2037, 453, 176, 2801, 1740, 2314, 1611, 1349, 267, 1905, 2179, 1613, 1519, 1759, 1724, 3056, 1397, 1868, 3050, 1470, 2288, 3225, 2050, 1711, 1630, 2539, 888, 3282, 1735, 778, 2832, 313, 1554, 1296, 2305, 930, 2841, 3257, 1109, 3105, 1187, 1701, 188, 3313, 2296, 671, 1882, 1313, 417, 1354, 2498, 2597, 2952, 1766, 1825, 1211, 1160, 2618, 538, 2378, 2259, 1383, 1286, 935, 1898, 371, 976, 602, 1686, 1876, 2636, 360, 2480, 3315, 1609, 2592, 1223, 1604, 2066, 3321, 2314, 468, 843, 611, 1257, 2149, 483, 2605, 379, 1790, 809, 1139, 1, 2717, 2894, 787, 1236, 131, 3269, 2491, 114, 615, 748, 1525, 78, 2872, 915, 3143, 1380], [1013, 1640, 3112, 1717, 1698, 283, 2650, 1257, 1813, 2930, 2278, 1322, 1355, 2822, 2214, 2048, 1058, 2121, 796, 1398, 1250, 3202, 1818, 284, 953, 766, 1114, 1784, 3065, 1638, 2063, 1612, 2113, 904, 2810, 2288, 2771, 1924, 2826, 1878, 1314, 963, 1743, 942, 2020, 2195, 1742, 2994, 2777, 1051, 1520, 1154, 1453, 1936, 2444, 476, 2402, 903, 3095, 90, 1397, 1935, 1421, 249, 1234, 2367, 2927, 2734, 2937, 87, 830, 2224, 616, 148, 261, 1767, 1691, 39, 804, 2393, 2620, 2986, 2064, 1937, 1299, 2695, 34, 1886, 2813, 3203, 1283, 1106, 1194, 976, 1563, 87, 901, 618, 134, 234, 1939, 2521, 2864, 1671, 144, 1081, 209, 2693, 298, 2410, 320, 1296, 3195, 3100, 2853, 2128, 281, 2146, 2233, 84, 63, 3160, 2955, 411, 975, 2971, 2343, 1584, 2591, 1879, 726, 12, 2516, 2377, 3291, 733, 2150, 1715, 2498, 2701, 1191, 1242, 441, 1162, 557, 2561, 732, 1511, 239, 1365, 1408, 2163, 1599, 1973, 2791, 2205, 2185, 2681, 590, 2939, 1915, 2291, 2049, 2916, 1546, 670, 2386, 3265, 2403, 333, 1658, 1540, 2562, 2223, 2199, 3266, 1211, 3299, 1017, 2632, 561, 2784, 675, 2601, 3289, 3114, 2035, 457, 32, 1152, 2609, 2156, 2807, 2809, 435, 3219, 1813, 1441, 338, 3020, 672, 890, 989, 8, 140, 752, 2990, 720, 196, 806, 2898, 949, 1540, 1189, 436, 2794, 963, 2165, 2700, 117, 625, 2378, 2968, 1880, 1511, 255, 2956, 93, 1163, 1132, 2366, 2198, 2052, 1877, 1464, 2186, 101, 3292, 178, 2132, 3145, 955, 790, 572, 1568, 1055, 1603, 734, 2021, 3100, 2718, 1265, 1340, 943, 1878, 1219], [1429, 496, 562, 1458, 2796, 1300, 1646, 1526, 2068, 1558, 3059, 2779, 2633, 476, 1524, 2020, 1637, 1805, 2842, 1119, 2693, 2211, 803, 57, 1772, 3110, 3005, 1000, 1378, 664, 1545, 552, 1144, 2196, 1777, 1179, 747, 589, 2655, 1778, 1856, 1609, 3097, 397, 1523, 341, 184, 2911, 565, 2869, 2097, 1774, 2023, 1999, 499, 2763, 1498, 1186, 718, 2921, 2660, 770, 2403, 2343, 64, 1268, 2356, 1397, 927, 2931, 2672, 325, 2651, 863, 2164, 2094, 797, 3223, 872, 1724, 1474, 2467, 1568, 1469, 1309, 18, 1093, 622, 3226, 1103, 543, 821, 2513, 3236, 481, 1504, 1061, 2103, 1807, 408, 46, 2051, 2076, 1274, 3263, 1831, 1737, 2270, 220, 282, 1572, 3009, 848, 991, 3081, 769, 231, 1214, 3230, 2218, 1393, 2281, 1638, 646, 55, 2878, 3235, 752, 1995, 3169, 1293, 61, 768, 3270, 2151, 2914, 1420, 2751, 2308, 1, 3311, 897, 3016, 2949, 2570, 1330, 499, 2270, 427, 2503, 3097, 3135, 528, 1115, 167, 1618, 1065, 304, 1883, 754, 2320, 2453, 644, 1978, 1509, 510, 431, 2807, 2860, 3212, 695, 2050, 2325, 822, 1200, 2445, 775, 1621, 178, 1233, 16, 2380, 2537, 1055, 3100, 3038, 8, 3316, 468, 2076, 525, 1511, 3231, 2848, 1793, 3010, 3221, 258, 3306, 817, 2393, 998, 927, 1933, 3200, 1279, 1979, 1724, 1302, 731, 1805, 3231, 1478, 136, 774, 151, 354, 2206, 2713, 742, 2717, 149, 788, 2310, 1238, 1611, 1538, 1183, 2396, 819, 509, 3268, 852, 1633, 1306, 1520, 573, 2205, 1995, 968, 2030, 2606, 2831, 2757, 1901, 1545, 1211, 319, 264, 3185, 1526, 1864, 2657, 1783, 135, 312]] tHat = aHat * sHat + eHat: [[1746, 2478, 773, 1189, 626, 3155, 2033, 1643, 2793, 1507, 2786, 446, 2086, 1550, 1187, 420, 2526, 490, 2267, 711, 2219, 2652, 464, 2593, 795, 2188, 1255, 2159, 2032, 2459, 2352, 2791, 2623, 1985, 645, 2013, 2319, 532, 1412, 2317, 1122, 689, 1142, 890, 2356, 218, 2645, 2390, 2268, 980, 472, 66, 2285, 3237, 277, 3127, 1430, 2088, 377, 1077, 332, 12, 1050, 3210, 1555, 482, 847, 41, 1166, 3281, 1800, 1679, 1188, 789, 2828, 19, 780, 2936, 1101, 2640, 2427, 1915, 2227, 3021, 2803, 2682, 396, 698, 120, 271, 473, 837, 2706, 1512, 1629, 2569, 1065, 1067, 2212, 2177, 2819, 664, 450, 559, 1712, 2875, 687, 417, 2538, 2562, 853, 3029, 3057, 1549, 2938, 383, 2048, 1537, 2223, 561, 188, 991, 1203, 1051, 1754, 929, 1320, 572, 2981, 1135, 1641, 1066, 1076, 3018, 465, 2034, 1010, 1462, 1753, 2055, 1023, 2265, 444, 239, 661, 2707, 2727, 1465, 2567, 2531, 653, 299, 317, 242, 686, 10, 1206, 2102, 142, 120, 2847, 2594, 2644, 3210, 1168, 1770, 3112, 846, 557, 2073, 299, 1424, 304, 1623, 2686, 935, 1354, 3255, 573, 1941, 2254, 1032, 1370, 2780, 684, 91, 542, 736, 3296, 2490, 959, 734, 2287, 1641, 894, 1149, 2989, 924, 816, 3247, 464, 915, 27, 2471, 334, 2950, 3037, 1012, 439, 2900, 189, 3062, 48, 340, 1518, 1127, 2978, 1428, 3306, 2589, 1847, 300, 1104, 1831, 1643, 2151, 1516, 437, 635, 1724, 701, 251, 2243, 855, 820, 1262, 481, 3023, 1899, 2743, 1609, 1642, 1656, 2420, 2135, 3127, 1733, 2099, 4, 2613, 506, 41, 601, 759, 63, 1768], [1134, 2971, 1844, 1590, 254, 2351, 1067, 2924, 2283, 611, 687, 1263, 1709, 3324, 1902, 1988, 1326, 1472, 2811, 2311, 3237, 101, 720, 2603, 501, 1537, 1641, 1198, 91, 1925, 1984, 1973, 1992, 2318, 1806, 458, 3124, 33, 1453, 1256, 165, 426, 1778, 90, 203, 1666, 1237, 898, 3277, 1549, 2224, 2083, 716, 1232, 1043, 1520, 1579, 2826, 1780, 2724, 1445, 2169, 352, 1942, 1861, 499, 3287, 648, 1700, 1904, 1958, 766, 2897, 2531, 1798, 2710, 1210, 1135, 2753, 2363, 2075, 394, 820, 1138, 658, 2602, 946, 1803, 287, 2931, 1743, 1988, 384, 2447, 273, 2996, 1861, 2359, 225, 1795, 1169, 2236, 1113, 1601, 106, 3302, 26, 339, 1859, 2519, 892, 1059, 1965, 2417, 662, 3148, 2368, 2525, 1273, 445, 850, 622, 2085, 682, 1445, 1951, 681, 185, 2815, 2411, 1871, 218, 2482, 3205, 2142, 3206, 275, 1976, 1811, 3060, 281, 1240, 2469, 878, 1610, 1108, 486, 2338, 1341, 1481, 2593, 1361, 1491, 3205, 2582, 77, 2675, 2608, 2084, 1504, 2914, 1298, 214, 2481, 1609, 1855, 173, 237, 1857, 1364, 712, 1184, 1696, 1265, 1316, 1749, 1773, 985, 1121, 897, 2902, 1276, 1776, 2021, 51, 1842, 3085, 3067, 1554, 1775, 43, 2855, 1024, 2661, 1246, 618, 1300, 235, 3063, 338, 367, 1173, 1788, 978, 215, 926, 2757, 997, 745, 2008, 3321, 1378, 1117, 3154, 2654, 2064, 2502, 1124, 1173, 1235, 1940, 1160, 2735, 2555, 3190, 226, 2985, 2928, 2340, 1944, 2, 112, 373, 918, 73, 710, 1864, 2220, 148, 1652, 1164, 130, 621, 1747, 1145, 950, 175, 871, 3270, 2022, 2562, 2790, 765, 2058, 122, 3030], [2431, 316, 2915, 43, 1332, 2314, 2712, 2564, 273, 479, 1600, 2082, 280, 1418, 1923, 2871, 2007, 438, 2443, 1929, 2457, 2945, 2158, 702, 3096, 558, 2260, 174, 1823, 2130, 2109, 2376, 1049, 1549, 2014, 1391, 1146, 1386, 2425, 3142, 2096, 3124, 1067, 1576, 2473, 908, 878, 347, 2346, 1894, 2218, 967, 2781, 2241, 2391, 2922, 2235, 893, 1696, 576, 2997, 1208, 2979, 2925, 2107, 523, 2830, 3207, 392, 3048, 2493, 602, 188, 650, 482, 2729, 540, 1330, 156, 1277, 2448, 208, 1151, 263, 652, 2947, 3074, 338, 2193, 2076, 999, 70, 226, 2068, 656, 254, 1289, 1274, 1218, 515, 738, 230, 1949, 2616, 2576, 2376, 2814, 1838, 3029, 2042, 2511, 1835, 1766, 437, 2842, 103, 2607, 1665, 558, 160, 1698, 645, 530, 2411, 2900, 2327, 1144, 3282, 3256, 1416, 2603, 1669, 1936, 1969, 3271, 2320, 3244, 2474, 2494, 162, 3307, 834, 679, 878, 1417, 3253, 2629, 838, 2131, 2742, 2531, 443, 3143, 783, 944, 930, 2569, 1947, 507, 561, 1418, 140, 1740, 270, 2197, 1359, 706, 67, 936, 1725, 3324, 1762, 1797, 682, 1269, 1202, 279, 540, 1, 334, 1873, 229, 177, 1377, 1406, 232, 121, 12, 1044, 1042, 510, 1540, 1282, 1111, 2550, 226, 1413, 436, 896, 1186, 1684, 3120, 144, 3307, 2211, 828, 3165, 1780, 133, 2901, 2372, 844, 318, 2982, 1052, 2200, 209, 923, 2455, 355, 1930, 1039, 420, 2824, 1013, 892, 37, 3235, 1286, 139, 2284, 910, 2219, 3047, 1505, 2430, 425, 1275, 3178, 1966, 315, 2733, 141, 2977, 3010, 2435, 2, 713, 2517, 2738, 1390, 1247, 435, 193, 1787, 485]] ek: D2E69A05534A7232C5F1B766E93A5EE2EA1B26E860A3441ADEA91EDB782CABC8A5D011A21BC388E7F486F0B7993079AE3F1A7C85D27D0F492184D59062142B76A43734A90D556A95DC483DD82104ED58CA1571C39685827951434CC1001AA4C813261E4F93028E14CD08F768A454310C3B010C83B74D04A57BB977B3D8BCF3AAA78CA12B78F010D95134928A5E5D96A029B442A41888038B29C2F122B0B6B3AF121AEA29A05553BDF1DB607AFB17001860AF1823BCF03DB3B441DA163A28C523A5FB4669A64234A4BCD1217FF2635BD97680FF938DBCF10E9532A9A79A5B073A9E8DB2123D210FAEA200B664838E80071F2BA254AAC890A46E28EC342D92812B01593071657E7A3A4A75CB3D5279CE88405AC5ADACB2051E022EE0AC9BBFE32DEF98667ED347ADCB3930F3CAD031391B709A4E61B8DD4B3FB741B5BD60BF304015EE7546A24B59EADCA137C7125074726B7686EC551B7BC26BBDB20FC3783534E34EE1F1BC6B77AB49A6667846975778C3C536830450A3FA910259722F3F806E6EB4B9346763FEF0922BC4B6EB3826AFF24EADC6CF6E477C2E055CFB7A90A55C06D0B2A2F5116069E64A5B5078C0577BC8E7900EA71C341C02AD854EA5A01AF2A605CB2068D52438CDDC60B03882CC024D13045F2BA6B0F446AAA5958760617945371FD78C28A40677A6E72F513B9E0667A9BAF446C1BA931BA81834234792A2A2B2B3701F31B7CF467C80F1981141BB457793E1307091C48B5914646A60CE1A301543779D7C3342AD179796C2C440D99DF9D41B52E32625A82AA5F579A9920BFFBA964FA70DB259C85E68C813817B1347BF19814DA5E9364A4645E621923D955C211A55D355C816DA04730AA324085E622B51D6109B49F673ADD00E414755C8024AA0164F24556DED963D61143856CB4FF0567E3320730DBCBF12F66E2B70B20054A6DEA42614B50EF72B156F5149FC263DD7E039C55A3EE9827DF92C565D24C55E0A81C6494695344D948748AFBA9F762C0EA90BB724897902000775613949602C48C78A9440678C24086D326D79643BAF7036C66C7E026AAEFDA2807A60BD7FC91363BB0234A590984AA011F11D40268218A1588377B3D7671B8B99789919B86EE82B18EC22D4E80A1F27853D889419D460DEF7567AA4567969C43048C32B8462A9C9386EB3152A6976AA783CDD1A8C57A9B6BBD837A00624B58B4BA3DBB63BB8200E7BC88881BEBDA925BCA028E291AA1C22539CD04F90090D7F74108C32B8022C1591C881E76304E2408190E20F09A54FC23420E2620E9D87A3108A94FEEA72D5AB7FCFB972E6561B1A7B062F1A682E020AA2562812B296547B917824CDB88C582B5A6890177BC70C91ACAC9ABE290AEB2C34A7E2368955CB456A345368ABE3B91B47FC30B0233A09BA79FB11238AC508CCE61095F854C23204A8D36BFC2C6E05A72AF5244B17C12101E01451570EB110567E850E79C000142441FE4160027545F6290E85451B80234A9406C390B0CEA3C8335D4C6F8550B544C9343E61BA1C8489D1B0399739168AF740A481B0F5C3372530CA06B508ECE838AB78BEE1E597A9B14F6AEC7A3BD1AA8D10BAC23B9802902CD529AB6EF54DB3110CFB561E7E6948E65281250416C349C8100B3B4D3D0F62ACAD8D161175B134F7564937CD dk: 19D74AD5472A8B2BAAD2A56702C9B3B5510EF3924858061D57F90DD9A1A01FEC2F57C51A888805341B617C515539597750835C3ED7A033B039D72491332C5DF4A69B6DF26171877AD1E50AC50100BE4728786685DA7A739E843FF0D45922D7281E210D5E82B944652F4862CFB3D902DE60AFD0A164471B26144A1D7A38096503095911762EBA7962C4511D05A128F2781ECB3D1F5BB1244237611ABAB924991F8A2732E27032357920F197C7692D60A9444472258CB457C1B71B77995469F3A962F3ABA6699614FCCCEA741E21C600C4357BBFAB452927C3D441BF8ED73152F75C08F540E186ACCA3326F422C84B988D77E61AE61859CF8541F89209E4983040C5617654808852B649B899A399AEC2C8BBA8A542F345ABF2813F65E9A791D32CC2D76026FB8D0C94B657489ABB487DA4A2C0E3868D3CF47F1CBB2FA79C53CFF6264777C09B177C91315484D2B30B0CA21F55ADD23C57E1911C3F086BCAD21798486EB47B7C58577381C09F5252582D1B27A7D5B8E060CE78209CC82BAE4DA606800C8DB1268F7AD2B793A44F34612CCEA31CE7D796A65A2691D61500625F83E7BE57077EE9C1B8C1CAA137CC4B6573308C19668B24B01E966903ABBCB79B67BE0A3E3E058AADA189B9EA80359AC26F4C5C53735FE4FC35247337760CCA3529B8D266BB6C48010654CDBC5A3E9757524675ABC413130CC2701F28933EABB8392B0D6D059CFC3A30326C4FCC810B37A4748C1C53928A4913E48B186697162C33FFFB06DD5161C8639DB195C6CA64829B2B3A2E4C9683B66DF7FB1909904E00020DBA134E02A168D76AC076BB77D4DC8496B4BBE7B4690BA29B62A91ABE72BEF323A44C8903E482B60D99BA61D1BBCF9CB9673534C1D647662374EE2C7C5F0081BAD149F44206717684D9746B2048633AF7A68C6865FB590358D8CF821458369B0C31EB597CF5BE78EB480EA04E35FACC380372C8C0A04DE276B1A72121E596CBB25EF7536AD3804184A87BDFB5A769160BFBB0CA3C360790E5562BB78EFE0069C77483AD35CAC237C61DE78A7DB46FC917124CA17510DB7DA218890F448EF6318613A1C97C928E2B7B6A54617BCCB6CDF278AE542B56AD7BB5ECD8C46A66C4FA0950CE41352CB85711890458F299BF40BA6FF2C0713862268B5F08E49845B09443997AB29A62073C0D9818C020167D4749231C059E6F483F976817C90C20A9C937079C2D4BE30DA974A97E4BC53ED96A55169F4A23A3EA24BD8E01B8FAEB95D4E53FFFECB60802C388A40F4660540B1B1F8176C9811BB26A683CA789564A2940FCEB2CE6A92A1EE45EE4C31857C9B9B8B56A79D95A46CB393A31A2737BAFEA6C81066A672B34C10AA98957C91766B730036A56D940AA4EBCB758B08351E2C4FD19453BF3A6292A993D67C7ECC72F42F782E9EBAA1A8B3B0F567AB39421F6A67A6B8410FD94A721D365F1639E9DDABFD0A6CE1A4605BD2B1C9B977BD1EA32867368D6E639D019AC101853BC153C86F85280FC763BA24FB57A296CB12D32E08AB32C551D5A45A4A28F9ADC28F7A2900E25A40B5190B22AB19DFB246F42B24F97CCA9B09BEAD246E1734F446677B38B7522B780727C117440C9F1A024520C141A69CDD2E69A05534A7232C5F1B766E93A5EE2EA1B26E860A3441ADEA91EDB782CABC8A5D011A21BC388E7F486F0B7993079AE3F1A7C85D27D0F492184D59062142B76A43734A90D556A95DC483DD82104ED58CA1571C39685827951434CC1001AA4C813261E4F93028E14CD08F768A454310C3B010C83B74D04A57BB977B3D8BCF3AAA78CA12B78F010D95134928A5E5D96A029B442A41888038B29C2F122B0B6B3AF121AEA29A05553BDF1DB607AFB17001860AF1823BCF03DB3B441DA163A28C523A5FB4669A64234A4BCD1217FF2635BD97680FF938DBCF10E9532A9A79A5B073A9E8DB2123D210FAEA200B664838E80071F2BA254AAC890A46E28EC342D92812B01593071657E7A3A4A75CB3D5279CE88405AC5ADACB2051E022EE0AC9BBFE32DEF98667ED347ADCB3930F3CAD031391B709A4E61B8DD4B3FB741B5BD60BF304015EE7546A24B59EADCA137C7125074726B7686EC551B7BC26BBDB20FC3783534E34EE1F1BC6B77AB49A6667846975778C3C536830450A3FA910259722F3F806E6EB4B9346763FEF0922BC4B6EB3826AFF24EADC6CF6E477C2E055CFB7A90A55C06D0B2A2F5116069E64A5B5078C0577BC8E7900EA71C341C02AD854EA5A01AF2A605CB2068D52438CDDC60B03882CC024D13045F2BA6B0F446AAA5958760617945371FD78C28A40677A6E72F513B9E0667A9BAF446C1BA931BA81834234792A2A2B2B3701F31B7CF467C80F1981141BB457793E1307091C48B5914646A60CE1A301543779D7C3342AD179796C2C440D99DF9D41B52E32625A82AA5F579A9920BFFBA964FA70DB259C85E68C813817B1347BF19814DA5E9364A4645E621923D955C211A55D355C816DA04730AA324085E622B51D6109B49F673ADD00E414755C8024AA0164F24556DED963D61143856CB4FF0567E3320730DBCBF12F66E2B70B20054A6DEA42614B50EF72B156F5149FC263DD7E039C55A3EE9827DF92C565D24C55E0A81C6494695344D948748AFBA9F762C0EA90BB724897902000775613949602C48C78A9440678C24086D326D79643BAF7036C66C7E026AAEFDA2807A60BD7FC91363BB0234A590984AA011F11D40268218A1588377B3D7671B8B99789919B86EE82B18EC22D4E80A1F27853D889419D460DEF7567AA4567969C43048C32B8462A9C9386EB3152A6976AA783CDD1A8C57A9B6BBD837A00624B58B4BA3DBB63BB8200E7BC88881BEBDA925BCA028E291AA1C22539CD04F90090D7F74108C32B8022C1591C881E76304E2408190E20F09A54FC23420E2620E9D87A3108A94FEEA72D5AB7FCFB972E6561B1A7B062F1A682E020AA2562812B296547B917824CDB88C582B5A6890177BC70C91ACAC9ABE290AEB2C34A7E2368955CB456A345368ABE3B91B47FC30B0233A09BA79FB11238AC508CCE61095F854C23204A8D36BFC2C6E05A72AF5244B17C12101E01451570EB110567E850E79C000142441FE4160027545F6290E85451B80234A9406C390B0CEA3C8335D4C6F8550B544C9343E61BA1C8489D1B0399739168AF740A481B0F5C3372530CA06B508ECE838AB78BEE1E597A9B14F6AEC7A3BD1AA8D10BAC23B9802902CD529AB6EF54DB3110CFB561E7E6948E65281250416C349C8100B3B4D3D0F62ACAD8D161175B134F7564937CDECE9E246AAD11021A67B20EB8F7765AC2823A9D18C93EC282D6DBC53CD6DF57592AC7D1F83BAFAE6EE86FE00F95D813375772434860F5FF7D54FFC37399BC4CC fips203-0.2.1/tests/nist_vectors/mod.rs000064400000000000000000000155301046102023000160270ustar 00000000000000// This file implements a variety of top-level tests, including: official vectors, random // round trips, and (soon) fails. use std::fs; use hex::decode; use rand_core::{CryptoRng, RngCore}; use regex::Regex; use fips203::traits::{Decaps, Encaps, KeyGen, SerDes}; use fips203::{ml_kem_1024, ml_kem_512, ml_kem_768}; // ----- CUSTOM RNG TO REPLAY VALUES ----- struct TestRng { data: Vec>, } impl RngCore for TestRng { fn next_u32(&mut self) -> u32 { unimplemented!() } fn next_u64(&mut self) -> u64 { unimplemented!() } fn fill_bytes(&mut self, out: &mut [u8]) { let x = self.data.pop().expect("test rng problem"); out.copy_from_slice(&x) } fn try_fill_bytes(&mut self, out: &mut [u8]) -> Result<(), rand_core::Error> { self.fill_bytes(out); Ok(()) } } impl CryptoRng for TestRng {} impl TestRng { fn new() -> Self { TestRng { data: Vec::new() } } fn push(&mut self, new_data: &[u8]) { let x = new_data.to_vec(); self.data.push(x); } } // ----- EXTRACT I/O VALUES FROM OFFICIAL VECTORS ----- fn get_keygen_vec(filename: &str) -> (Vec, Vec, Vec, Vec) { let data = fs::read_to_string(filename).expect("Unable to read file"); let z_regex = Regex::new(r"z: ([0-9a-fA-F]+)").unwrap(); let z = decode(z_regex.captures(&data).unwrap().get(1).unwrap().as_str()).unwrap(); let d_regex = Regex::new(r"d: ([0-9a-fA-F]+)").unwrap(); let d = decode(d_regex.captures(&data).unwrap().get(1).unwrap().as_str()).unwrap(); let ek_regex = Regex::new(r"ek: ([0-9a-fA-F]+)").unwrap(); let ek_exp = decode(ek_regex.captures(&data).unwrap().get(1).unwrap().as_str()).unwrap(); let dk_regex = Regex::new(r"dk: ([0-9a-fA-F]+)").unwrap(); let dk_exp = decode(dk_regex.captures(&data).unwrap().get(1).unwrap().as_str()).unwrap(); (d, z, ek_exp, dk_exp) } fn get_encaps_vec(filename: &str) -> (Vec, Vec, Vec, Vec) { let data = fs::read_to_string(filename).expect("Unable to read file"); let ek_regex = Regex::new(r"ek: ([0-9a-fA-F]+)").unwrap(); let ek = decode(ek_regex.captures(&data).unwrap().get(1).unwrap().as_str()).unwrap(); let m_regex = Regex::new(r"m: ([0-9a-fA-F]+)").unwrap(); let m = decode(m_regex.captures(&data).unwrap().get(1).unwrap().as_str()).unwrap(); let ssk_regex = Regex::new(r"K: ([0-9a-fA-F]+)").unwrap(); let ssk = decode(ssk_regex.captures(&data).unwrap().get(1).unwrap().as_str()).unwrap(); let ct_regex = Regex::new(r"c: ([0-9a-fA-F]+)").unwrap(); let ct = decode(ct_regex.captures(&data).unwrap().get(1).unwrap().as_str()).unwrap(); (ek, m, ssk, ct) } fn get_decaps_vec(filename: &str) -> (Vec, Vec, Vec) { let data = fs::read_to_string(filename).expect("Unable to read file"); let dk_regex = Regex::new(r"dk: ([0-9a-fA-F]+)").unwrap(); let dk = decode(dk_regex.captures(&data).unwrap().get(1).unwrap().as_str()).unwrap(); let c_regex = Regex::new(r"c: ([0-9a-fA-F]+)").unwrap(); let c = decode(c_regex.captures(&data).unwrap().get(1).unwrap().as_str()).unwrap(); let kprime_regex = Regex::new(r"KPrime: ([0-9a-fA-F]+)").unwrap(); let kprime = decode( kprime_regex .captures(&data) .unwrap() .get(1) .unwrap() .as_str(), ) .unwrap(); (dk, c, kprime) } // ----- TEST KEYGEN, SIGN AND VERIFY #[test] fn test_keygen() { let (z, d, ek_exp, dk_exp) = get_keygen_vec("./tests/nist_vectors/Key Generation -- ML-KEM-512.txt"); let mut rnd = TestRng::new(); rnd.push(&d); rnd.push(&z); let (ek_act, dk_act) = ml_kem_512::KG::try_keygen_with_rng(&mut rnd).unwrap(); assert_eq!(ek_exp, ek_act.into_bytes()); assert_eq!(dk_exp, dk_act.into_bytes()); let (z, d, ek_exp, dk_exp) = get_keygen_vec("./tests/nist_vectors/Key Generation -- ML-KEM-768.txt"); let mut rnd = TestRng::new(); rnd.push(&d); rnd.push(&z); let (ek_act, dk_act) = ml_kem_768::KG::try_keygen_with_rng(&mut rnd).unwrap(); assert_eq!(ek_exp, ek_act.into_bytes()); assert_eq!(dk_exp, dk_act.into_bytes()); let (z, d, ek_exp, dk_exp) = get_keygen_vec("./tests/nist_vectors/Key Generation -- ML-KEM-1024.txt"); let mut rnd = TestRng::new(); rnd.push(&d); rnd.push(&z); let (ek_act, dk_act) = ml_kem_1024::KG::try_keygen_with_rng(&mut rnd).unwrap(); assert_eq!(ek_exp, ek_act.into_bytes()); assert_eq!(dk_exp, dk_act.into_bytes()); } #[test] fn test_encaps() { let (ek, m, ssk_exp, ct_exp) = get_encaps_vec("./tests/nist_vectors/Encapsulation -- ML-KEM-512.txt"); let mut rnd = TestRng::new(); rnd.push(&m); let ek = ml_kem_512::EncapsKey::try_from_bytes(ek.try_into().unwrap()).unwrap(); let (ssk_act, ct_act) = ek.try_encaps_with_rng(&mut rnd).unwrap(); assert_eq!(ssk_exp, ssk_act.into_bytes()); assert_eq!(ct_exp, ct_act.into_bytes()); let (ek, m, ssk_exp, ct_exp) = get_encaps_vec("./tests/nist_vectors/Encapsulation -- ML-KEM-768.txt"); let mut rnd = TestRng::new(); rnd.push(&m); let ek = ml_kem_768::EncapsKey::try_from_bytes(ek.try_into().unwrap()).unwrap(); let (ssk_act, ct_act) = ek.try_encaps_with_rng(&mut rnd).unwrap(); assert_eq!(ssk_exp, ssk_act.into_bytes()); assert_eq!(ct_exp, ct_act.into_bytes()); let (ek, m, ssk_exp, ct_exp) = get_encaps_vec("./tests/nist_vectors/Encapsulation -- ML-KEM-1024.txt"); let mut rnd = TestRng::new(); rnd.push(&m); let ek = ml_kem_1024::EncapsKey::try_from_bytes(ek.try_into().unwrap()).unwrap(); let (ssk_act, ct_act) = ek.try_encaps_with_rng(&mut rnd).unwrap(); assert_eq!(ssk_exp, ssk_act.into_bytes()); assert_eq!(ct_exp, ct_act.into_bytes()); } #[test] fn test_decaps() { let (dk, c, kprime_exp) = get_decaps_vec("./tests/nist_vectors/Decapsulation -- ML-KEM-512.txt"); let dk = ml_kem_512::DecapsKey::try_from_bytes(dk.try_into().unwrap()).unwrap(); let c = ml_kem_512::CipherText::try_from_bytes(c.try_into().unwrap()).unwrap(); let kprime_act = dk.try_decaps(&c).unwrap(); assert_eq!(kprime_exp, kprime_act.into_bytes()); let (dk, c, kprime_exp) = get_decaps_vec("./tests/nist_vectors/Decapsulation -- ML-KEM-768.txt"); let dk = ml_kem_768::DecapsKey::try_from_bytes(dk.try_into().unwrap()).unwrap(); let c = ml_kem_768::CipherText::try_from_bytes(c.try_into().unwrap()).unwrap(); let kprime_act = dk.try_decaps(&c).unwrap(); assert_eq!(kprime_exp, kprime_act.into_bytes()); let (dk, c, kprime_exp) = get_decaps_vec("./tests/nist_vectors/Decapsulation -- ML-KEM-1024.txt"); let dk = ml_kem_1024::DecapsKey::try_from_bytes(dk.try_into().unwrap()).unwrap(); let c = ml_kem_1024::CipherText::try_from_bytes(c.try_into().unwrap()).unwrap(); let kprime_act = dk.try_decaps(&c).unwrap(); assert_eq!(kprime_exp, kprime_act.into_bytes()); } fips203-0.2.1/tests/vectors.rs000064400000000000000000000016621046102023000142140ustar 00000000000000// This file implements a variety of top-level tests, including: official vectors, random // round trips, and (soon) fails. use rand_core::{CryptoRng, RngCore}; mod cctv_vectors; mod nist_vectors; // ----- CUSTOM RNG TO REPLAY VALUES ----- struct TestRng { data: Vec>, } impl RngCore for TestRng { fn next_u32(&mut self) -> u32 { unimplemented!() } fn next_u64(&mut self) -> u64 { unimplemented!() } fn fill_bytes(&mut self, out: &mut [u8]) { let x = self.data.pop().expect("TestRng problem"); out.copy_from_slice(&x) } fn try_fill_bytes(&mut self, out: &mut [u8]) -> Result<(), rand_core::Error> { self.fill_bytes(out); Ok(()) // panic on probs is OK } } impl CryptoRng for TestRng {} impl TestRng { fn new() -> Self { TestRng { data: Vec::new() } } fn push(&mut self, new_data: &[u8]) { let x = new_data.to_vec(); self.data.push(x); } }