From e38f00d45500a2f5f6a94e0bb9e08c035a0cea84 Mon Sep 17 00:00:00 2001 From: al <82364884+Al-Kindi-0@users.noreply.github.com> Date: Thu, 11 Dec 2025 12:31:48 +0400 Subject: [PATCH 01/13] chore: changed the layout of the sponge state --- miden-crypto/src/aead/aead_rpo/mod.rs | 4 +- .../src/dsa/falcon512_rpo/tests/data.rs | 102 +- .../src/dsa/falcon512_rpo/tests/mod.rs | 4 +- miden-crypto/src/hash/algebraic_sponge/mod.rs | 28 +- .../hash/algebraic_sponge/poseidon2/mod.rs | 25 +- .../hash/algebraic_sponge/rescue/rpo/mod.rs | 11 +- .../hash/algebraic_sponge/rescue/rpo/tests.rs | 173 +- .../hash/algebraic_sponge/rescue/rpx/mod.rs | 11 +- .../hash/algebraic_sponge/rescue/rpx/tests.rs | 14 +- miden-crypto/src/merkle/empty_roots.rs | 2040 ++++++++--------- miden-crypto/src/merkle/smt/forest/tests.rs | 40 +- 11 files changed, 1231 insertions(+), 1221 deletions(-) diff --git a/miden-crypto/src/aead/aead_rpo/mod.rs b/miden-crypto/src/aead/aead_rpo/mod.rs index 9ca5a17f4..bbf895497 100644 --- a/miden-crypto/src/aead/aead_rpo/mod.rs +++ b/miden-crypto/src/aead/aead_rpo/mod.rs @@ -532,9 +532,9 @@ impl SpongeState { fn squeeze_tag(&mut self) -> AuthTag { self.permute(); AuthTag( - self.state[RATE_RANGE_FIRST_HALF] + self.state[RATE_RANGE_SECOND_HALF] .try_into() - .expect("rate first half is exactly AUTH_TAG_SIZE elements"), + .expect("rate second half is exactly AUTH_TAG_SIZE elements"), ) } diff --git a/miden-crypto/src/dsa/falcon512_rpo/tests/data.rs b/miden-crypto/src/dsa/falcon512_rpo/tests/data.rs index a3447ce8a..54561914b 100644 --- a/miden-crypto/src/dsa/falcon512_rpo/tests/data.rs +++ b/miden-crypto/src/dsa/falcon512_rpo/tests/data.rs @@ -1758,57 +1758,57 @@ pub(crate) static SK_POLYS: [[[i16; 512]; 4]; NUM_TEST_VECTORS] = [ /// This was generated on an `Intel Core i5-8279U` running on Linux kernel `5.4.0-144-generic` and /// built with Rust `1.88.0`. pub(crate) const DETERMINISTIC_SIGNATURE: [u8; SIG_SERIALIZED_LEN] = [ - 185, 1, 22, 144, 158, 211, 85, 196, 199, 194, 123, 220, 135, 121, 154, 120, 141, 154, 66, 32, - 56, 47, 239, 41, 38, 121, 124, 172, 190, 21, 238, 237, 69, 36, 36, 245, 63, 146, 222, 205, 107, - 153, 60, 69, 60, 10, 91, 243, 160, 222, 120, 21, 132, 54, 134, 200, 184, 209, 102, 174, 244, - 236, 77, 155, 224, 162, 181, 104, 251, 8, 40, 30, 9, 14, 184, 153, 181, 189, 100, 74, 238, 146, - 99, 20, 84, 157, 181, 82, 118, 220, 172, 2, 233, 176, 72, 241, 169, 13, 245, 117, 157, 112, 30, - 76, 218, 217, 199, 73, 94, 220, 50, 113, 143, 125, 218, 52, 196, 133, 90, 209, 27, 230, 125, - 153, 181, 235, 98, 178, 151, 63, 190, 194, 43, 186, 139, 54, 38, 8, 203, 17, 91, 137, 246, 187, - 114, 179, 210, 11, 61, 177, 55, 129, 172, 18, 200, 29, 53, 203, 254, 78, 168, 251, 249, 209, 1, - 103, 177, 6, 28, 222, 220, 220, 55, 158, 166, 228, 43, 183, 31, 38, 32, 174, 174, 113, 247, - 108, 148, 225, 245, 15, 228, 225, 234, 160, 25, 161, 201, 189, 147, 158, 12, 249, 57, 71, 113, - 17, 104, 43, 187, 53, 240, 35, 244, 54, 198, 79, 88, 154, 133, 242, 85, 168, 180, 233, 161, - 103, 77, 75, 161, 81, 33, 75, 155, 10, 247, 73, 46, 24, 55, 237, 87, 219, 83, 17, 138, 226, 41, - 250, 159, 229, 73, 94, 89, 161, 70, 82, 45, 13, 193, 6, 33, 70, 127, 181, 120, 203, 81, 171, - 39, 166, 31, 201, 41, 65, 240, 178, 93, 136, 58, 71, 147, 38, 27, 204, 158, 63, 123, 120, 81, - 136, 101, 47, 63, 22, 238, 79, 226, 137, 126, 71, 217, 53, 217, 204, 96, 108, 222, 34, 161, 31, - 162, 42, 186, 101, 139, 61, 37, 97, 145, 133, 179, 65, 163, 79, 87, 19, 49, 80, 126, 112, 246, - 92, 214, 184, 153, 247, 246, 187, 199, 133, 116, 184, 45, 223, 6, 33, 101, 117, 101, 227, 207, - 127, 238, 91, 114, 134, 53, 127, 98, 204, 219, 219, 168, 136, 63, 210, 153, 218, 186, 138, 170, - 76, 215, 67, 34, 132, 146, 12, 38, 42, 149, 76, 172, 209, 231, 24, 77, 212, 205, 171, 235, 236, - 159, 220, 92, 62, 9, 164, 54, 49, 51, 192, 47, 238, 3, 229, 98, 26, 100, 47, 101, 132, 194, 8, - 142, 141, 173, 107, 191, 102, 19, 181, 209, 71, 168, 61, 175, 33, 37, 125, 37, 203, 19, 116, - 144, 176, 55, 4, 165, 47, 238, 101, 20, 131, 197, 146, 167, 222, 185, 140, 132, 80, 128, 226, - 150, 93, 203, 160, 196, 162, 141, 105, 190, 50, 92, 98, 31, 136, 102, 46, 24, 153, 6, 55, 78, - 135, 146, 24, 147, 221, 31, 74, 189, 115, 157, 83, 74, 147, 64, 255, 204, 79, 255, 31, 74, 65, - 143, 115, 35, 72, 59, 244, 26, 130, 173, 69, 96, 26, 215, 61, 97, 41, 69, 236, 230, 105, 119, - 30, 220, 90, 128, 250, 48, 134, 130, 205, 142, 196, 49, 184, 190, 101, 220, 199, 168, 217, 105, - 242, 157, 100, 135, 163, 156, 205, 172, 241, 35, 148, 124, 244, 45, 97, 213, 114, 55, 10, 126, - 117, 173, 135, 77, 239, 135, 58, 68, 243, 200, 222, 100, 52, 219, 26, 19, 217, 109, 32, 39, - 118, 130, 139, 38, 101, 231, 38, 126, 228, 20, 197, 91, 211, 248, 253, 74, 27, 201, 4, 52, 158, - 38, 116, 79, 62, 17, 107, 99, 75, 166, 247, 119, 31, 140, 97, 229, 48, 73, 179, 23, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 9, 155, 125, 185, 64, 84, 225, 93, 95, 10, 178, 100, 198, 160, 180, 110, 66, - 53, 41, 212, 204, 170, 160, 237, 167, 160, 122, 168, 168, 68, 93, 180, 2, 255, 84, 191, 48, - 157, 91, 57, 228, 201, 192, 75, 145, 62, 104, 175, 135, 156, 9, 128, 122, 1, 210, 73, 150, 34, - 200, 59, 228, 99, 89, 40, 54, 25, 217, 86, 245, 170, 187, 28, 224, 144, 102, 208, 225, 180, - 106, 60, 184, 144, 29, 213, 222, 166, 45, 212, 135, 24, 164, 201, 83, 26, 181, 36, 130, 38, - 173, 109, 97, 235, 192, 26, 43, 248, 157, 36, 62, 182, 118, 28, 234, 32, 6, 171, 179, 224, 30, - 170, 75, 80, 101, 228, 221, 195, 238, 144, 170, 6, 57, 109, 171, 41, 157, 234, 0, 103, 243, - 207, 105, 76, 164, 83, 35, 27, 73, 134, 177, 241, 38, 98, 86, 16, 200, 61, 190, 53, 115, 49, - 157, 169, 143, 109, 119, 196, 109, 151, 31, 54, 94, 22, 246, 174, 164, 162, 173, 60, 74, 18, - 220, 166, 122, 176, 32, 166, 107, 100, 229, 32, 161, 185, 210, 8, 49, 230, 61, 184, 212, 197, - 41, 114, 239, 214, 114, 177, 9, 39, 254, 197, 24, 151, 86, 141, 25, 206, 200, 146, 167, 36, 29, - 224, 66, 141, 123, 73, 246, 49, 80, 207, 109, 160, 72, 249, 70, 164, 10, 211, 190, 15, 104, - 147, 186, 216, 202, 251, 27, 246, 250, 104, 57, 91, 119, 19, 98, 173, 247, 70, 85, 8, 13, 70, - 69, 120, 52, 21, 87, 112, 50, 11, 75, 213, 167, 79, 42, 106, 58, 250, 77, 12, 133, 174, 108, - 113, 82, 17, 17, 98, 126, 97, 172, 87, 218, 221, 79, 84, 113, 33, 148, 62, 105, 150, 66, 152, - 153, 39, 237, 96, 75, 81, 1, 56, 6, 98, 92, 138, 114, 242, 189, 40, 38, 197, 118, 96, 130, 145, - 229, 138, 153, 44, 49, 89, 120, 209, 167, 205, 202, 28, 65, 174, 219, 125, 99, 31, 88, 48, 254, - 227, 34, 88, 138, 138, 60, 144, 106, 148, 158, 248, 154, 181, 53, 3, 45, 233, 164, 68, 80, 207, - 42, 209, 157, 159, 128, 94, 241, 55, 166, 231, 115, 130, 41, 132, 19, 135, 225, 120, 36, 101, - 204, 210, 161, 84, 197, 63, 5, 36, 178, 4, 229, 237, 43, 49, 212, 80, 219, 20, 172, 182, 189, - 9, 193, 112, 73, 63, 37, 148, 148, 184, 201, 96, 83, 62, 32, 186, 249, 54, 103, 208, 112, 216, + 185, 1, 49, 100, 34, 177, 39, 53, 190, 227, 187, 229, 174, 59, 206, 209, 55, 168, 94, 121, 223, + 102, 175, 213, 188, 26, 185, 233, 198, 252, 249, 138, 82, 22, 171, 253, 118, 25, 164, 99, 187, + 36, 109, 69, 198, 5, 16, 70, 234, 156, 145, 45, 71, 247, 255, 137, 71, 108, 215, 161, 85, 46, + 110, 45, 26, 71, 171, 47, 181, 153, 48, 142, 250, 169, 149, 108, 193, 17, 239, 43, 255, 253, + 190, 217, 63, 139, 49, 228, 103, 101, 201, 241, 236, 162, 110, 246, 146, 195, 202, 159, 63, + 237, 121, 235, 235, 216, 41, 27, 127, 141, 61, 13, 41, 133, 97, 80, 207, 33, 90, 59, 250, 95, + 240, 34, 95, 25, 43, 115, 31, 51, 124, 214, 88, 143, 111, 143, 65, 29, 175, 167, 200, 233, 68, + 194, 224, 232, 184, 183, 95, 49, 65, 81, 81, 9, 82, 27, 60, 196, 39, 103, 33, 209, 97, 88, 92, + 214, 121, 201, 66, 191, 172, 175, 76, 165, 196, 191, 205, 5, 147, 179, 11, 173, 36, 186, 173, + 211, 229, 41, 235, 251, 245, 44, 234, 164, 157, 66, 166, 146, 187, 156, 43, 23, 184, 108, 107, + 30, 45, 252, 98, 185, 136, 152, 185, 94, 120, 149, 133, 200, 96, 255, 188, 183, 9, 122, 52, + 220, 92, 171, 53, 43, 119, 97, 73, 36, 69, 194, 117, 179, 10, 158, 180, 173, 216, 34, 147, 150, + 73, 137, 38, 104, 147, 147, 128, 76, 28, 9, 134, 72, 86, 33, 109, 238, 37, 19, 189, 248, 222, + 221, 252, 185, 150, 102, 200, 66, 208, 254, 154, 102, 110, 46, 180, 253, 181, 90, 136, 15, 15, + 99, 250, 71, 8, 41, 206, 249, 247, 177, 87, 27, 246, 193, 91, 240, 148, 39, 138, 141, 166, 109, + 36, 20, 109, 14, 103, 47, 30, 48, 13, 38, 188, 151, 233, 74, 148, 7, 147, 132, 238, 106, 86, + 146, 36, 206, 56, 89, 102, 213, 66, 84, 151, 47, 116, 223, 164, 206, 177, 164, 17, 55, 231, 93, + 236, 115, 92, 161, 28, 171, 33, 153, 86, 140, 123, 224, 201, 107, 121, 129, 63, 212, 221, 148, + 62, 172, 44, 184, 103, 217, 88, 67, 173, 172, 42, 115, 151, 179, 29, 118, 114, 186, 202, 80, + 153, 89, 92, 81, 0, 74, 55, 201, 247, 54, 90, 199, 243, 119, 172, 31, 15, 182, 170, 200, 127, + 183, 91, 189, 237, 241, 154, 248, 229, 16, 117, 149, 15, 79, 156, 246, 160, 147, 77, 38, 144, + 194, 119, 69, 131, 46, 23, 185, 43, 66, 194, 77, 185, 30, 206, 92, 4, 218, 161, 156, 24, 54, + 238, 89, 201, 37, 148, 39, 185, 89, 137, 206, 171, 148, 189, 181, 185, 205, 168, 104, 182, 93, + 82, 17, 77, 143, 31, 188, 108, 11, 168, 116, 147, 166, 55, 160, 209, 153, 5, 146, 59, 46, 231, + 219, 112, 200, 110, 9, 148, 200, 94, 93, 247, 234, 48, 90, 88, 104, 34, 18, 120, 235, 25, 231, + 42, 156, 145, 165, 233, 143, 17, 227, 155, 44, 216, 185, 202, 54, 242, 53, 233, 206, 161, 176, + 221, 204, 124, 208, 104, 87, 80, 128, 163, 122, 150, 178, 5, 184, 146, 50, 121, 95, 174, 151, + 57, 4, 174, 208, 27, 157, 135, 190, 121, 1, 68, 57, 81, 69, 235, 205, 137, 82, 161, 209, 12, + 212, 9, 9, 77, 22, 251, 36, 37, 13, 50, 61, 89, 164, 69, 105, 92, 233, 136, 195, 210, 103, 102, + 73, 20, 5, 28, 162, 56, 169, 245, 255, 8, 134, 70, 53, 38, 245, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 9, 155, 125, 185, 64, 84, 225, 93, 95, 10, 178, 100, 198, 160, 180, 110, 66, 53, + 41, 212, 204, 170, 160, 237, 167, 160, 122, 168, 168, 68, 93, 180, 2, 255, 84, 191, 48, 157, + 91, 57, 228, 201, 192, 75, 145, 62, 104, 175, 135, 156, 9, 128, 122, 1, 210, 73, 150, 34, 200, + 59, 228, 99, 89, 40, 54, 25, 217, 86, 245, 170, 187, 28, 224, 144, 102, 208, 225, 180, 106, 60, + 184, 144, 29, 213, 222, 166, 45, 212, 135, 24, 164, 201, 83, 26, 181, 36, 130, 38, 173, 109, + 97, 235, 192, 26, 43, 248, 157, 36, 62, 182, 118, 28, 234, 32, 6, 171, 179, 224, 30, 170, 75, + 80, 101, 228, 221, 195, 238, 144, 170, 6, 57, 109, 171, 41, 157, 234, 0, 103, 243, 207, 105, + 76, 164, 83, 35, 27, 73, 134, 177, 241, 38, 98, 86, 16, 200, 61, 190, 53, 115, 49, 157, 169, + 143, 109, 119, 196, 109, 151, 31, 54, 94, 22, 246, 174, 164, 162, 173, 60, 74, 18, 220, 166, + 122, 176, 32, 166, 107, 100, 229, 32, 161, 185, 210, 8, 49, 230, 61, 184, 212, 197, 41, 114, + 239, 214, 114, 177, 9, 39, 254, 197, 24, 151, 86, 141, 25, 206, 200, 146, 167, 36, 29, 224, 66, + 141, 123, 73, 246, 49, 80, 207, 109, 160, 72, 249, 70, 164, 10, 211, 190, 15, 104, 147, 186, + 216, 202, 251, 27, 246, 250, 104, 57, 91, 119, 19, 98, 173, 247, 70, 85, 8, 13, 70, 69, 120, + 52, 21, 87, 112, 50, 11, 75, 213, 167, 79, 42, 106, 58, 250, 77, 12, 133, 174, 108, 113, 82, + 17, 17, 98, 126, 97, 172, 87, 218, 221, 79, 84, 113, 33, 148, 62, 105, 150, 66, 152, 153, 39, + 237, 96, 75, 81, 1, 56, 6, 98, 92, 138, 114, 242, 189, 40, 38, 197, 118, 96, 130, 145, 229, + 138, 153, 44, 49, 89, 120, 209, 167, 205, 202, 28, 65, 174, 219, 125, 99, 31, 88, 48, 254, 227, + 34, 88, 138, 138, 60, 144, 106, 148, 158, 248, 154, 181, 53, 3, 45, 233, 164, 68, 80, 207, 42, + 209, 157, 159, 128, 94, 241, 55, 166, 231, 115, 130, 41, 132, 19, 135, 225, 120, 36, 101, 204, + 210, 161, 84, 197, 63, 5, 36, 178, 4, 229, 237, 43, 49, 212, 80, 219, 20, 172, 182, 189, 9, + 193, 112, 73, 63, 37, 148, 148, 184, 201, 96, 83, 62, 32, 186, 249, 54, 103, 208, 112, 216, 216, 217, 97, 70, 4, 18, 42, 182, 117, 21, 222, 204, 168, 164, 123, 1, 189, 145, 70, 80, 218, 192, 136, 81, 22, 159, 137, 194, 70, 246, 187, 150, 50, 54, 154, 203, 214, 73, 174, 205, 44, 192, 105, 138, 192, 109, 238, 21, 64, 232, 181, 218, 129, 125, 92, 145, 87, 64, 222, 169, 183, diff --git a/miden-crypto/src/dsa/falcon512_rpo/tests/mod.rs b/miden-crypto/src/dsa/falcon512_rpo/tests/mod.rs index 9ef4106a7..8d7adb01a 100644 --- a/miden-crypto/src/dsa/falcon512_rpo/tests/mod.rs +++ b/miden-crypto/src/dsa/falcon512_rpo/tests/mod.rs @@ -1,7 +1,8 @@ use alloc::vec::Vec; use data::{ - EXPECTED_SIG, EXPECTED_SIG_POLYS, NUM_TEST_VECTORS, SK_POLYS, SYNC_DATA_FOR_TEST_VECTOR, + DETERMINISTIC_SIGNATURE, EXPECTED_SIG, EXPECTED_SIG_POLYS, NUM_TEST_VECTORS, SK_POLYS, + SYNC_DATA_FOR_TEST_VECTOR, }; use prng::Shake256Testing; use rand::{RngCore, SeedableRng}; @@ -10,7 +11,6 @@ use rand_chacha::ChaCha20Rng; use super::{Serializable, math::Polynomial}; use crate::dsa::falcon512_rpo::{ PREVERSIONED_NONCE, PREVERSIONED_NONCE_LEN, SIG_NONCE_LEN, SIG_POLY_BYTE_LEN, SecretKey, - tests::data::DETERMINISTIC_SIGNATURE, }; mod data; diff --git a/miden-crypto/src/hash/algebraic_sponge/mod.rs b/miden-crypto/src/hash/algebraic_sponge/mod.rs index 131f23b24..2a9d82cc8 100644 --- a/miden-crypto/src/hash/algebraic_sponge/mod.rs +++ b/miden-crypto/src/hash/algebraic_sponge/mod.rs @@ -25,24 +25,24 @@ pub(crate) mod rescue; // CONSTANTS // ================================================================================================ -/// Sponge state is set to 12 field elements or 96 bytes; 8 elements are reserved for rate and -/// the remaining 4 elements are reserved for capacity. +/// Sponge state is set to 12 field elements or 96 bytes; 8 elements are reserved for the rate and +/// the remaining 4 elements are reserved for the capacity. pub(crate) const STATE_WIDTH: usize = 12; -/// The rate portion of the state is located in elements 4 through 11. -pub(crate) const RATE_RANGE: Range = 4..12; +/// The rate portion of the state is located in elements 0 through 7. +pub(crate) const RATE_RANGE: Range = 0..8; pub(crate) const RATE_WIDTH: usize = RATE_RANGE.end - RATE_RANGE.start; -pub(crate) const INPUT1_RANGE: Range = 4..8; -pub(crate) const INPUT2_RANGE: Range = 8..12; +/// The first and second 4-element words of the rate portion. +pub(crate) const INPUT1_RANGE: Range = 0..4; +pub(crate) const INPUT2_RANGE: Range = 4..8; -/// The capacity portion of the state is located in elements 0, 1, 2, and 3. -pub(crate) const CAPACITY_RANGE: Range = 0..4; +/// The capacity portion of the state is located in elements 8, 9, 10, and 11. +pub(crate) const CAPACITY_RANGE: Range = 8..12; -/// The output of the hash function is a digest which consists of 4 field elements or 32 bytes. -/// -/// The digest is returned from state elements 4, 5, 6, and 7 (the first four elements of the -/// rate portion). +/// The output of the hash function is a digest which consists of 4 field elements or 32 bytes, +/// taken from the second word of the rate portion of the state (the middle word of the 3-word +/// sponge state). pub(crate) const DIGEST_RANGE: Range = 4..8; /// The number of byte chunks defining a field element when hashing a sequence of bytes @@ -96,7 +96,7 @@ pub(crate) trait AlgebraicSponge { Self::apply_permutation(&mut state); } - // return the first 4 elements of the state as hash result + // return the digest portion of the state as hash result Word::new(state[DIGEST_RANGE].try_into().unwrap()) } @@ -169,7 +169,7 @@ pub(crate) trait AlgebraicSponge { Self::apply_permutation(&mut state); } - // return the first 4 elements of the rate as hash result. + // return the digest portion of the rate as hash result. Word::new(state[DIGEST_RANGE].try_into().unwrap()) } diff --git a/miden-crypto/src/hash/algebraic_sponge/poseidon2/mod.rs b/miden-crypto/src/hash/algebraic_sponge/poseidon2/mod.rs index a13ae459d..33b072455 100644 --- a/miden-crypto/src/hash/algebraic_sponge/poseidon2/mod.rs +++ b/miden-crypto/src/hash/algebraic_sponge/poseidon2/mod.rs @@ -102,17 +102,18 @@ impl Poseidon2 { /// Number of internal rounds. pub const NUM_INTERNAL_ROUNDS: usize = NUM_INTERNAL_ROUNDS; - /// Sponge state is set to 12 field elements or 768 bytes; 8 elements are reserved for rate and - /// the remaining 4 elements are reserved for capacity. + /// Sponge state is set to 12 field elements or 768 bytes; 8 elements are reserved for the + /// rate and the remaining 4 elements are reserved for the capacity. pub const STATE_WIDTH: usize = STATE_WIDTH; - /// The rate portion of the state is located in elements 4 through 11 (inclusive). + /// The rate portion of the state is located in elements 0 through 7 (inclusive). pub const RATE_RANGE: Range = RATE_RANGE; - /// The capacity portion of the state is located in elements 0, 1, 2, and 3. + /// The capacity portion of the state is located in elements 8, 9, 10, and 11. pub const CAPACITY_RANGE: Range = CAPACITY_RANGE; - /// The output of the hash function can be read from state elements 4, 5, 6, and 7. + /// The output of the hash function can be read from state elements 4, 5, 6, and 7 (the second + /// word of the rate portion, i.e. the middle word of the sponge state). pub const DIGEST_RANGE: Range = DIGEST_RANGE; /// Matrix used for computing the linear layers of internal rounds. @@ -474,9 +475,11 @@ mod p3_tests { } #[test] - #[ignore] // TODO: Re-enable after migrating Poseidon2 state layout to match Plonky3 - // Miden-crypto: capacity=[0-3], rate=[4-11] - // Plonky3: rate=[0-7], capacity=[8-11] + #[ignore] + // TODO: The state layout now matches Plonky3 (rate=[0-7], capacity=[8-11]), but there's + // still a digest position mismatch: + // - Miden's Poseidon2::hash_elements() reads digest from state[4..8] (DIGEST_RANGE, middle word) + // - Plonky3's PaddingFreeSponge reads digest from state[0..OUT] (first 4 elements) fn test_poseidon2_hasher_vs_hash_elements() { // Test with empty input let expected: [Felt; 4] = Poseidon2::hash_elements::(&[]).into(); @@ -530,9 +533,9 @@ mod p3_tests { } #[test] - #[ignore] // TODO: Re-enable after migrating Poseidon2 state layout to match Plonky3 - // Miden-crypto: capacity=[0-3], rate=[4-11] - // Plonky3: rate=[0-7], capacity=[8-11] + #[ignore] + // TODO: Same digest position mismatch as test_poseidon2_hasher_vs_hash_elements above. + // Poseidon2::merge() reads from state[4..8], TruncatedPermutation reads from state[0..4]. fn test_poseidon2_compression_vs_merge() { let digest1 = [Felt::new(1), Felt::new(2), Felt::new(3), Felt::new(4)]; let digest2 = [Felt::new(5), Felt::new(6), Felt::new(7), Felt::new(8)]; diff --git a/miden-crypto/src/hash/algebraic_sponge/rescue/rpo/mod.rs b/miden-crypto/src/hash/algebraic_sponge/rescue/rpo/mod.rs index 94dd72f91..96e1370c9 100644 --- a/miden-crypto/src/hash/algebraic_sponge/rescue/rpo/mod.rs +++ b/miden-crypto/src/hash/algebraic_sponge/rescue/rpo/mod.rs @@ -91,17 +91,18 @@ impl Rpo256 { /// The number of rounds is set to 7 to target 128-bit security level. pub const NUM_ROUNDS: usize = NUM_ROUNDS; - /// Sponge state is set to 12 field elements or 768 bytes; 8 elements are reserved for rate and - /// the remaining 4 elements are reserved for capacity. + /// Sponge state is set to 12 field elements or 768 bytes; 8 elements are reserved for the + /// rate and the remaining 4 elements are reserved for the capacity. pub const STATE_WIDTH: usize = STATE_WIDTH; - /// The rate portion of the state is located in elements 4 through 11 (inclusive). + /// The rate portion of the state is located in elements 0 through 7 (inclusive). pub const RATE_RANGE: Range = RATE_RANGE; - /// The capacity portion of the state is located in elements 0, 1, 2, and 3. + /// The capacity portion of the state is located in elements 8, 9, 10, and 11. pub const CAPACITY_RANGE: Range = CAPACITY_RANGE; - /// The output of the hash function can be read from state elements 4, 5, 6, and 7. + /// The output of the hash function can be read from state elements 4, 5, 6, and 7 (the second + /// word of the rate portion, i.e. the middle word of the sponge state). pub const DIGEST_RANGE: Range = DIGEST_RANGE; /// MDS matrix used for computing the linear layer in a RPO round. diff --git a/miden-crypto/src/hash/algebraic_sponge/rescue/rpo/tests.rs b/miden-crypto/src/hash/algebraic_sponge/rescue/rpo/tests.rs index 44e1a44b8..caeb31933 100644 --- a/miden-crypto/src/hash/algebraic_sponge/rescue/rpo/tests.rs +++ b/miden-crypto/src/hash/algebraic_sponge/rescue/rpo/tests.rs @@ -15,7 +15,7 @@ const INV_ALPHA: u64 = 10540996611094048183; use crate::{ ONE, Word, ZERO, field::{PrimeCharacteristicRing, PrimeField64}, - hash::algebraic_sponge::{AlgebraicSponge, BINARY_CHUNK_SIZE, CAPACITY_RANGE, RATE_WIDTH}, + hash::algebraic_sponge::{AlgebraicSponge, BINARY_CHUNK_SIZE, CAPACITY_RANGE, RATE_RANGE, RATE_WIDTH}, rand::test_utils::rand_value, }; @@ -151,7 +151,8 @@ fn hash_padding_no_extra_permutation_call() { let mut state = [ZERO; STATE_WIDTH]; // padding when hashing bytes state[CAPACITY_RANGE.start] = Felt::from_u8(RATE_WIDTH as u8); - *state.last_mut().unwrap() = Felt::new(u64::from_le_bytes(final_chunk)); + // place the final padded chunk into the last rate element + state[RATE_RANGE.start + RATE_WIDTH - 1] = Felt::new(u64::from_le_bytes(final_chunk)); Rpo256::apply_permutation(&mut state); assert_eq!(&r1[0..4], &state[DIGEST_RANGE]); @@ -233,7 +234,7 @@ fn hash_test_vectors() { ]; for i in 0..elements.len() { - let expected = Word::new(*EXPECTED[i]); + let expected = EXPECTED[i]; let result = Rpo256::hash_elements(&elements[..(i + 1)]); assert_eq!(result, expected); } @@ -278,118 +279,118 @@ proptest! { const EXPECTED: [Word; 19] = [ Word::new([ - Felt::new(18126731724905382595), - Felt::new(7388557040857728717), - Felt::new(14290750514634285295), - Felt::new(7852282086160480146), + Felt::new(15469139178109825283), + Felt::new(13298322520406718581), + Felt::new(17526830383584509711), + Felt::new(11090661028409776847), ]), Word::new([ - Felt::new(10139303045932500183), - Felt::new(2293916558361785533), - Felt::new(15496361415980502047), - Felt::new(17904948502382283940), + Felt::new(11706991355830235601), + Felt::new(17934710181964143981), + Felt::new(4452402857411820110), + Felt::new(11507536382314375479), ]), Word::new([ - Felt::new(17457546260239634015), - Felt::new(803990662839494686), - Felt::new(10386005777401424878), - Felt::new(18168807883298448638), + Felt::new(2999547141091331606), + Felt::new(3815970388294335083), + Felt::new(3235818406702695957), + Felt::new(6413763952416051197), ]), Word::new([ - Felt::new(13072499238647455740), - Felt::new(10174350003422057273), - Felt::new(9201651627651151113), - Felt::new(6872461887313298746), + Felt::new(5139836888548140301), + Felt::new(3876981810195464724), + Felt::new(16089700743443351350), + Felt::new(1833434212470092856), ]), Word::new([ - Felt::new(2903803350580990546), - Felt::new(1838870750730563299), - Felt::new(4258619137315479708), - Felt::new(17334260395129062936), + Felt::new(15554982301745873839), + Felt::new(151818417656338362), + Felt::new(9548070910841645331), + Felt::new(13558459638592248743), ]), Word::new([ - Felt::new(8571221005243425262), - Felt::new(3016595589318175865), - Felt::new(13933674291329928438), - Felt::new(678640375034313072), + Felt::new(2397011179117920116), + Felt::new(8752502466497753750), + Felt::new(4652194430176185727), + Felt::new(474647832046121463), ]), Word::new([ - Felt::new(16314113978986502310), - Felt::new(14587622368743051587), - Felt::new(2808708361436818462), - Felt::new(10660517522478329440), + Felt::new(4230974115326455730), + Felt::new(1896316786078360494), + Felt::new(11147868109563898491), + Felt::new(6393232086365640838), ]), Word::new([ - Felt::new(2242391899857912644), - Felt::new(12689382052053305418), - Felt::new(235236990017815546), - Felt::new(5046143039268215739), + Felt::new(2837471104304140642), + Felt::new(5153261125632881780), + Felt::new(640241909830199468), + Felt::new(16978206582833722982), ]), Word::new([ - Felt::new(5218076004221736204), - Felt::new(17169400568680971304), - Felt::new(8840075572473868990), - Felt::new(12382372614369863623), + Felt::new(9383518511358660362), + Felt::new(9070368828200673888), + Felt::new(16333766749737601006), + Felt::new(267018218564404219), ]), Word::new([ - Felt::new(9783834557155203486), - Felt::new(12317263104955018849), - Felt::new(3933748931816109604), - Felt::new(1843043029836917214), + Felt::new(9842084245203653494), + Felt::new(3624620050543733613), + Felt::new(11549596931368439046), + Felt::new(15569501800395392802), ]), Word::new([ - Felt::new(14498234468286984551), - Felt::new(16837257669834682387), - Felt::new(6664141123711355107), - Felt::new(4590460158294697186), + Felt::new(1982074106153676251), + Felt::new(3670811651680553202), + Felt::new(13020939175959765999), + Felt::new(1631228032466827189), ]), Word::new([ - Felt::new(4661800562479916067), - Felt::new(11794407552792839953), - Felt::new(9037742258721863712), - Felt::new(6287820818064278819), + Felt::new(12498438494396623236), + Felt::new(12522140033657837500), + Felt::new(15931812573179338859), + Felt::new(4524495014558894935), ]), Word::new([ - Felt::new(7752693085194633729), - Felt::new(7379857372245835536), - Felt::new(9270229380648024178), - Felt::new(10638301488452560378), + Felt::new(15280875087510385592), + Felt::new(1616122979288813833), + Felt::new(8971164051716151989), + Felt::new(7735253038562305937), ]), Word::new([ - Felt::new(11542686762698783357), - Felt::new(15570714990728449027), - Felt::new(7518801014067819501), - Felt::new(12706437751337583515), + Felt::new(3109214984643679462), + Felt::new(911083193857751305), + Felt::new(5901679412876477991), + Felt::new(13358708367525191703), ]), Word::new([ - Felt::new(9553923701032839042), - Felt::new(7281190920209838818), - Felt::new(2488477917448393955), - Felt::new(5088955350303368837), + Felt::new(15186971827737962282), + Felt::new(18413440267559781060), + Felt::new(10496575362998017360), + Felt::new(13081559717536478834), ]), Word::new([ - Felt::new(4935426252518736883), - Felt::new(12584230452580950419), - Felt::new(8762518969632303998), - Felt::new(18159875708229758073), + Felt::new(5459020364317991813), + Felt::new(13522209963728741381), + Felt::new(7336753520967971663), + Felt::new(6316033838662753634), ]), Word::new([ - Felt::new(12795429638314178838), - Felt::new(14360248269767567855), - Felt::new(3819563852436765058), - Felt::new(10859123583999067291), + Felt::new(9420108075927647958), + Felt::new(6547816111471735269), + Felt::new(12220545288446975893), + Felt::new(3577117082695137213), ]), Word::new([ - Felt::new(2695742617679420093), - Felt::new(9151515850666059759), - Felt::new(15855828029180595485), - Felt::new(17190029785471463210), + Felt::new(12908714971205406449), + Felt::new(12995350974802899384), + Felt::new(5883568711258737532), + Felt::new(383173514483963899), ]), Word::new([ - Felt::new(13205273108219124830), - Felt::new(2524898486192849221), - Felt::new(14618764355375283547), - Felt::new(10615614265042186874), + Felt::new(17503723628055804519), + Felt::new(9438267265380355731), + Felt::new(8794036951449618344), + Felt::new(10910433304110137166), ]), ]; @@ -461,9 +462,11 @@ mod p3_tests { } #[test] - #[ignore] // TODO: Re-enable after migrating RPO state layout to match Plonky3 - // Miden-crypto: capacity=[0-3], rate=[4-11] - // Plonky3: rate=[0-7], capacity=[8-11] + #[ignore] + // TODO: The state layout now matches Plonky3 (rate=[0-7], capacity=[8-11]), but there's + // still a digest position mismatch: + // - Miden's Rpo256::hash_elements() reads digest from state[4..8] (DIGEST_RANGE, middle word) + // - Plonky3's PaddingFreeSponge reads digest from state[0..OUT] (first 4 elements) fn test_rpo_hasher_vs_hash_elements() { // Test with empty input let expected: [Felt; 4] = Rpo256::hash_elements::(&[]).into(); @@ -536,9 +539,9 @@ mod p3_tests { } #[test] - #[ignore] // TODO: Re-enable after migrating RPO state layout to match Plonky3 - // Miden-crypto: capacity=[0-3], rate=[4-11] - // Plonky3: rate=[0-7], capacity=[8-11] + #[ignore] + // TODO: Same digest position mismatch as test_rpo_hasher_vs_hash_elements above. + // Rpo256::merge() reads from state[4..8], TruncatedPermutation reads from state[0..4]. fn test_rpo_compression_vs_merge() { let digest1 = [Felt::new(1), Felt::new(2), Felt::new(3), Felt::new(4)]; let digest2 = [Felt::new(5), Felt::new(6), Felt::new(7), Felt::new(8)]; diff --git a/miden-crypto/src/hash/algebraic_sponge/rescue/rpx/mod.rs b/miden-crypto/src/hash/algebraic_sponge/rescue/rpx/mod.rs index 73d4d14c2..a510665ee 100644 --- a/miden-crypto/src/hash/algebraic_sponge/rescue/rpx/mod.rs +++ b/miden-crypto/src/hash/algebraic_sponge/rescue/rpx/mod.rs @@ -93,17 +93,18 @@ impl Rpx256 { /// Target collision resistance level in bits. pub const COLLISION_RESISTANCE: u32 = 128; - /// Sponge state is set to 12 field elements or 768 bytes; 8 elements are reserved for rate and - /// the remaining 4 elements are reserved for capacity. + /// Sponge state is set to 12 field elements or 768 bytes; 8 elements are reserved for the + /// rate and the remaining 4 elements are reserved for the capacity. pub const STATE_WIDTH: usize = STATE_WIDTH; - /// The rate portion of the state is located in elements 4 through 11 (inclusive). + /// The rate portion of the state is located in elements 0 through 7 (inclusive). pub const RATE_RANGE: Range = RATE_RANGE; - /// The capacity portion of the state is located in elements 0, 1, 2, and 3. + /// The capacity portion of the state is located in elements 8, 9, 10, and 11. pub const CAPACITY_RANGE: Range = CAPACITY_RANGE; - /// The output of the hash function can be read from state elements 4, 5, 6, and 7. + /// The output of the hash function can be read from state elements 4, 5, 6, and 7 (the second + /// word of the rate portion, i.e. the middle word of the sponge state). pub const DIGEST_RANGE: Range = DIGEST_RANGE; /// MDS matrix used for computing the linear layer in the (FB) and (E) rounds. diff --git a/miden-crypto/src/hash/algebraic_sponge/rescue/rpx/tests.rs b/miden-crypto/src/hash/algebraic_sponge/rescue/rpx/tests.rs index 723179c23..7a0d6371d 100644 --- a/miden-crypto/src/hash/algebraic_sponge/rescue/rpx/tests.rs +++ b/miden-crypto/src/hash/algebraic_sponge/rescue/rpx/tests.rs @@ -325,9 +325,11 @@ mod p3_tests { } #[test] - #[ignore] // TODO: Re-enable after migrating RPX state layout to match Plonky3 - // Miden-crypto: capacity=[0-3], rate=[4-11] - // Plonky3: rate=[0-7], capacity=[8-11] + #[ignore] + // TODO: The state layout now matches Plonky3 (rate=[0-7], capacity=[8-11]), but there's + // still a digest position mismatch: + // - Miden's Rpx256::hash_elements() reads digest from state[4..8] (DIGEST_RANGE, middle word) + // - Plonky3's PaddingFreeSponge reads digest from state[0..OUT] (first 4 elements) fn test_rpx_hasher_vs_hash_elements() { // Test with empty input let expected: [Felt; 4] = Rpx256::hash_elements::(&[]).into(); @@ -381,9 +383,9 @@ mod p3_tests { } #[test] - #[ignore] // TODO: Re-enable after migrating RPX state layout to match Plonky3 - // Miden-crypto: capacity=[0-3], rate=[4-11] - // Plonky3: rate=[0-7], capacity=[8-11] + #[ignore] + // TODO: Same digest position mismatch as test_rpx_hasher_vs_hash_elements above. + // Rpx256::merge() reads from state[4..8], TruncatedPermutation reads from state[0..4]. fn test_rpx_compression_vs_merge() { let digest1 = [Felt::new(1), Felt::new(2), Felt::new(3), Felt::new(4)]; let digest2 = [Felt::new(5), Felt::new(6), Felt::new(7), Felt::new(8)]; diff --git a/miden-crypto/src/merkle/empty_roots.rs b/miden-crypto/src/merkle/empty_roots.rs index 5c3fe1ae4..61fff9988 100644 --- a/miden-crypto/src/merkle/empty_roots.rs +++ b/miden-crypto/src/merkle/empty_roots.rs @@ -1,6 +1,6 @@ use core::slice; -use super::{EMPTY_WORD, Felt, Word, smt::InnerNode}; +use super::{Felt, Word, smt::InnerNode}; // EMPTY NODES SUBTREES // ================================================================================================ @@ -40,1528 +40,1528 @@ impl EmptySubtreeRoots { const EMPTY_SUBTREES: [Word; 256] = [ Word::new([ - Felt::new(0xee3d94db86d48dc4), - Felt::new(0x3d13166c7aba0368), - Felt::new(0x282e861f2936aa7), - Felt::new(0xf0328a1745537b4), + Felt::new(0xd4d013b3bb384b34), + Felt::new(0xd03164f8cbc65f58), + Felt::new(0xbbfc036f32fc5c85), + Felt::new(0xf7eabfadb9a3fb61), ]), Word::new([ - Felt::new(0x33174b312b730760), - Felt::new(0x9d1e00c5b50352b2), - Felt::new(0x16bf9ec4acef2e42), - Felt::new(0x4263877e63c4cbe7), + Felt::new(0xf67819110a99cafd), + Felt::new(0xef4a557934d0e308), + Felt::new(0x38031399d83ac329), + Felt::new(0xce88f2cbc782d190), ]), Word::new([ - Felt::new(0xa8e039042672a8bc), - Felt::new(0x1010d951d941d9d4), - Felt::new(0xd3e8f0ecc866ac3b), - Felt::new(0xb2dbbbb80da232ba), + Felt::new(0xac2fe313423178d2), + Felt::new(0xc8a44a83bcc6e12c), + Felt::new(0xbe463e50848cfaab), + Felt::new(0x974703e9298be16b), ]), Word::new([ - Felt::new(0xa0d2c1a3e455f299), - Felt::new(0x648e8e13867dc8eb), - Felt::new(0xe79f94ea61189847), - Felt::new(0xb88a89e1f2765a31), + Felt::new(0x879a7b6596dda9d9), + Felt::new(0xeb84fe8bcacdd2a2), + Felt::new(0x4840c52b62678f35), + Felt::new(0xbdb0155f421fa824), ]), Word::new([ - Felt::new(0xe168133fd9ab570d), - Felt::new(0x6fc7d0295ac5a3a2), - Felt::new(0xc973ea026e9411c), - Felt::new(0x63c29ea04552b532), + Felt::new(0xef950eb94178972d), + Felt::new(0xed3b56a2ee3e12cd), + Felt::new(0x4ce4e3dc76ff1240), + Felt::new(0x4abfa77e86abfd46), ]), Word::new([ - Felt::new(0x27e57ecc0f9f196), - Felt::new(0xc02f6e29fd19b059), - Felt::new(0x4a42fbc436efb0b6), - Felt::new(0xbff30574a98a1b29), + Felt::new(0x37a613ec638abc0d), + Felt::new(0x175a746054e30ce5), + Felt::new(0x5f9a13bf814d989a), + Felt::new(0xa87b8193d1558cfb), ]), Word::new([ - Felt::new(0x18c32592a4f4d0b), - Felt::new(0x6b9a08797252d5d5), - Felt::new(0xdbfe48f00a088a2), - Felt::new(0x16b4c3e485b173e3), + Felt::new(0x785fe8125ea68f6f), + Felt::new(0xfb24b14b32d727b0), + Felt::new(0xb694a134f1a93ea3), + Felt::new(0x25a5a60d80a3f845), ]), Word::new([ - Felt::new(0x26c8902938b831a5), - Felt::new(0x66ee91b36943f92e), - Felt::new(0x4e8deeafef9f5725), - Felt::new(0xbb35751d5dfb0a33), + Felt::new(0x860d2c1f729163b5), + Felt::new(0x2d633c512bcdd061), + Felt::new(0x279ad767db4e8c58), + Felt::new(0x9cca290b0d23c7), ]), Word::new([ - Felt::new(0x74af678f8e020ff4), - Felt::new(0xd4784cda0beed295), - Felt::new(0x4380949d841d793c), - Felt::new(0xdf587011d09d3bbb), + Felt::new(0x242a36a169740cdc), + Felt::new(0xd52c9f5159ca6de7), + Felt::new(0x56bd22a92d8ac820), + Felt::new(0xc47b5731b5d117e8), ]), Word::new([ - Felt::new(0xa211d1da76aaef98), - Felt::new(0xd904ccc6435e268), - Felt::new(0x1c6f16a5d03b8416), - Felt::new(0x87800f7f5da9c93), + Felt::new(0xe0ec018cda37fc72), + Felt::new(0xc6c4c0c4027ac161), + Felt::new(0x31706e4106bb7364), + Felt::new(0x2c98fdc73a6aff32), ]), Word::new([ - Felt::new(0xa00bbad0a52adeff), - Felt::new(0xe22179c651da9d76), - Felt::new(0x474f10493a3723f4), - Felt::new(0x84397e6bd34a1f5b), + Felt::new(0x5c353e1ae891454f), + Felt::new(0x81288a98893b47b7), + Felt::new(0xb4123d11cf90f0d6), + Felt::new(0x59d86d7b3e4d8803), ]), Word::new([ - Felt::new(0xe8f440afef4d082b), - Felt::new(0x14fff8e329613cc9), - Felt::new(0x78e984bc8b40f4f1), - Felt::new(0x6ed8f02e5be1bab2), + Felt::new(0x6ed50dc2f8ebca44), + Felt::new(0x96cac3183d07e9ee), + Felt::new(0x510e65c781fd85ae), + Felt::new(0x364de2f26f64f4b9), ]), Word::new([ - Felt::new(0xda824edf085b5f9f), - Felt::new(0xc8a8f1c1b86d349e), - Felt::new(0xe1bf6975afb7b2de), - Felt::new(0xd7df51ea51028489), + Felt::new(0x46acade0fa75da3), + Felt::new(0xe5ca56dd8a3ec270), + Felt::new(0x496e1498d81c5867), + Felt::new(0x8a357dd809d4e1af), ]), Word::new([ - Felt::new(0xf64873d31456de99), - Felt::new(0x1fc9cb920b6c72b), - Felt::new(0x96613d9d71af4373), - Felt::new(0x61d607eb097e76c9), + Felt::new(0x79ea9c14b4f80e54), + Felt::new(0x883a1aa66b877d7d), + Felt::new(0x2821d027cf4b82f), + Felt::new(0x498b9fbbb9154b65), ]), Word::new([ - Felt::new(0xca304d2b3b778719), - Felt::new(0xa54d8602f37eed39), - Felt::new(0xb4574db6dc09bcf2), - Felt::new(0x5e42cd4f1de9587c), + Felt::new(0x8141c1f5a278091b), + Felt::new(0xa462c11136d598b), + Felt::new(0x93ac8ed23507910a), + Felt::new(0x514a3f91433bd1), ]), Word::new([ - Felt::new(0x17575dfa689d8a07), - Felt::new(0x1db9d374d7436444), - Felt::new(0x21d1e8dca296f38d), - Felt::new(0xbc4aad43a9d93f54), + Felt::new(0x2638564f8f4124a8), + Felt::new(0xedb10a48ac24fbde), + Felt::new(0x8614d28f2aa8fc8f), + Felt::new(0x36ec52375c4db737), ]), Word::new([ - Felt::new(0x9fa0697330c054cd), - Felt::new(0xd5d57fbf059452e8), - Felt::new(0xe848fafb1c43414c), - Felt::new(0xacb7754fd77c9d52), + Felt::new(0x17bb63973b3ce758), + Felt::new(0xbceb2233c011acb9), + Felt::new(0x1353c736a9944f64), + Felt::new(0x755cb79ca6f7f55c), ]), Word::new([ - Felt::new(0x406af89b918e596c), - Felt::new(0xb735a2c588ee87df), - Felt::new(0xb40ff1dd1c3c6599), - Felt::new(0x675a582b4c8a68ac), + Felt::new(0xcd102aca9271751c), + Felt::new(0xe9517a03fa6e0961), + Felt::new(0x31253e5814e7c010), + Felt::new(0x391f3e31cb7a16d8), ]), Word::new([ - Felt::new(0x530ff6be0c86a2f6), - Felt::new(0x5541fabfefd34c91), - Felt::new(0x4af1579d212149ae), - Felt::new(0x23962b7df862f27c), + Felt::new(0xacd417612af2a6ac), + Felt::new(0x238b4d41647e0407), + Felt::new(0x43bd0eb02df70e6a), + Felt::new(0xe9f44baff7a2a27a), ]), Word::new([ - Felt::new(0x1676b694f41cfc0d), - Felt::new(0x59b165ea5f354fd8), - Felt::new(0x5b45ee14e2501f08), - Felt::new(0xd0c8ca7bc2e01e18), + Felt::new(0x1116ad4d849e6806), + Felt::new(0xd6190ac4ec72eef2), + Felt::new(0x3ecf9207fd73cd85), + Felt::new(0x6c78ec956d2d1051), ]), Word::new([ - Felt::new(0x2cff5d1e629ddc7b), - Felt::new(0x5062be34e4351fe), - Felt::new(0xfd76495b9d8ea67), - Felt::new(0xb96453b1c8060ca8), + Felt::new(0x205fe8449bfce0de), + Felt::new(0xe165f38d70da454a), + Felt::new(0x822e14e93a452d0a), + Felt::new(0x94d05b4cd577a64), ]), Word::new([ - Felt::new(0x860b00517d3de1ef), - Felt::new(0xd609c82af07b9dad), - Felt::new(0xa54a528b8f1cbddc), - Felt::new(0xb4fff658ed97e635), + Felt::new(0xf492fd7cacb1922), + Felt::new(0x2a703ca8f69ad1c8), + Felt::new(0xfcadfa03b409ead8), + Felt::new(0x782795592ae9a71e), ]), Word::new([ - Felt::new(0xd002cea8f347c347), - Felt::new(0xa135cebffdf3ec10), - Felt::new(0xb0200ea08da2cef4), - Felt::new(0x4e6f2f75d627b137), + Felt::new(0xa64f8b17ffb12710), + Felt::new(0x62f2e2fcae200d34), + Felt::new(0xbafb78b1425cddb1), + Felt::new(0xcfb390385991d1a7), ]), Word::new([ - Felt::new(0xc1983ce677cabbf4), - Felt::new(0x58f0143480f44788), - Felt::new(0xf8c23e4f84b6c6c1), - Felt::new(0xc9ce41371c4900b8), + Felt::new(0x3536fe931db61ed7), + Felt::new(0x23cc15387a7c7c4d), + Felt::new(0xd186b10bba44f5a0), + Felt::new(0xcc0774c067c213ca), ]), Word::new([ - Felt::new(0x837d99979bc9a5e6), - Felt::new(0x7621559aa4af175a), - Felt::new(0x6986737347c799c2), - Felt::new(0x8cee99eb47c3e702), + Felt::new(0x27f3232af1718d73), + Felt::new(0x6990c361978421b3), + Felt::new(0xa4a29b2ef4262014), + Felt::new(0x2245bc20ac47d643), ]), Word::new([ - Felt::new(0x42e17ba02508a41f), - Felt::new(0xb95e349bd55ba61f), - Felt::new(0xcc2bfeb29c4c68b2), - Felt::new(0xf268f57860a446b1), + Felt::new(0xfaf974458f303f50), + Felt::new(0xd0f09ad179c053b4), + Felt::new(0x1da69781fd4092b9), + Felt::new(0x1a199f9d1188e3a4), ]), Word::new([ - Felt::new(0xd3ffd4ccc6dda508), - Felt::new(0x81db1910ef04ca07), - Felt::new(0x5c698ee6c3aeab97), - Felt::new(0x2ac1e2c2c5f237de), + Felt::new(0x8507c4f9b071ed40), + Felt::new(0x474c7c36c6f0e46), + Felt::new(0x1c86f35500c8ffb6), + Felt::new(0x1e643fd431145fbc), ]), Word::new([ - Felt::new(0x1f42a1ef25bd0aad), - Felt::new(0x81b0f63e2760b8db), - Felt::new(0xe9607c7061b018f9), - Felt::new(0xf02a88202294a700), + Felt::new(0xdda5fad6063ec39c), + Felt::new(0x5beb591fe9f74db8), + Felt::new(0x2cd9f4a80f04ff02), + Felt::new(0x7268b4fb35179185), ]), Word::new([ - Felt::new(0xea5da09b39b60468), - Felt::new(0xe48ea41d94fe91a7), - Felt::new(0x24dde954ce08b32b), - Felt::new(0xe1bb6e41bd0613e6), + Felt::new(0x308f6a5c95ce95fc), + Felt::new(0x82f70df64a17e9f0), + Felt::new(0xe80de3338c098af1), + Felt::new(0x5fe10b5e07998b3b), ]), Word::new([ - Felt::new(0xc5e9f7188b43a24f), - Felt::new(0x8d7132abc9d901e4), - Felt::new(0xdc09a33ff4d0eb03), - Felt::new(0xa119bb1db594b4cf), + Felt::new(0x28e4f449c4dc2adf), + Felt::new(0xe174db2e584aa9c3), + Felt::new(0xe8e3eb3aed67d861), + Felt::new(0x38fc385388fe3b4b), ]), Word::new([ - Felt::new(0x589002afcbd4a233), - Felt::new(0xe4eae44d3c2a308d), - Felt::new(0x8bc0bca14b6b4dde), - Felt::new(0x3716e0e86a7aaa6c), + Felt::new(0xae686c27269cbf5b), + Felt::new(0x11b9c5ff17793d4), + Felt::new(0xe0c5db4b2059c649), + Felt::new(0x445555cda23e2339), ]), Word::new([ - Felt::new(0xaa4ba9602230007e), - Felt::new(0x2b2c3e14b888a3d4), - Felt::new(0x90a36fb42ec2ba19), - Felt::new(0x2e07ef26b078c4a7), + Felt::new(0x37af66cbfacb6574), + Felt::new(0xb6f29cd32ecff8a9), + Felt::new(0x109cc2114e88e51), + Felt::new(0x315e647d8b7aff19), ]), Word::new([ - Felt::new(0x32307da7aad33113), - Felt::new(0x343ed87928b9ab0c), - Felt::new(0x1c01d79482c021f0), - Felt::new(0x6f866afccc595439), + Felt::new(0x88435bdfe977671b), + Felt::new(0xbac2cd47398206ae), + Felt::new(0x8a6524314f775ffa), + Felt::new(0x50a0747244165a47), ]), Word::new([ - Felt::new(0x9780804b58b0d066), - Felt::new(0x1329929c6dc19c09), - Felt::new(0xc04add06dbaef6bf), - Felt::new(0xf494a28db17c5c4), + Felt::new(0xf93146fff2f3e0a0), + Felt::new(0xd1a7fb4ede819b11), + Felt::new(0x349045c7bc84e1e), + Felt::new(0x9c2b9a154ae7bbe7), ]), Word::new([ - Felt::new(0xe9dbb1c64d55571f), - Felt::new(0x663f0f716f28734), - Felt::new(0x7285fd4b8e87a78c), - Felt::new(0x2e152a4595b7597e), + Felt::new(0xad06f8b05dac78ee), + Felt::new(0x37816807e44d3780), + Felt::new(0xe8e5bd1da59ce1d9), + Felt::new(0x91ae41e1b89275aa), ]), Word::new([ - Felt::new(0x5531fabfa5960807), - Felt::new(0x8afe79be96d903a4), - Felt::new(0x24321cce4f1942f8), - Felt::new(0xb1829ec9d60aac8f), + Felt::new(0x4715873f981c2ccf), + Felt::new(0xb7aa499ae6b01e62), + Felt::new(0x959a1928d30e11d0), + Felt::new(0xcc9abdbe7aaad07b), ]), Word::new([ - Felt::new(0x9f7afc6634a82d1), - Felt::new(0x496e26bc17af352b), - Felt::new(0x8216f090e1d13381), - Felt::new(0x610cf5a3b3e190f9), + Felt::new(0x3dcf6c350a8e526), + Felt::new(0xc52777fc1f6b32e8), + Felt::new(0x9c49c05bb56ddc2e), + Felt::new(0xa1b3dfc99f13a03f), ]), Word::new([ - Felt::new(0xb5f8c141a9acd007), - Felt::new(0x4430345ace970576), - Felt::new(0x64d97e5533db3170), - Felt::new(0x95c016d769b0fc2d), + Felt::new(0xa597f830226ef1f5), + Felt::new(0x5e1fcf25e10b4cf3), + Felt::new(0xe025b9a81ee9756d), + Felt::new(0x5dd31ba2e0ec0692), ]), Word::new([ - Felt::new(0x88820d6a7ba5a94a), - Felt::new(0x27b614d79eb7b30b), - Felt::new(0xff2751e904085d5f), - Felt::new(0x752509a0860b37d), + Felt::new(0x4be63f346843f194), + Felt::new(0xb30132e5e74d00db), + Felt::new(0xe2ccdeb944709adc), + Felt::new(0xd1f0139c25f9b13d), ]), Word::new([ - Felt::new(0x1070bc84bb53a855), - Felt::new(0x1edad3d5da84e59b), - Felt::new(0x8efd48a13e4dfe0d), - Felt::new(0x3ab20af6203aba62), + Felt::new(0xca9cd71ab6856ea8), + Felt::new(0x10f6ea721a4bf0a5), + Felt::new(0x9a06e1a183a22306), + Felt::new(0x8a3faeaf4a2ea40), ]), Word::new([ - Felt::new(0xb4d6d3cc85438d08), - Felt::new(0x5592639fb2792724), - Felt::new(0x5939996ea4c52176), - Felt::new(0xaa83a79236367ee7), + Felt::new(0xb7e44129fa910201), + Felt::new(0xee63e42d5870e05), + Felt::new(0x90de82957f6f7611), + Felt::new(0x922508602610b4c4), ]), Word::new([ - Felt::new(0x4c08ac735aa1925a), - Felt::new(0x84951e177ac84e86), - Felt::new(0xd5b2657778d3271a), - Felt::new(0x375f75333654a77c), + Felt::new(0x5748ea87fe17aa82), + Felt::new(0xf254ca97acb5860b), + Felt::new(0xf226ad12f0ef99d1), + Felt::new(0xe8f16fcdee81c903), ]), Word::new([ - Felt::new(0x2fcbd8fcd125e5), - Felt::new(0xd8f711ed1b369d43), - Felt::new(0x9688301695b6bcd4), - Felt::new(0x52a010319401179), + Felt::new(0xb9082632c812362), + Felt::new(0x9ebd9df147cc9ac1), + Felt::new(0x149c151789f00cc), + Felt::new(0xec10fb00b714c0c9), ]), Word::new([ - Felt::new(0x1c67f8fde4c9c070), - Felt::new(0x438ccdf9d82b3a3f), - Felt::new(0xb9324515d5547ff5), - Felt::new(0x85ff37504c8230f0), + Felt::new(0xf223d6595826f21d), + Felt::new(0xce63a90b49c4ca59), + Felt::new(0xf727d89b56e794bb), + Felt::new(0x1c9181246b3526b6), ]), Word::new([ - Felt::new(0xcf8b6fabda4621f3), - Felt::new(0x1df94bb4ea8aeb6d), - Felt::new(0x8efffb7e8996b9e5), - Felt::new(0xa9aef575e8a86c4d), + Felt::new(0xe0af5862ca07232b), + Felt::new(0xb860dc5cf7476388), + Felt::new(0x318cf53cb85cf0aa), + Felt::new(0xc77418b80807b2f4), ]), Word::new([ - Felt::new(0x6e20862a64baaaef), - Felt::new(0xc54fbbfa034d6f1b), - Felt::new(0x16d9fd099f5bba71), - Felt::new(0xe4ac4cf3186fae83), + Felt::new(0x315464c85cd19846), + Felt::new(0x14b0c0ef112d95fe), + Felt::new(0xdece0dcc6de0455f), + Felt::new(0x3b164fa9f4be4c06), ]), Word::new([ - Felt::new(0x12914625293d7f84), - Felt::new(0xd3b46add4f77be8), - Felt::new(0xaac8846e6eeb9acd), - Felt::new(0xab6a69452b4b167b), + Felt::new(0x8e66d668c9d512c5), + Felt::new(0xea846421e3ec6e05), + Felt::new(0xffc03d33dadcbac8), + Felt::new(0xab1ae8f59bf9a5d6), ]), Word::new([ - Felt::new(0x69652e812cdfe03d), - Felt::new(0x22731622b139de96), - Felt::new(0xd7226e9a887f368d), - Felt::new(0xe9bbf6ad8f51ee13), + Felt::new(0xe163b5dabfe4edd0), + Felt::new(0x4dc36c5ed11f9cb2), + Felt::new(0xc451461bd8f8cda5), + Felt::new(0x9792f15ace2257a7), ]), Word::new([ - Felt::new(0xc39a01964af141d7), - Felt::new(0xb5ab2062263dcaa2), - Felt::new(0x1d7fbcd9204cbd34), - Felt::new(0xd48c517d5543c163), + Felt::new(0xad94af4ea13cbd58), + Felt::new(0x49c76b5c6b037521), + Felt::new(0x3fff24b5cba2abbc), + Felt::new(0xd2ea4cae87e32bc3), ]), Word::new([ - Felt::new(0x44118fda0c2b4af2), - Felt::new(0x487d307ce7444bb2), - Felt::new(0x171b7c6a17d734b2), - Felt::new(0xd9a737ddf65949d9), + Felt::new(0x5ee230a2b21fbcc7), + Felt::new(0xe7c913b10480cb37), + Felt::new(0x6a24020e33160aa4), + Felt::new(0x84c850b3d3ee08d2), ]), Word::new([ - Felt::new(0xc2cdc1b940450fec), - Felt::new(0x29864b9632eff0cd), - Felt::new(0x9ae31f150850e78c), - Felt::new(0xf9f9d0ef1092be87), + Felt::new(0x3bd7c1276c057731), + Felt::new(0x7624e520a4e8689f), + Felt::new(0x9fc7046216ea744f), + Felt::new(0x1e91ef277981e545), ]), Word::new([ - Felt::new(0x1703dd34002f3862), - Felt::new(0xf04b44446be81ea1), - Felt::new(0x8da51598849beb99), - Felt::new(0x8112e155f7f856a0), + Felt::new(0x750ed3b5ce658966), + Felt::new(0x1ad8497510856c13), + Felt::new(0x6a454fcd8e9aecae), + Felt::new(0xe173f9edaa9f520), ]), Word::new([ - Felt::new(0x3d4da8351f41dc1c), - Felt::new(0x682e55817f56f30b), - Felt::new(0xf20cc7fe5b98b951), - Felt::new(0x8297d3de042785d4), + Felt::new(0x3da83f217a938e84), + Felt::new(0x72429a871dd069e8), + Felt::new(0x56fef2cfd959214e), + Felt::new(0xebdec7e27de3d78e), ]), Word::new([ - Felt::new(0x1f9d07a435a6d13e), - Felt::new(0x789a1330825c199a), - Felt::new(0x6e058e9dbc30f3a0), - Felt::new(0xb09be46b59290984), + Felt::new(0xe4f9bd5af54aea89), + Felt::new(0x93e3490464ba3dec), + Felt::new(0x2977298399d5431a), + Felt::new(0x8cbf576d0718e734), ]), Word::new([ - Felt::new(0xaf2d49c9a3975d21), - Felt::new(0xebd4d399fc30a751), - Felt::new(0x224a3884ca353e5d), - Felt::new(0xbebba344bbe055a7), + Felt::new(0xbab45c995d032de2), + Felt::new(0x72f5b2172139a0ac), + Felt::new(0x9e187c1cf79c0b58), + Felt::new(0x9b90ca39e8bb2da9), ]), Word::new([ - Felt::new(0xdf576dc16b0abc3f), - Felt::new(0x40439af403c36338), - Felt::new(0x317b1f2308849c53), - Felt::new(0x91e5c9d14107cb04), + Felt::new(0xae672772d64afa0c), + Felt::new(0x370fa7b34411bee9), + Felt::new(0x28ae49eb522be4f3), + Felt::new(0x1e5737f6b6d7a0f), ]), Word::new([ - Felt::new(0x93af916aa15f97e2), - Felt::new(0x50d4aec3e408fba7), - Felt::new(0xd16bd5f71b6d6915), - Felt::new(0x27b96db871be03ef), + Felt::new(0x1c901146dab3e028), + Felt::new(0xa48d69faa209a43d), + Felt::new(0x812dee69d638b842), + Felt::new(0xafef0923d1fc3d54), ]), Word::new([ - Felt::new(0x72fce6dd7d54e348), - Felt::new(0x632a2e8b6177c670), - Felt::new(0xefd897bebdc4ec2b), - Felt::new(0xfe66bfe440033790), + Felt::new(0x59633b3e017134fb), + Felt::new(0xb0e7714970789f95), + Felt::new(0x8d025fa5876626da), + Felt::new(0x964013427fb35552), ]), Word::new([ - Felt::new(0xc581364aef408d6a), - Felt::new(0xfcc7efb35cccae32), - Felt::new(0xee0a97dded065fbf), - Felt::new(0x2b1eb2c45fd0e633), + Felt::new(0xa6f318dbb996cec6), + Felt::new(0x602d3f78ea9e5fc7), + Felt::new(0x33cc086f6c81ec4c), + Felt::new(0xfb5875ef0723ac08), ]), Word::new([ - Felt::new(0x9e460e8159152a88), - Felt::new(0xcc5a2946f03bf507), - Felt::new(0x95535e9cf29e4ab9), - Felt::new(0x29b23d31ffe6df18), + Felt::new(0x47f22a85e61ccce2), + Felt::new(0x183642989e08d0c4), + Felt::new(0xdbc6ac210367e51d), + Felt::new(0x713d9f083fb06bed), ]), Word::new([ - Felt::new(0xbae2c405d8ba715d), - Felt::new(0xb886f0545ae16153), - Felt::new(0x728d5965a4cdfc0b), - Felt::new(0x86bd552048f3ebc4), + Felt::new(0x3b9b50e61ac294de), + Felt::new(0xa2d43695646f9847), + Felt::new(0xbf7baaab45a7a335), + Felt::new(0xfff6990e4e2af1c5), ]), Word::new([ - Felt::new(0x3a4c6dbaa6feda93), - Felt::new(0x8a32917885a3f22c), - Felt::new(0xd6016ba7fc1a0717), - Felt::new(0x3bfd41569497b156), + Felt::new(0x2f14338754790fc2), + Felt::new(0x880c6e172b727a07), + Felt::new(0x62648c19e70a3d9a), + Felt::new(0x11cb177e7cfb88c0), ]), Word::new([ - Felt::new(0xa907fad371653f15), - Felt::new(0x6be9ce6ac746f5bc), - Felt::new(0x1bee5ac8750d2444), - Felt::new(0x16050d83d4f7a90c), + Felt::new(0xbcc6ccf09f20091d), + Felt::new(0x7522cbe658fd241a), + Felt::new(0x1812abe3a41a4280), + Felt::new(0xfc42fb700c9dee6b), ]), Word::new([ - Felt::new(0x4b194182aa7e9324), - Felt::new(0x813af49c845cea5e), - Felt::new(0x6886f4d8628bab16), - Felt::new(0xe3b6ef1419e2432c), + Felt::new(0x9f9ed8a88a3d4726), + Felt::new(0xba717fb8a0e5a430), + Felt::new(0x8b6c5d03ae8285e0), + Felt::new(0xc79ea08e4547b79c), ]), Word::new([ - Felt::new(0x3edc103de28f1fac), - Felt::new(0xb6a05b8802d6ed5c), - Felt::new(0xf320c3f130a175c8), - Felt::new(0x326c8bb02f9a51f6), + Felt::new(0xbfabb7d2dcad0d97), + Felt::new(0x1b1b6214bd392a65), + Felt::new(0xc0dfcf7f7c8a0075), + Felt::new(0x92f1111ac16144a6), ]), Word::new([ - Felt::new(0x5b1ac27a49b5d1da), - Felt::new(0x9e1fa75b04da7545), - Felt::new(0x9a522396a1cd68af), - Felt::new(0x91a4d435f3fcd43f), + Felt::new(0xbf5f42c3265dcb0), + Felt::new(0x407eb8baea7dcb85), + Felt::new(0xb8ed9f82f53adca), + Felt::new(0x48259d20bd4bdb71), ]), Word::new([ - Felt::new(0x318ac5d8f1e489ce), - Felt::new(0x339e7a0b2aec5843), - Felt::new(0x38f15bf9832a2c28), - Felt::new(0x5e3fef94216f72f1), + Felt::new(0xc4f4b1eb33ce8426), + Felt::new(0x5a8bde74b2d03fef), + Felt::new(0x92edaf43c6da7999), + Felt::new(0x72e9f2ac423e2c0a), ]), Word::new([ - Felt::new(0xc43e0723d2a7e79c), - Felt::new(0xa06167cc0ebdf1e5), - Felt::new(0xe62f10089af57ba6), - Felt::new(0x838c863d60b859a2), + Felt::new(0x598f122070bf172b), + Felt::new(0x5150f2a1c8871ab9), + Felt::new(0xb12f586f154cdad3), + Felt::new(0xcfce74f1c561e599), ]), Word::new([ - Felt::new(0xd10456af5f30e5d5), - Felt::new(0x235df7fe21fb912c), - Felt::new(0xe5acc29d13d80779), - Felt::new(0x580b83247a1f6524), + Felt::new(0x438ae220bc4198c0), + Felt::new(0x8dc7553ee68ff669), + Felt::new(0xc535627dc3bc8821), + Felt::new(0x9f82b9714c7fccf9), ]), Word::new([ - Felt::new(0x2a8b1bf7e9bc5675), - Felt::new(0x9e523f2d659a3e30), - Felt::new(0x3ecfdb1615666b74), - Felt::new(0xf53746b86fedee7f), + Felt::new(0x652ffdc3400dafdb), + Felt::new(0xa66c9e994e20af01), + Felt::new(0x7d34b0be5266c533), + Felt::new(0xea275f50b8ff8b9e), ]), Word::new([ - Felt::new(0xa12095b3b22680a9), - Felt::new(0x3010ad751585161d), - Felt::new(0xfb9c0ea33c7437b2), - Felt::new(0x9225d8151ec724a8), + Felt::new(0x7a91e0682cfb3425), + Felt::new(0x544b7251e18d909e), + Felt::new(0xd3d9b1f4d64c1345), + Felt::new(0x3a7ac3166398adf9), ]), Word::new([ - Felt::new(0x1b09eac8ad815107), - Felt::new(0x33cb241ad41b562d), - Felt::new(0xa04f457b4cd1ece9), - Felt::new(0x84f27a45985d700e), + Felt::new(0x13b43b61fd8b9763), + Felt::new(0x7621715646680ba7), + Felt::new(0x9554a9e85f3ef765), + Felt::new(0xb82abbece04fe626), ]), Word::new([ - Felt::new(0xe5598d92d1507185), - Felt::new(0x84aa2bf7d87a26e8), - Felt::new(0x158f0e13550dec2a), - Felt::new(0x54d699e5eb65ee63), + Felt::new(0x47c8c9caaae02ee2), + Felt::new(0x69170ecdb159f653), + Felt::new(0x19e86343ec24c391), + Felt::new(0xd97d7f86759e06db), ]), Word::new([ - Felt::new(0x902e89f122f8f8f7), - Felt::new(0xc2da7127af8c699a), - Felt::new(0x75762e75b77a1662), - Felt::new(0x7e683b3c116af130), + Felt::new(0xaa016ad8b15ae2a3), + Felt::new(0xbf79198389f5e29a), + Felt::new(0xebb1be02db8e5dad), + Felt::new(0xbaad4adddac74614), ]), Word::new([ - Felt::new(0xabc2aa2ecd2316dd), - Felt::new(0x44558fa721857f00), - Felt::new(0xf61dd475fdbc23d0), - Felt::new(0x22ba84332065a9e8), + Felt::new(0xa598203fd55a57b5), + Felt::new(0x792d5bb12dfa6981), + Felt::new(0x60165fc661111f52), + Felt::new(0xfba792703986303a), ]), Word::new([ - Felt::new(0x5aa94e045e4bb7ae), - Felt::new(0xf6ddadbdd8747728), - Felt::new(0xeeab65efab2a1d2), - Felt::new(0xd12cc579c49b9db5), + Felt::new(0x22945a0a7900e41f), + Felt::new(0x6be915078ff845f2), + Felt::new(0x217d9b0dd802d38a), + Felt::new(0x78f69158f7f54bf9), ]), Word::new([ - Felt::new(0x71ea68262a73196a), - Felt::new(0x9612483af09f1bde), - Felt::new(0x7fe5fd69bbf241a4), - Felt::new(0x34de27c57b37975d), + Felt::new(0x76e23b690cd0c900), + Felt::new(0x6d8206a2d66bbeb), + Felt::new(0xe9aa6f3f234fbbb4), + Felt::new(0xe44e67909ba1f23c), ]), Word::new([ - Felt::new(0xf29bc8ba140714f6), - Felt::new(0xf0b44caca4f6561e), - Felt::new(0x742695d702446774), - Felt::new(0x7e1437b52ee16c0c), + Felt::new(0xb54f48d189e7a365), + Felt::new(0xd266320771aab9f3), + Felt::new(0xafcc721b705424b5), + Felt::new(0x6408c7735a1039fc), ]), Word::new([ - Felt::new(0x13f6180493eaa129), - Felt::new(0x8fa2e77f499c911c), - Felt::new(0x1223e5ccda975bf), - Felt::new(0xc2a362e5449eac8b), + Felt::new(0x15f30216ae30560b), + Felt::new(0x4459070f418e2bfd), + Felt::new(0x9913a6f33eb9830b), + Felt::new(0x57f960ec9034c946), ]), Word::new([ - Felt::new(0xcf1254ec733c8fb0), - Felt::new(0x34359ae1e2272fc9), - Felt::new(0xce928a65262d59d5), - Felt::new(0xc84e1f72e2e78101), + Felt::new(0x3a81ce1c4756c8a6), + Felt::new(0xb340cc1d756ec0a7), + Felt::new(0xa8270bc5bdc0b8cb), + Felt::new(0x689965c6ba6cbe15), ]), Word::new([ - Felt::new(0x8841b659676a2df5), - Felt::new(0x4c808c965135ff8f), - Felt::new(0x374d574fd96ee7d1), - Felt::new(0xa0ae0e5765bc8716), + Felt::new(0x37f8b3632548361c), + Felt::new(0x8d04fff8fc271035), + Felt::new(0x6660bc2cafa82aa9), + Felt::new(0x8afbedd48a8365cd), ]), Word::new([ - Felt::new(0xba3692cf34a6eb7a), - Felt::new(0x384dce8b1fd8fcd5), - Felt::new(0x248f1c83f6cf6055), - Felt::new(0xbf50ca14b3c5b022), + Felt::new(0xd2441cfa99cc7793), + Felt::new(0x9fa78d1bdb13041a), + Felt::new(0x77ff29ad572478e7), + Felt::new(0x6d9f5ef24c925e07), ]), Word::new([ - Felt::new(0x18611824fa468341), - Felt::new(0xaab4187ff224ec04), - Felt::new(0x4ad742d8a070d084), - Felt::new(0xfa3bb42df7d86480), + Felt::new(0x2c80aa446b66d913), + Felt::new(0x57275023986521ae), + Felt::new(0xaedcf3d27a794882), + Felt::new(0x19a6cef92c027139), ]), Word::new([ - Felt::new(0x2ab25bf43fc462b5), - Felt::new(0x6ac0cc243f54b796), - Felt::new(0x2401eabf391a2199), - Felt::new(0x62a71dae211b983), + Felt::new(0xbd054fd6a112de4e), + Felt::new(0x834c58a59932bbf8), + Felt::new(0x3ae96c071ee1793d), + Felt::new(0x8ef8f97ff99c5454), ]), Word::new([ - Felt::new(0xbc5e568df9f18772), - Felt::new(0xee864850b75a99ba), - Felt::new(0x2a53e3e6776ae456), - Felt::new(0x8eb51bedbe483d7c), + Felt::new(0x8856f7bb1b174a59), + Felt::new(0xf6563ff354a46696), + Felt::new(0xe1fbc7d206c90227), + Felt::new(0xcaa3af84acd3c8e1), ]), Word::new([ - Felt::new(0xce8161f4c705bfbb), - Felt::new(0xf1071a4e343a37e9), - Felt::new(0xddc4878a9e5de00f), - Felt::new(0xee33d737cd3c5dc8), + Felt::new(0x66772e7cb41d39fc), + Felt::new(0xacca4213ddea573d), + Felt::new(0x42664f05a276b4cc), + Felt::new(0xb29fe26a22456679), ]), Word::new([ - Felt::new(0x9eadd43aebfcd43d), - Felt::new(0xf35cec43429c0a95), - Felt::new(0xcad253fc16b63e5a), - Felt::new(0xea25dc9baaf21d38), + Felt::new(0x24e2318aebce5b35), + Felt::new(0x73077a8a48ad184), + Felt::new(0x8bbc90259569d580), + Felt::new(0x56480eff5d4c906a), ]), Word::new([ - Felt::new(0xa85a87fbf220f449), - Felt::new(0x1db1c09109882161), - Felt::new(0xab5139cb30eb2c88), - Felt::new(0xe62f2ade31d95b14), + Felt::new(0x35b40543fd5d212b), + Felt::new(0xa58a937ff2de45f6), + Felt::new(0x5fcccfd472db95d8), + Felt::new(0x4f161100757a6dea), ]), Word::new([ - Felt::new(0xad3fae6f7f635376), - Felt::new(0x21e5dba9b8e21ac8), - Felt::new(0x86506eeeba6c7151), - Felt::new(0x6bf71fdffc8d9ae7), + Felt::new(0x5dadd572c3c22422), + Felt::new(0x3206d7f7b44ebf8d), + Felt::new(0x8b4bf193244db448), + Felt::new(0x6bcb14c07dcc9c98), ]), Word::new([ - Felt::new(0x37ec52a9396f4574), - Felt::new(0xf19404a514aa9285), - Felt::new(0x3ed5ae669769c4e7), - Felt::new(0x2286b493b85c9481), + Felt::new(0xaa20788fc7f3a4d0), + Felt::new(0xe2e2bfd3f097ca53), + Felt::new(0xa978d0066c19352f), + Felt::new(0x5398d184423634e7), ]), Word::new([ - Felt::new(0xc37fc37b83940bd2), - Felt::new(0xe3d67417540b620b), - Felt::new(0x1495f7a7848dde0a), - Felt::new(0xeaf4f9c053465ff), + Felt::new(0x91d0351a7c8be21f), + Felt::new(0xda7751040d856eea), + Felt::new(0x4c5a8dc777ef48de), + Felt::new(0x5b2f5c5e4cca2803), ]), Word::new([ - Felt::new(0x80131752569df8f0), - Felt::new(0x30720a862b82f732), - Felt::new(0xabed5fb95dbe678b), - Felt::new(0x6cf7da37075ad45e), + Felt::new(0xc691ee791a55a457), + Felt::new(0xeb1c793f34c2734), + Felt::new(0xbcae087a3d678be3), + Felt::new(0xf3831ebdcedce937), ]), Word::new([ - Felt::new(0xa318ea66909473fe), - Felt::new(0x4a6c6ebc4bee8b3c), - Felt::new(0xf0d622f04ce1b02e), - Felt::new(0x92c2f8e192c000a1), + Felt::new(0x70698bc7a47bfee6), + Felt::new(0xd0de44e29f3f53c3), + Felt::new(0x1c783f6a3027d6d4), + Felt::new(0xcf471edad4b8b5b1), ]), Word::new([ - Felt::new(0xb39d728756dca017), - Felt::new(0x4f66acee5bcd7d98), - Felt::new(0xf623331bed29e125), - Felt::new(0xbcfc777f0eb03793), + Felt::new(0x9d9a7ba0c28c9b0), + Felt::new(0xa9c5ded371690a3), + Felt::new(0x68cead239c142d5d), + Felt::new(0xb3da455ac3e8c280), ]), Word::new([ - Felt::new(0x6cdabd98e067b039), - Felt::new(0xd6356a27c3df3ddc), - Felt::new(0xd5afb88820db9d2f), - Felt::new(0x8203a7adfa667bfc), + Felt::new(0x45e78e5a90711466), + Felt::new(0x5e586906a8afdbfe), + Felt::new(0x6957d43fe2fbf643), + Felt::new(0x8169390aa0a7a016), ]), Word::new([ - Felt::new(0x1ddef8e482da50e0), - Felt::new(0x7fa3c9c0865609ec), - Felt::new(0x6ca762886d4d6227), - Felt::new(0x9a95160f2a4fe5d9), + Felt::new(0x651849781803dcba), + Felt::new(0x1dfa87fa6bb77c70), + Felt::new(0x407a3c5fa2a98eba), + Felt::new(0x1d68b5e80773f948), ]), Word::new([ - Felt::new(0x607230c3b366dbd5), - Felt::new(0x5b996a7d876b7602), - Felt::new(0xf61df5d15469c8ea), - Felt::new(0x9bb4f5c06ac49403), + Felt::new(0xd1bc04ab006424b9), + Felt::new(0xc26dca97a7c8b57c), + Felt::new(0x3ebccc08d498980f), + Felt::new(0x4aadc0cf30681742), ]), Word::new([ - Felt::new(0x6a27c9e7082595e7), - Felt::new(0xbf93eb89e2090438), - Felt::new(0xd2db18139bedc636), - Felt::new(0x79710c33a1f1f612), + Felt::new(0x691bbae5c2363914), + Felt::new(0x2701ea5c4090a565), + Felt::new(0x543dad0d02a72d6c), + Felt::new(0x7ca616c64e6e8431), ]), Word::new([ - Felt::new(0xf54e4461aa09608b), - Felt::new(0x898a7b52804d88c9), - Felt::new(0xbc548fab0257ea25), - Felt::new(0xe783017a62b49474), + Felt::new(0xd3e4efff0a78a14f), + Felt::new(0xfc4778255fc8af49), + Felt::new(0x546dc6aa0893f40a), + Felt::new(0xef5cce0fc114d149), ]), Word::new([ - Felt::new(0xf7efdb376a7734c9), - Felt::new(0x2d4ded56d9ef2076), - Felt::new(0xa17d90a509b879d0), - Felt::new(0xcf012a20045b29e1), + Felt::new(0x649810ed8e93ca3e), + Felt::new(0x4485a76dd95d5525), + Felt::new(0x7c900111bca87c90), + Felt::new(0x10e1fe25f069dde8), ]), Word::new([ - Felt::new(0x37e40a30232a4f06), - Felt::new(0xfbd9877fb761052e), - Felt::new(0xc4c41f56a70377cd), - Felt::new(0x631e942f6680d4cc), + Felt::new(0xec89042fdd1f8b54), + Felt::new(0xf0078a00c08ce8e4), + Felt::new(0x62270559b0fc131b), + Felt::new(0xe0b082313e5a1e06), ]), Word::new([ - Felt::new(0xcf868b6d54b515a5), - Felt::new(0xa522edf7c43f7aee), - Felt::new(0x66057652f34d479), - Felt::new(0x59f4a86223bc80bd), + Felt::new(0x45339be9146a2de8), + Felt::new(0x5fc43b172c080f4a), + Felt::new(0x1326d84051af11cc), + Felt::new(0xd4388c68206e571), ]), Word::new([ - Felt::new(0xb7214ce5a0ba8dfd), - Felt::new(0x5c7a6e583e4e255e), - Felt::new(0xabc8369f8bf38a1c), - Felt::new(0xb5db79ae07f0689c), + Felt::new(0x90f7990f2011d278), + Felt::new(0xd7fd43dfe4e2801a), + Felt::new(0x891eeb2683ddbcd), + Felt::new(0x6428a09bd8abd20d), ]), Word::new([ - Felt::new(0x18c980169ef2d0bb), - Felt::new(0x6526b64df8eb4eac), - Felt::new(0xfe4d8327ca5bd91a), - Felt::new(0xe36d607069c7dd85), + Felt::new(0xa5391efe50dbd262), + Felt::new(0xed3faada8319059c), + Felt::new(0x65ba768005e0ca21), + Felt::new(0x1db0617dde441c19), ]), Word::new([ - Felt::new(0x602a97209948e5cc), - Felt::new(0xb7d19db914da726), - Felt::new(0xe4e43672c24d376c), - Felt::new(0x8bb9f7465e019213), + Felt::new(0xfd185ff92b0d6665), + Felt::new(0x493b9e981a928985), + Felt::new(0x10a8cc048b503dfc), + Felt::new(0x431de81f245199a1), ]), Word::new([ - Felt::new(0x187bff077d393e3d), - Felt::new(0x17fb9a97c5055580), - Felt::new(0x618469c060eb2719), - Felt::new(0xfc7be4b58477e5ac), + Felt::new(0xe7bd111d49122dee), + Felt::new(0xf3cbc6eb3ae9ad03), + Felt::new(0x1aa06cb4e6bfd9d0), + Felt::new(0x7000818ef60948bf), ]), Word::new([ - Felt::new(0x1d40fcbc7a25cc97), - Felt::new(0xaee142f7cebadbd5), - Felt::new(0x22dbaed94300ddf8), - Felt::new(0xe069c36278753a06), + Felt::new(0x3f937eae6d1bc12f), + Felt::new(0x31a6204b20c50f62), + Felt::new(0x2cb6d3bf7fb63b71), + Felt::new(0x1c6cebf6859f190), ]), Word::new([ - Felt::new(0xcd1e21c5f02ce44d), - Felt::new(0x3b0ddbaa04daff25), - Felt::new(0xbb55cd14f54818c7), - Felt::new(0xc57f1b84ed302102), + Felt::new(0x23a2608bd7511a70), + Felt::new(0x2328fecd0c0a2f0), + Felt::new(0x143309aa803444bb), + Felt::new(0x2eecdeeb0b07b412), ]), Word::new([ - Felt::new(0x5c8e1f56cbdb0f87), - Felt::new(0xeeeb31b4d317cf1d), - Felt::new(0x8bf45cd3659a6d1), - Felt::new(0x9e179aa20693175a), + Felt::new(0x7d5255c15fc9e91e), + Felt::new(0x88fa800205f9bb7e), + Felt::new(0xd0d04e515e67def2), + Felt::new(0x1ed6ea55bc8dd77), ]), Word::new([ - Felt::new(0x10f58975fbb0fca), - Felt::new(0x5f35c19eb0f615c1), - Felt::new(0x9870cdafe46a3d), - Felt::new(0xcec9d9f3925df88b), + Felt::new(0xe9fc5915ab61bc1c), + Felt::new(0xe0fa6afd6ba01d69), + Felt::new(0xd68964b10660f670), + Felt::new(0x71ac2e66b0aae13b), ]), Word::new([ - Felt::new(0x89e90b2f029b50c0), - Felt::new(0xd78a4223d0036c8a), - Felt::new(0x996b326a1d5cd76d), - Felt::new(0x5b314d29bb1694e3), + Felt::new(0x4b9e9c11f88d00f5), + Felt::new(0x904f275afc6569f6), + Felt::new(0x239211eb0caaae5f), + Felt::new(0x65b0d08a872ad7e3), ]), Word::new([ - Felt::new(0x1be6e6955ba0f3a8), - Felt::new(0xc7e07c49076315ef), - Felt::new(0x93e91de5c7849fb2), - Felt::new(0xe81bc86fc641596f), + Felt::new(0x2d8d73f55112b25b), + Felt::new(0x26ec281b0f117fed), + Felt::new(0xa46f4c881fc9e482), + Felt::new(0x12f35ea175321d2a), ]), Word::new([ - Felt::new(0x5320464735f18522), - Felt::new(0x1a741214432ca63d), - Felt::new(0xaf3ed59d324bdbe8), - Felt::new(0x2493eb414c91ac94), + Felt::new(0xc925b59421e1185a), + Felt::new(0xece7ad8c5b6a7db5), + Felt::new(0xbc442d8a7c34f00b), + Felt::new(0xc374185ff90c0322), ]), Word::new([ - Felt::new(0x35897b61f231fa86), - Felt::new(0xb1531e954332f229), - Felt::new(0x92e950b1c1f874a), - Felt::new(0x469de0412ca52491), + Felt::new(0x7fba94f35276b575), + Felt::new(0xd625f7f21f1baac), + Felt::new(0xc41275842f9300ee), + Felt::new(0x5492c759b87ee3c9), ]), Word::new([ - Felt::new(0x1ecea76deca59ec5), - Felt::new(0xe884b570f5d54e45), - Felt::new(0x58939f3a1b5bc7e1), - Felt::new(0xf14eab10f926958f), + Felt::new(0x5e7ac2514a419f0), + Felt::new(0xb0199d08f87b3ed8), + Felt::new(0x13b400822a4b9e1d), + Felt::new(0xdb6b8650afbd6151), ]), Word::new([ - Felt::new(0x26251aa927a69723), - Felt::new(0xb1808fe0795ab008), - Felt::new(0xd195fe923d1944c9), - Felt::new(0x2334a61c28dc63c), + Felt::new(0x8376cb5929253d7c), + Felt::new(0x42d91f237dd12ad6), + Felt::new(0x9e67f40f473b732), + Felt::new(0xeca585705164c30c), ]), Word::new([ - Felt::new(0xe4b659081d9cf4e4), - Felt::new(0xf1174a5f72916819), - Felt::new(0x1de902b42b3b4054), - Felt::new(0xbe2bc215120367d0), + Felt::new(0xf56d326ab2704657), + Felt::new(0x36b7b3cbb427dac5), + Felt::new(0xf5a3c35828d1dc16), + Felt::new(0xe4cfcc9f8e73ad43), ]), Word::new([ - Felt::new(0xfc87b8043d32428f), - Felt::new(0x8f8cb244e3ddf6da), - Felt::new(0xc7539186ece143a7), - Felt::new(0xf28008f902075229), + Felt::new(0xd8f934e88142ea2), + Felt::new(0x8ab48d17bb596fcd), + Felt::new(0x97e762d1913c0de5), + Felt::new(0xc8e798ef60c725c7), ]), Word::new([ - Felt::new(0xf76c24c9f86c44d3), - Felt::new(0x97c7abcbb6d07d35), - Felt::new(0x9d8e37a1697a0d4), - Felt::new(0xa3f818e48770f5fa), + Felt::new(0x2b33eb4fe46d78ff), + Felt::new(0xe4fbf85087422d68), + Felt::new(0xa3be71210e8f07c), + Felt::new(0xa1e41e6de4e24b04), ]), Word::new([ - Felt::new(0x885686c79c1cd95e), - Felt::new(0xcdebe76fd203c23e), - Felt::new(0xdf9b7cd5099673ed), - Felt::new(0xe60438536ad13270), + Felt::new(0x3499268114e2ff9a), + Felt::new(0x3a4eb48c12aad261), + Felt::new(0x343cfd326c8df4b1), + Felt::new(0x74cbc3fb5b2c35c5), ]), Word::new([ - Felt::new(0x7790809942b9389d), - Felt::new(0xa3d82432c31de99), - Felt::new(0xaea11fece88c7d27), - Felt::new(0x5cc764da96d0b2f0), + Felt::new(0xe2db367c1f0e87a4), + Felt::new(0x257b6b62b00cdc95), + Felt::new(0x8ad4bbfe269b4f24), + Felt::new(0x15a7808dae47469f), ]), Word::new([ - Felt::new(0x80e555c41170427f), - Felt::new(0x87e68144276d79c8), - Felt::new(0xebdc63f28aa58a53), - Felt::new(0x168dd22672627819), + Felt::new(0xf3f305ae11e902e3), + Felt::new(0xab8176baa941360), + Felt::new(0x673dd00da221d423), + Felt::new(0xf120e4140db91620), ]), Word::new([ - Felt::new(0xea1dc59c29da5b6c), - Felt::new(0xa33188c0a077761), - Felt::new(0xabd3c84cddbe1477), - Felt::new(0xd28244bc92f36e0f), + Felt::new(0xe13397eddcef1eb8), + Felt::new(0xbb461d028b2262e5), + Felt::new(0xbda28412299d8c4d), + Felt::new(0xf9a109d8f521a030), ]), Word::new([ - Felt::new(0xdadc2beb7ccfe3fa), - Felt::new(0x218532461f981fb4), - Felt::new(0xf0455f1d4e2f9732), - Felt::new(0xa7338b43d2b7e62d), + Felt::new(0x657ee72c8354d725), + Felt::new(0x3a4c9b595816234a), + Felt::new(0x34c6d1c59e857419), + Felt::new(0xde2140b75cda5dd9), ]), Word::new([ - Felt::new(0x195d8bc1cfe2711a), - Felt::new(0x44e392ba7e259f47), - Felt::new(0x480120d41e18ab3c), - Felt::new(0x2056ffb29c2d89d1), + Felt::new(0xb2f7808dd5314cd), + Felt::new(0x7c92e41ab97b7a69), + Felt::new(0x549f566db9a2d2cc), + Felt::new(0x3cbfc66615ab87c3), ]), Word::new([ - Felt::new(0x382e33ba5fe6ada3), - Felt::new(0x45402a8903efebc9), - Felt::new(0xb9b0d63a59c70da), - Felt::new(0x7afebd4726d8cfe5), + Felt::new(0xf8f3210f53c4a73c), + Felt::new(0xe02f8e93ca2188b3), + Felt::new(0xa85f1eec8661e796), + Felt::new(0xb54092a35c662891), ]), Word::new([ - Felt::new(0xbf60bf6b45a4c9d), - Felt::new(0xfb5b9b553646f19c), - Felt::new(0x9949b60ce7639da3), - Felt::new(0x9c62552c0d1868ff), + Felt::new(0xcc140605c8a0d881), + Felt::new(0x5c7fe7024738f5cf), + Felt::new(0x13c57d32b06956a5), + Felt::new(0x2bff77fe08d36405), ]), Word::new([ - Felt::new(0xdb2a0aba0fc5e4f8), - Felt::new(0x8ee4f01d4b0fa49e), - Felt::new(0xd70a17a77b5c4a03), - Felt::new(0x57aaaa5b48fea66e), + Felt::new(0x604a6b8a3ae5b211), + Felt::new(0x5b14ba687fb547f6), + Felt::new(0x45f41c6840cae70), + Felt::new(0xb4d5c4e603e7cc3b), ]), Word::new([ - Felt::new(0x6d635940443564cb), - Felt::new(0xc7fbf0e26b5e3ff6), - Felt::new(0xa45bce664368b65e), - Felt::new(0xd6c5c1a92be0c60d), + Felt::new(0x1fdc3eb7a3d09c11), + Felt::new(0xe10c597520ebbeba), + Felt::new(0xd9d46277af171b81), + Felt::new(0xfb66d8ffed0bef45), ]), Word::new([ - Felt::new(0x6ea62d6033fb2dd3), - Felt::new(0x1a37910cf90ec6d8), - Felt::new(0x83d826e9933760b5), - Felt::new(0xf8387c90d9c6b5a9), + Felt::new(0x3b19f1217bb8ac2c), + Felt::new(0xc30c4d66bc8307e3), + Felt::new(0x2937cf7d450d6ec6), + Felt::new(0x1a3d27024116c65a), ]), Word::new([ - Felt::new(0x134766f1da2fbc91), - Felt::new(0xcfaeea545df2c757), - Felt::new(0xd0accefaed1eaa0f), - Felt::new(0xec38d4053f84b163), + Felt::new(0x43e05c31ac79e6e1), + Felt::new(0xe0e4963f57bdad22), + Felt::new(0x5d6a9d02318c7052), + Felt::new(0x2ab9fd1657a6fadb), ]), Word::new([ - Felt::new(0xb02ad1e757380aee), - Felt::new(0x4538b8ea13112d4), - Felt::new(0xb2d761fe842a2a85), - Felt::new(0x8e98d58adf5a1f29), + Felt::new(0x870787ce13b67a3f), + Felt::new(0xdf6f383b7692c34b), + Felt::new(0xec1f9575cae0fb8c), + Felt::new(0x1ed224d4a11a1cac), ]), Word::new([ - Felt::new(0x44603d9549ddee64), - Felt::new(0x43de72d570967bbb), - Felt::new(0x4a3e71144e62d0fa), - Felt::new(0xffb2fdcb48965939), + Felt::new(0xb14f93cd4d7a6190), + Felt::new(0x1175e467ae8927f1), + Felt::new(0xd766f48993f79b8d), + Felt::new(0xd0ecb7b95da7a3a), ]), Word::new([ - Felt::new(0x606f3ee12fe9ec0c), - Felt::new(0xe7d494ab8e483d87), - Felt::new(0x3b47f7c0d316cd4a), - Felt::new(0x86f941c7fa834581), + Felt::new(0xf295cc19be44b7b), + Felt::new(0xf8c363f4ccd43929), + Felt::new(0x25dd3ecc30d5444b), + Felt::new(0xa063f10b17b9dcb0), ]), Word::new([ - Felt::new(0x30c2385facf08b86), - Felt::new(0x4446168e25ac2c21), - Felt::new(0x61c6db1c3f283b21), - Felt::new(0x2fdf6bc360bf803), + Felt::new(0x8d5d0e77c8267630), + Felt::new(0xaff7c4d2f12478c9), + Felt::new(0x2a33f3ba8713cfc4), + Felt::new(0xc1280360eb72e35f), ]), Word::new([ - Felt::new(0xeec8d9cc3e46d243), - Felt::new(0x65bcae511dcce39), - Felt::new(0xd3da5bbfdbd09cd3), - Felt::new(0xe7c35fc3d11216a5), + Felt::new(0xd65de0b57652adc7), + Felt::new(0xfbfb5deaa67d3f5f), + Felt::new(0xf80fed0effee9198), + Felt::new(0x7e139def23feb7a8), ]), Word::new([ - Felt::new(0x841fb6fb35e7b49b), - Felt::new(0xfc4e2e1239caa7b8), - Felt::new(0x37cb93ec88f102e5), - Felt::new(0xa707a1556032152c), + Felt::new(0xb4cf7c907eb0febe), + Felt::new(0x176f5bcbca3a6edf), + Felt::new(0xc6b4758c8ae4d5e9), + Felt::new(0x93c702b36ef009ea), ]), Word::new([ - Felt::new(0x37c67bd7b7cef984), - Felt::new(0x75bbe46da2ee5c90), - Felt::new(0x3a5c568d1f71cab1), - Felt::new(0x36939cdca2dc0b55), + Felt::new(0x7f9cd2b8111f7fc9), + Felt::new(0x8764ee15c8a8fd1e), + Felt::new(0xfbe86cb1e581a8ee), + Felt::new(0xb841aba3fe114522), ]), Word::new([ - Felt::new(0x4f76756a55f3a644), - Felt::new(0xd30f8fa45394aff4), - Felt::new(0x65c55096158b202f), - Felt::new(0x368a5fb0b0d475d0), + Felt::new(0x6b64364593166c72), + Felt::new(0xbd45aadb0cb8be97), + Felt::new(0x55e33691198d1c63), + Felt::new(0xdf152a5bc9d89ec1), ]), Word::new([ - Felt::new(0xa9b9acd256cabb0f), - Felt::new(0xd8b1170f301208c7), - Felt::new(0xab152f908d46bf8), - Felt::new(0x1b7a10556730ec16), + Felt::new(0x8f92a67707c031ee), + Felt::new(0xa7e9c99dcdce915f), + Felt::new(0xa8c464c9655377e8), + Felt::new(0x3f9862d16c624dc5), ]), Word::new([ - Felt::new(0xd967a72076e3059c), - Felt::new(0xbd1015a08ffe8881), - Felt::new(0xf72f186dde0c6e78), - Felt::new(0xa58910205352895a), + Felt::new(0x122f73b5cf63f6e), + Felt::new(0xab8a77660bf07314), + Felt::new(0xdb4a9f742ac96790), + Felt::new(0x2c744408fb6e9114), ]), Word::new([ - Felt::new(0x130333f2fd400a4d), - Felt::new(0xf20104837a118d6e), - Felt::new(0xda1e5d608fb9062c), - Felt::new(0xb8ac5c76d60950b8), + Felt::new(0x31504ebc54a0b34), + Felt::new(0x93a548139238f54e), + Felt::new(0xa44eab497d5f43de), + Felt::new(0xa47c24d2b11970b4), ]), Word::new([ - Felt::new(0x65d0deae6fb0c6cb), - Felt::new(0x1b442ae344dcd9e7), - Felt::new(0x1eedabab8fc07fa4), - Felt::new(0xb0dc89b96f256189), + Felt::new(0x90bd7b36e037e432), + Felt::new(0xf03b6474b5a7fed), + Felt::new(0x1049be2c887db78f), + Felt::new(0x45bfc229a2fe81fb), ]), Word::new([ - Felt::new(0xef88de626968c17a), - Felt::new(0x569a01072cdbbc2b), - Felt::new(0xc99bbba6d083c68f), - Felt::new(0x9ed4a176fe341849), + Felt::new(0xabcefab499c0518e), + Felt::new(0x8bed8a8c40f921d2), + Felt::new(0xf4ae6b74a02eb437), + Felt::new(0x6c4d719eb921ae9d), ]), Word::new([ - Felt::new(0x5d49d1e9d17448a6), - Felt::new(0x6974d510bc47ee66), - Felt::new(0xbcbea4dec0b68586), - Felt::new(0xdaa5457e0cfd3e61), + Felt::new(0x260185045bb46d9d), + Felt::new(0xcf6ec8ae1f324cde), + Felt::new(0xbf83f33d0d1f4e54), + Felt::new(0x3e7ca1d7b25b432d), ]), Word::new([ - Felt::new(0x9fceba739503cda0), - Felt::new(0xb9daf271ac42c8ba), - Felt::new(0x10fe3e8de8680d83), - Felt::new(0xd7e1dc73ced7730b), + Felt::new(0xb8f8851ca74c1cda), + Felt::new(0x4f6df636586033d9), + Felt::new(0x6c994c0373b29e0a), + Felt::new(0x73dbba9f1ed6e62d), ]), Word::new([ - Felt::new(0x93ec6c422d4271ea), - Felt::new(0x73923813232b0e70), - Felt::new(0xbbe6a4441a900b65), - Felt::new(0x36b2164f37c9319b), + Felt::new(0xc25d70362fbb8e6), + Felt::new(0x9cf890e6f04bcd17), + Felt::new(0x8a0de9733a8073fe), + Felt::new(0x46530c0b1af91701), ]), Word::new([ - Felt::new(0xce3ecb2eed624694), - Felt::new(0xb7e1d75fff7a454c), - Felt::new(0x86c24aa3a8d92d2b), - Felt::new(0xb1ba74cafa9ce649), + Felt::new(0x2833f20b21253d73), + Felt::new(0x171651cfff7653e7), + Felt::new(0xaf46abb15edab5d6), + Felt::new(0xf6c4fbcf9bfb1d00), ]), Word::new([ - Felt::new(0xb5fae724eb357479), - Felt::new(0x359532ddc4840cb9), - Felt::new(0x4b111251e037e9fa), - Felt::new(0xfcdab1cdd314c1d9), + Felt::new(0x977adf260beec8f9), + Felt::new(0x5b1d61a580e45560), + Felt::new(0x73ca72831e5ed08b), + Felt::new(0x22ff61c90fb6e384), ]), Word::new([ - Felt::new(0xb3a89464d21c9ff1), - Felt::new(0x8136e1b457a59ca8), - Felt::new(0x88b0fa606b53c4d5), - Felt::new(0x89645f8a9dfe97a2), + Felt::new(0xad56100db7ca3d2e), + Felt::new(0xc5d8ae7a5383a975), + Felt::new(0xa98f96eb5c11adda), + Felt::new(0x7d237a5fe25e1eb), ]), Word::new([ - Felt::new(0xfe115ef35b814cbf), - Felt::new(0x63de467fb93b6851), - Felt::new(0x17c73b03c9f44ad8), - Felt::new(0x53742721f568b5be), + Felt::new(0xa07becb353f7632d), + Felt::new(0xe6e9d83924e7d496), + Felt::new(0x12ca0d4e0dbe8926), + Felt::new(0x6f91ced93d13bbc9), ]), Word::new([ - Felt::new(0xd8110ea6e905cc2), - Felt::new(0xd67b3c7cea25100), - Felt::new(0x9e49b38ed51d1c60), - Felt::new(0xe9e24f9b597c9bfd), + Felt::new(0x6205022f021e9e52), + Felt::new(0xb21425564d0dc6e), + Felt::new(0xd01417852116ed4), + Felt::new(0xc6e8873a45103e07), ]), Word::new([ - Felt::new(0xefe9086b5bb5a504), - Felt::new(0x991f92a90c9346a3), - Felt::new(0xe4fab215a20f453b), - Felt::new(0x4e4d4dde9146d61a), + Felt::new(0xa5f38eebc66c8343), + Felt::new(0xa450e9296284f3d5), + Felt::new(0xe37183efd7fdcf95), + Felt::new(0xd6bb1cb064b35688), ]), Word::new([ - Felt::new(0xaa998c3b26497ffa), - Felt::new(0x985bd5cf4ccefb3c), - Felt::new(0xce44e80aa02424bb), - Felt::new(0x75158a37503aed75), + Felt::new(0x748b2d0dd944d29b), + Felt::new(0xd3b3b54a3da8a1d3), + Felt::new(0x21d7bd2270d61e92), + Felt::new(0x9b75fa746ae8b2a1), ]), Word::new([ - Felt::new(0xdb61760c917116f1), - Felt::new(0xf378c9645174a832), - Felt::new(0x1216aa71b73e7fac), - Felt::new(0x8a4e7f0591a129fd), + Felt::new(0xa511501f657507a0), + Felt::new(0x19165e4754f3ed9d), + Felt::new(0x2ace29354f4e1d8f), + Felt::new(0xadce35ebef9d24f3), ]), Word::new([ - Felt::new(0xaf11a04daaf4ed67), - Felt::new(0xd3e59f0d7dad9064), - Felt::new(0x30c206089a2c294d), - Felt::new(0xe104db59761e8a99), + Felt::new(0xd4ba2d693b3633f7), + Felt::new(0x52efedf7c2ac4aaa), + Felt::new(0xeb37284afc24c35b), + Felt::new(0x863f13cc0bf171fb), ]), Word::new([ - Felt::new(0x70b545ba7a6d447), - Felt::new(0x6ac0e423ddf68913), - Felt::new(0xf9b50997257bb033), - Felt::new(0xdac37c7b1c18b48a), + Felt::new(0x8adabc40751600f6), + Felt::new(0x5238237a22320513), + Felt::new(0x505d4119aff831b5), + Felt::new(0x737bd824227bdf79), ]), Word::new([ - Felt::new(0xd182b9dff0fcd5c0), - Felt::new(0xf87619ae86b6eb02), - Felt::new(0x6838c1b612b17cb5), - Felt::new(0x9b705d5b6bcf92c), + Felt::new(0xc1de282526b1afb), + Felt::new(0x19f8e7f3bf0385ff), + Felt::new(0x55fb725d5460a86e), + Felt::new(0xcad39afdf9fa734c), ]), Word::new([ - Felt::new(0xfba622b3026c6193), - Felt::new(0xdacde486f8129b96), - Felt::new(0xd5acd22a7c2cf6aa), - Felt::new(0xf5beb40535e6c0f2), + Felt::new(0x637e4a633e7de21c), + Felt::new(0x29d2c89b8f2a2ec), + Felt::new(0x69a37600dd8006f9), + Felt::new(0xffe3ace3832836be), ]), Word::new([ - Felt::new(0x59bde17b2d501969), - Felt::new(0xb4abe1389123d3b9), - Felt::new(0x683d8dd8635d9a67), - Felt::new(0x347e01da4c07833), + Felt::new(0x7e7bb406e6e68eb6), + Felt::new(0x42fd1a00fe90f07a), + Felt::new(0xdc929ff5c1f95f36), + Felt::new(0x2e0fcdc7ec106f74), ]), Word::new([ - Felt::new(0x4e28956ab7162a06), - Felt::new(0xccfcc7358f48c727), - Felt::new(0x7b3485f20c979144), - Felt::new(0xeeb27fa694f1c8fd), + Felt::new(0xb8edfe12d74f2432), + Felt::new(0x90655225dc06dad8), + Felt::new(0x187b20a22e063446), + Felt::new(0x99e524f17a47f4ab), ]), Word::new([ - Felt::new(0x275b2c0ee883807b), - Felt::new(0x8f68f2016c1391cd), - Felt::new(0xb59fdccb20322765), - Felt::new(0xeb9b902c5351d5d4), + Felt::new(0xe3214c002b4d91b9), + Felt::new(0x8ce0980a402beea4), + Felt::new(0xb80bd13058762136), + Felt::new(0xefd36e8aaa35a4eb), ]), Word::new([ - Felt::new(0xb767d8cb8816cc8e), - Felt::new(0xbd29bb02cdcbc9af), - Felt::new(0xeb1dca9bfebee6f), - Felt::new(0x57597da8109c0354), + Felt::new(0xc8c24a71db116def), + Felt::new(0x9fda558b10f464f3), + Felt::new(0x834f584b76c4f511), + Felt::new(0x8879a92b279f5dff), ]), Word::new([ - Felt::new(0xeb32a8db8cf216), - Felt::new(0xeb5532ac68f304c1), - Felt::new(0x9bca72ffccb957ee), - Felt::new(0x33d4b152ebedb841), + Felt::new(0xa9cc91a4844140ba), + Felt::new(0xd99c820f6ba53279), + Felt::new(0x22ce2e5c1bb67c2), + Felt::new(0xe4ed89b91a3215bc), ]), Word::new([ - Felt::new(0x439b20dce9810169), - Felt::new(0x2b693e2530a1b88c), - Felt::new(0x36b8898f4e900c7a), - Felt::new(0x7bf5064dde3a0da1), + Felt::new(0xb1f07af2b0d44426), + Felt::new(0xc93ac44cec3001b6), + Felt::new(0xa0cc5631afe8a52), + Felt::new(0xefc2eb64204581d0), ]), Word::new([ - Felt::new(0x8794201ce6158fe0), - Felt::new(0xfcc53644557471f3), - Felt::new(0xa66d87f6ae6f64d0), - Felt::new(0x4e876d9d933b2ad0), + Felt::new(0x4d596e360735cd62), + Felt::new(0x883c4a5afb24c772), + Felt::new(0xe6c74e3673dd040d), + Felt::new(0x6de900ae0a64e62a), ]), Word::new([ - Felt::new(0x6ff8f4900e43bab6), - Felt::new(0x40014f298cb7b9a3), - Felt::new(0x9d6b252ff946ee3d), - Felt::new(0xb014d99ab8508072), + Felt::new(0x72e1554134177582), + Felt::new(0x74c2dde1e7d50f7), + Felt::new(0x237367b8ff8d1b97), + Felt::new(0x7cdaec5a8f3596a7), ]), Word::new([ - Felt::new(0x9cdd5a4a37511cae), - Felt::new(0x684444122d770c18), - Felt::new(0x8982944b22a22577), - Felt::new(0x50a58d944629de54), + Felt::new(0x8d5ac0e295e9ad40), + Felt::new(0xb12011f67d462a4e), + Felt::new(0x6214a41f78b42e2a), + Felt::new(0x89d751210bd9bedf), ]), Word::new([ - Felt::new(0x853f5b8ad557fac3), - Felt::new(0xdab1743c03b8da56), - Felt::new(0xc70d6683d4f4c086), - Felt::new(0x2f1d0f67a5dfae4c), + Felt::new(0x5ee06879079ffec8), + Felt::new(0xaa7047aa22e4aefe), + Felt::new(0x18ae92e73f414cf8), + Felt::new(0xd8c2d9ed8a016651), ]), Word::new([ - Felt::new(0xf3b6fe76eb11284), - Felt::new(0xbeb9e98b146c63a8), - Felt::new(0xc7e8824fce7777ad), - Felt::new(0x5229918b04410d6a), + Felt::new(0x6bf7f0c5ef5fb62), + Felt::new(0x3ab988fe26df509e), + Felt::new(0xb8d98916a3d6f8c0), + Felt::new(0xb8a2ccf3d88aa22b), ]), Word::new([ - Felt::new(0xc170c46601ffc4f3), - Felt::new(0x1258e8e47103c39b), - Felt::new(0x612e99da984aac99), - Felt::new(0xc82fcfcf56d6dd94), + Felt::new(0xeb14f90eb129495), + Felt::new(0xad5544f3d2fa34a5), + Felt::new(0xa5dcbdb33fd3ae5f), + Felt::new(0xc146d0e211609f2a), ]), Word::new([ - Felt::new(0xf793819d04d5679d), - Felt::new(0xb738b97ec0a52dd3), - Felt::new(0x4df897389119a098), - Felt::new(0xa5af45eb0d007785), + Felt::new(0x23eeabdad5222559), + Felt::new(0xf94212e980d51b58), + Felt::new(0xf8bd5fcfc020fd47), + Felt::new(0x3e8c699a4f3f9ed0), ]), Word::new([ - Felt::new(0xfcf59c6c9d7280e7), - Felt::new(0x662b993b320f3345), - Felt::new(0xeb8e04ba28f156fa), - Felt::new(0xe72233ee6a444749), + Felt::new(0x35510ef512eba172), + Felt::new(0x243e71b8bb0bfa9), + Felt::new(0xc178c0407c5b8c5a), + Felt::new(0x719b9dbe54690edf), ]), Word::new([ - Felt::new(0x7ad6b7badfc9e757), - Felt::new(0x3332f340184af6f5), - Felt::new(0xe92a736dcdf52022), - Felt::new(0xf1759f8041119245), + Felt::new(0x7a729626722ec422), + Felt::new(0x5df920bef43b68be), + Felt::new(0xf44b13d234f9f0e3), + Felt::new(0x3ebe8b56ff76c2da), ]), Word::new([ - Felt::new(0x166382d3c8ca3a95), - Felt::new(0x36c8c25f971d771a), - Felt::new(0xe82cc977ee1402cc), - Felt::new(0xe13f6dc2ab919177), + Felt::new(0x521a6c924b85acd6), + Felt::new(0xda67ddaeeb322495), + Felt::new(0xb1f5cf4394b4c0b9), + Felt::new(0xd063bcdfbd1cca6), ]), Word::new([ - Felt::new(0x41fb8b9d5a9ab5e8), - Felt::new(0xb2a608f5d6fbc37d), - Felt::new(0xe81719d9778c54b4), - Felt::new(0xcc0d4373ef2bb8e1), + Felt::new(0x82b7e92b9a2d6c2), + Felt::new(0x6e7dc03dbd0e3887), + Felt::new(0x26574b1181171077), + Felt::new(0x21d1c72cda3ae50d), ]), Word::new([ - Felt::new(0x60b3788c45c1bc29), - Felt::new(0xcb38969a428c5423), - Felt::new(0xca11f6b9d957f57c), - Felt::new(0x7a166881648514cb), + Felt::new(0x4f1dd03ac44d5b93), + Felt::new(0x3719c2c17c16573f), + Felt::new(0xa62b25429e586d67), + Felt::new(0x91ece8161ce4fd47), ]), Word::new([ - Felt::new(0x3548d7dcbe4af37f), - Felt::new(0xb199194f25a6f55a), - Felt::new(0x751017bda8f0d816), - Felt::new(0x80117260c6525c4a), + Felt::new(0x74fed6086fa9e444), + Felt::new(0x9e1bb02f6d1ae35b), + Felt::new(0x9a1fac3e0d85b4ec), + Felt::new(0x851a0f32ff83ea46), ]), Word::new([ - Felt::new(0x1d1d34d842e95671), - Felt::new(0x38ab2833c4a2bded), - Felt::new(0x3a53caf5f6e20f5f), - Felt::new(0xfee946c5ebce837d), + Felt::new(0xfdf751ce8311a960), + Felt::new(0x995db041e58c6b4b), + Felt::new(0xfd2329370427b43b), + Felt::new(0x5464a4535b97b588), ]), Word::new([ - Felt::new(0x65dbb5d849e46f92), - Felt::new(0x753679d0d09d1250), - Felt::new(0xc539adf9062e7698), - Felt::new(0xd76f4b13d2635af3), + Felt::new(0x566bb18034c4f2df), + Felt::new(0xa29b8f0166ee91e6), + Felt::new(0xd99f7d8bac1a300e), + Felt::new(0x3623e182ecfaa2d1), ]), Word::new([ - Felt::new(0x9eae446581f7076d), - Felt::new(0x237138e3a1c55ee8), - Felt::new(0xfb54da0b58969484), - Felt::new(0x9a899375c4f10483), + Felt::new(0x28bb3fa02deeb5f4), + Felt::new(0x9973c94fe575f58), + Felt::new(0x7fecf369b4c75201), + Felt::new(0x46ac9e6ef87b64db), ]), Word::new([ - Felt::new(0x88b12578d3c36cc4), - Felt::new(0x9cd868d6a29df146), - Felt::new(0x5443d21524637821), - Felt::new(0xceb3692fad9f76b9), + Felt::new(0x77156d3318b84c9c), + Felt::new(0xe90ac7f7735d014e), + Felt::new(0xd94597b0f9c42ca5), + Felt::new(0x98e1722780783100), ]), Word::new([ - Felt::new(0x4e45d3e34ebfcb0d), - Felt::new(0xedca6a0f8d90eb2e), - Felt::new(0x1a182dad4a914731), - Felt::new(0xd89946f41f53f106), + Felt::new(0x88a527fe1a96e0f4), + Felt::new(0x91cff1cafe6246bf), + Felt::new(0x5fa8b7963f0a33cf), + Felt::new(0x1a508cdc64416220), ]), Word::new([ - Felt::new(0x42a89e1abee8b12d), - Felt::new(0x3af360678475225a), - Felt::new(0x3e28a1cdede0c7a3), - Felt::new(0x25cc76ad1c8788e), + Felt::new(0x87a89450bc5f86cb), + Felt::new(0xa3525d6cc28b29a8), + Felt::new(0xa987ca169f962184), + Felt::new(0x8d693a95bf3b308b), ]), Word::new([ - Felt::new(0xa6e955e3b0721737), - Felt::new(0xbbd721b51cbc605f), - Felt::new(0xfa537854669f20a5), - Felt::new(0x2a1ab83bb24d43f7), + Felt::new(0xb3ac2bf2d6bf6a1b), + Felt::new(0x400de6a583281412), + Felt::new(0x48c37a98a327cb2d), + Felt::new(0x8f07ad8c5f976fff), ]), Word::new([ - Felt::new(0x1c289dc62c4e7907), - Felt::new(0x186437cf1f8b3abf), - Felt::new(0x929244addee54abf), - Felt::new(0x42ec87a9141b58fb), + Felt::new(0x7c7e5b1bf28628d1), + Felt::new(0x5431db8f2d931abc), + Felt::new(0x2ff48e4d67c941b4), + Felt::new(0xb12eb971883414ae), ]), Word::new([ - Felt::new(0xf5ea743b81e59fee), - Felt::new(0x32e2c826d0fc57d4), - Felt::new(0xbc411bca1b745388), - Felt::new(0xc9af8de5bc3b8692), + Felt::new(0x6600bdb29e65b07a), + Felt::new(0x717cfd190413ab00), + Felt::new(0xcf168b5a3866ff72), + Felt::new(0xbea885247f7da786), ]), Word::new([ - Felt::new(0xf75129028d95ebab), - Felt::new(0xf9d02d7713784ff2), - Felt::new(0x944b5fea457c946b), - Felt::new(0xa6645d6f5389a91f), + Felt::new(0x330ed69ada6e87ed), + Felt::new(0x185406699f6df77d), + Felt::new(0xd439f4a71006e469), + Felt::new(0x361e9bfaf5ed849c), ]), Word::new([ - Felt::new(0x236ce9e32fb0131c), - Felt::new(0x92cac3a2b67600b8), - Felt::new(0x437914d1d9e409bb), - Felt::new(0x6bff102a4ea81e38), + Felt::new(0x9c768b1bf13ac484), + Felt::new(0xd9d4c94e6f5aca01), + Felt::new(0x43d63d3adddd2408), + Felt::new(0x973d4a38470f26fb), ]), Word::new([ - Felt::new(0x9906825ec6d45f25), - Felt::new(0x1245ccf4121950a2), - Felt::new(0xff82337f357949bb), - Felt::new(0xe1f59f6b824f97af), + Felt::new(0xbcf2e27086297a62), + Felt::new(0xa9a9e6af284d1e9), + Felt::new(0xb50cc0e2ba6d8ef3), + Felt::new(0xd0124f1e61a89e12), ]), Word::new([ - Felt::new(0xd6030ea8046f0d1e), - Felt::new(0x69fd3c732586f5db), - Felt::new(0x765cccb10c151f30), - Felt::new(0xd1bad2f1ba1bdc5b), + Felt::new(0xb4c0b52477226b1f), + Felt::new(0xb1755a2a840a831), + Felt::new(0x8de661c5f4bd9276), + Felt::new(0x8d124f0f3082cfbc), ]), Word::new([ - Felt::new(0xd4a0cff6578c123e), - Felt::new(0xf11a17948930b14a), - Felt::new(0xd128dd2a4213b53c), - Felt::new(0x2df8fe54f23f6b91), + Felt::new(0x6ed5ae308aa4bc7e), + Felt::new(0xe6a058fd79632207), + Felt::new(0xb951365f5848d42a), + Felt::new(0x5351e6e47fed2efd), ]), Word::new([ - Felt::new(0xa891ab94552907b2), - Felt::new(0xc64b69708f99b16e), - Felt::new(0xb99d29be9af9df15), - Felt::new(0xa452647d61bd3d7b), + Felt::new(0x8bf48a21b17ebfa2), + Felt::new(0x1f109ebbbfa3399f), + Felt::new(0x3c9b44b1248c31c0), + Felt::new(0x63adebe371b8bc48), ]), Word::new([ - Felt::new(0xd339a7d5f35bdf7e), - Felt::new(0x296127097a98dbdd), - Felt::new(0x66d3eac876c1a984), - Felt::new(0x2714db555ccbdca4), + Felt::new(0x222099944ea7cc27), + Felt::new(0x316d0d6f15f41f46), + Felt::new(0xf17a1c6075a142f6), + Felt::new(0x35e50a02433991d7), ]), Word::new([ - Felt::new(0x6ca87920a067acd6), - Felt::new(0x55a102d742879de5), - Felt::new(0xa3f57a4b6a56d7f3), - Felt::new(0x18770879a832a177), + Felt::new(0xfb2367e02a63a830), + Felt::new(0xec1c038af97c4bd1), + Felt::new(0xb3d489220fbb7df3), + Felt::new(0x792cb7969609334a), ]), Word::new([ - Felt::new(0x1208793a0a77e984), - Felt::new(0x89ed5a1f45b34219), - Felt::new(0x8d74e6f75e77ef03), - Felt::new(0xa78cc9b7d29a1ee9), + Felt::new(0x8d76893d4ca22979), + Felt::new(0x2c7ba9d515b4e3f4), + Felt::new(0x39edc914820c4ca0), + Felt::new(0xe639b77a01292a15), ]), Word::new([ - Felt::new(0x345fffecefd56a65), - Felt::new(0x23dec03b9f663006), - Felt::new(0x66f452be070b34d8), - Felt::new(0xe1c6aaaa54765dc), + Felt::new(0x9b29640d071b0f11), + Felt::new(0x308cb2d119d63acc), + Felt::new(0x5d573a7d33b488cd), + Felt::new(0x7eeb10baca790915), ]), Word::new([ - Felt::new(0xb7b714ca60c77011), - Felt::new(0x5ffe9476baa10259), - Felt::new(0xbea15cd2b4150dda), - Felt::new(0x4467804ab919e3d8), + Felt::new(0xcaa0baf1eb15ce67), + Felt::new(0x89f30dae011914da), + Felt::new(0xbb9a31468b153cee), + Felt::new(0x1b92a7d0d1fce8bb), ]), Word::new([ - Felt::new(0x21c65ff7a4185640), - Felt::new(0x5d20fffcc7779035), - Felt::new(0x92b571249fa728d5), - Felt::new(0xe9e2eeca83b49342), + Felt::new(0x7705c0b4816f8c8e), + Felt::new(0xa0ee27f0210207dc), + Felt::new(0x1ec9024f4368818a), + Felt::new(0xf3bf993f2fe0f538), ]), Word::new([ - Felt::new(0x2be46f9d0b431948), - Felt::new(0xa5c1a12c95a56f44), - Felt::new(0xc620adca5cd874), - Felt::new(0x51c64b969c1dc0c9), + Felt::new(0xa029e705850e3a3e), + Felt::new(0xe277c0af06a2b9ff), + Felt::new(0x4c40b30cc5b95beb), + Felt::new(0xc0b36a51afe62f5a), ]), Word::new([ - Felt::new(0xae9e7f421ab12b3f), - Felt::new(0x5f90e40cdb47bbec), - Felt::new(0x3d2a6be00ce19d31), - Felt::new(0x609632a98643a06c), + Felt::new(0xdff45e106cb643b), + Felt::new(0x99559a0e5499fe9b), + Felt::new(0x81c5e8b6020138fe), + Felt::new(0xbf6e1cb9cb625a6b), ]), Word::new([ - Felt::new(0xde0f38c1d4cf5977), - Felt::new(0x3d6f0f44105b0fb2), - Felt::new(0x5f34005bed22db6f), - Felt::new(0x377009a91543c872), + Felt::new(0x9388e9a0b434071f), + Felt::new(0x784722585f5a7aa2), + Felt::new(0x221afc22061b63b2), + Felt::new(0x341153b01693c583), ]), Word::new([ - Felt::new(0x8763f1c59420f662), - Felt::new(0xbe15cc9b37fdbdb3), - Felt::new(0xeed75857d5451487), - Felt::new(0x10b3507901fcfb8b), + Felt::new(0x9177622e69ded3fe), + Felt::new(0x34324c4324e12cd5), + Felt::new(0x59a6b81b4e0c9321), + Felt::new(0xf267e523cd486bcd), ]), Word::new([ - Felt::new(0x2e40aeb53f7ba2f5), - Felt::new(0xed598b103221e46), - Felt::new(0xed943dae7f3be8f7), - Felt::new(0x7115a61b37a95c30), + Felt::new(0xc5d14c4b40b190ed), + Felt::new(0xc7437bdd38e193c6), + Felt::new(0x55d189d25bc408e6), + Felt::new(0x68df3f58ce2cd9f9), ]), Word::new([ - Felt::new(0xef9bdb6947abe190), - Felt::new(0xfe47c74c5ad62e2b), - Felt::new(0xf85ee41bc6960d64), - Felt::new(0x55e51b57d5990e2b), + Felt::new(0xa68327c1bef41681), + Felt::new(0x23dbfd6200a53231), + Felt::new(0x498254d87f792150), + Felt::new(0x2a44b2f4aa95eb36), ]), Word::new([ - Felt::new(0x81798808c02cffe0), - Felt::new(0x22df79cb29991e51), - Felt::new(0x965714f831e09f90), - Felt::new(0x67ac8aef55047894), + Felt::new(0x64e0617f2fa74e39), + Felt::new(0x96e6deb7cc18acf3), + Felt::new(0xcb387346b641d5a9), + Felt::new(0x8812aec31d8823a2), ]), Word::new([ - Felt::new(0x321d58dfe138e326), - Felt::new(0xee80b399b444c937), - Felt::new(0x6cbc565ad3d69ccf), - Felt::new(0x6ea9e44922bdc48e), + Felt::new(0xe692e4887677c8fe), + Felt::new(0x14f2fc14386b22d6), + Felt::new(0x28100128fd3c512), + Felt::new(0x459ceee98dbd974e), ]), Word::new([ - Felt::new(0xf2a11cd35120f6c3), - Felt::new(0x4e77378973b2ca8), - Felt::new(0x1adb26e6c1630440), - Felt::new(0x42e5495895baee92), + Felt::new(0xac762fde8050484f), + Felt::new(0x730af9b96aa010d2), + Felt::new(0xd78518c6bd98bb61), + Felt::new(0x3cf65f2ca5df413f), ]), Word::new([ - Felt::new(0xe07020daabcdebae), - Felt::new(0x2d5c6456b50a05c3), - Felt::new(0x3050bdec1715085b), - Felt::new(0xe4d05bce00c4f30d), + Felt::new(0xb5b906b764d00027), + Felt::new(0x9fef3c78c401e2dc), + Felt::new(0xf97396aa3bc7c85a), + Felt::new(0x47e536bc737555b8), ]), Word::new([ - Felt::new(0xe64d54038f19cbc3), - Felt::new(0xde70db9c37ffc1a6), - Felt::new(0xb4a54682fe025b15), - Felt::new(0xcb4e28247a791f29), + Felt::new(0xd5ffa2b14d89afff), + Felt::new(0x96709c25efd3e35), + Felt::new(0x9861444eea858fd), + Felt::new(0xe97e7ef564aab34), ]), Word::new([ - Felt::new(0x9cd2815cef52b092), - Felt::new(0xd46fa4485d7aaf5c), - Felt::new(0x275777fd3b9637f7), - Felt::new(0x684317aab8bb48da), + Felt::new(0xd7e3fbf61c6f8223), + Felt::new(0x161c8894f336f976), + Felt::new(0x4aa5779491256f1a), + Felt::new(0x13304f507cef63a3), ]), Word::new([ - Felt::new(0xfef7ca5bc1a8531), - Felt::new(0x66da24a709f70f60), - Felt::new(0xc6d0048b0222dc8d), - Felt::new(0xd82cc216eed266b4), + Felt::new(0x73150e203e8b9f59), + Felt::new(0x7cc26c0dc04c2d24), + Felt::new(0xc4e2e3c2e2fe31b), + Felt::new(0x7144f633a0728c93), ]), Word::new([ - Felt::new(0xc11007d4b20c68e8), - Felt::new(0xb88dea2c92f105d1), - Felt::new(0xfe885fceee959992), - Felt::new(0x4d8c71eeb47c8f90), + Felt::new(0x4c34aa465787c650), + Felt::new(0x1f5b6b30b3886ad8), + Felt::new(0x85d5d22c426637b6), + Felt::new(0x714938f35901a5a6), ]), Word::new([ - Felt::new(0x980fbe89dd050886), - Felt::new(0xdb7ad3a9a9f39be1), - Felt::new(0xf830b6439c7e9bc0), - Felt::new(0xdd76938b7c686c07), + Felt::new(0xf2458896b53e2072), + Felt::new(0x1d276282b4ca608e), + Felt::new(0x5383200c860ff1bb), + Felt::new(0xe1ab1f4d0e13baeb), ]), Word::new([ - Felt::new(0xb678629d183cf841), - Felt::new(0x664f19c21a6465bc), - Felt::new(0xba142578e79eb9d0), - Felt::new(0x1d57cbcdb2bbcb18), + Felt::new(0xf5d5c034a0297f9b), + Felt::new(0x8fe0d16710676fb6), + Felt::new(0x45efb3bf6031097a), + Felt::new(0x7a3ebc763170cbff), ]), Word::new([ - Felt::new(0xc8822aae44990ed3), - Felt::new(0xf7edce1d2a235ab4), - Felt::new(0x8f35d229e981ca01), - Felt::new(0x50dc4c673c8fc58), + Felt::new(0x700f4c46edd1c1ba), + Felt::new(0xb891fdd1dcc9b4ce), + Felt::new(0xa0eca77abaa82648), + Felt::new(0x1fa70514c05600d2), ]), Word::new([ - Felt::new(0x86edc215b92306e7), - Felt::new(0xe333ce17fd0f40df), - Felt::new(0xabcca6409bb48e29), - Felt::new(0xa110affea61c2951), + Felt::new(0xce651dadc88f1d12), + Felt::new(0x70bb2fe45f3d6441), + Felt::new(0xc9084119c4b1c48c), + Felt::new(0x6eadd41d575eb231), ]), Word::new([ - Felt::new(0x269d782ba380a2e4), - Felt::new(0x32bdc65a619310cd), - Felt::new(0x52895e02cb1df991), - Felt::new(0x1749f76388896455), + Felt::new(0x9ad37c76486ddbd4), + Felt::new(0xc4441d6d4537cea8), + Felt::new(0x35217566b537e99c), + Felt::new(0xb3286d64bc3a8c0e), ]), Word::new([ - Felt::new(0x8f99ac4698f12102), - Felt::new(0x9983407c99f948c5), - Felt::new(0x7b89856f980cb407), - Felt::new(0x8acff0a017e68367), + Felt::new(0xb52d785f4d08ef1a), + Felt::new(0xce18284b28477fb7), + Felt::new(0x5b1786b38931c1b4), + Felt::new(0x4eb6848ccfafea80), ]), Word::new([ - Felt::new(0xe7983973c759318a), - Felt::new(0xb389a6754d7976ca), - Felt::new(0x1d7ded5044c6ede6), - Felt::new(0x4290fc214bd001d7), + Felt::new(0x8d1f5927e174300d), + Felt::new(0x82ecc51e9f8fd848), + Felt::new(0x70d2d1205acc7410), + Felt::new(0x450f26de53764aea), ]), Word::new([ - Felt::new(0x2a1607db398812eb), - Felt::new(0xbbaaed6d5de95899), - Felt::new(0x53699ff1add9cc48), - Felt::new(0x71c99c4c20a2cbe9), + Felt::new(0x78d2b10fa83c20a3), + Felt::new(0xba4aa51f82f228df), + Felt::new(0x931595bcd91f012e), + Felt::new(0x806ce2ed4ff375d7), ]), Word::new([ - Felt::new(0x9c211abaf37beba7), - Felt::new(0x44f91ee2c8f84830), - Felt::new(0xdaf1ca95546ff105), - Felt::new(0x4d15218eb972c855), + Felt::new(0x7f9d9c145a6d8f34), + Felt::new(0x1589efb30430f049), + Felt::new(0xdaae113fe8ea8bf), + Felt::new(0xc22d9ed231e180b8), ]), Word::new([ - Felt::new(0x47018b067647ff40), - Felt::new(0xabd25bc93e3cd280), - Felt::new(0x1e33fd9953262800), - Felt::new(0x9b8f68c64db159c3), + Felt::new(0x6c9cce48f777b8db), + Felt::new(0xc963033cdfcc3eac), + Felt::new(0xfad09eedfff0482a), + Felt::new(0x28eb5607a25a5cc9), ]), Word::new([ - Felt::new(0xa20fb2bcf2636418), - Felt::new(0xdc8996a5085ba820), - Felt::new(0x349b49cddfc936d4), - Felt::new(0x1d816c1d0bfef815), + Felt::new(0xa00aef448a097720), + Felt::new(0x31db189b5c633c34), + Felt::new(0xcee74e8d4a496da), + Felt::new(0x1a31a14cce810863), ]), Word::new([ - Felt::new(0xc19364d95b916e9b), - Felt::new(0xdcb0cf99f9ca31b5), - Felt::new(0x1b5493d83dca1621), - Felt::new(0xf0758e5e3459a0f9), + Felt::new(0xe3d71b05ac867f3a), + Felt::new(0x5c7ab1e6c3f3c749), + Felt::new(0x980f13958d1203d), + Felt::new(0xab6dea61dab9b3cb), ]), Word::new([ - Felt::new(0xdf2cb895c1de5b3a), - Felt::new(0xb7347b591512353a), - Felt::new(0xfdbbce7837412eb7), - Felt::new(0x893fa2af604d446f), + Felt::new(0x65cd98966451cc0f), + Felt::new(0xbc86e07d4e4685b1), + Felt::new(0x552d5160d91266ac), + Felt::new(0x838c05d03ef922ad), ]), Word::new([ - Felt::new(0x75d2b8fc6043d11e), - Felt::new(0xa6559eaebeed7d5f), - Felt::new(0xa9379773dad056b3), - Felt::new(0xf3bcf80d0748d3c1), + Felt::new(0x7ee3580bee2f4108), + Felt::new(0xa15be9b72fe7d7f8), + Felt::new(0x3a6ab01d40b1f9be), + Felt::new(0xf86f8b22a4db595a), ]), Word::new([ - Felt::new(0x35b731f6c583214a), - Felt::new(0x26249962927dd05f), - Felt::new(0x75fc431a3e7c9e93), - Felt::new(0x170c1036d421083d), + Felt::new(0xc9ca753fec71b643), + Felt::new(0xccdc18345ad0bb92), + Felt::new(0xf838d0cd1e9a22b2), + Felt::new(0xceafe749ebe09ca5), ]), Word::new([ - Felt::new(0x1d6fbabfdf0d9096), - Felt::new(0x7d7c9687d9eca6cc), - Felt::new(0xd62974b75d27af1c), - Felt::new(0x93ed9a3825cc1c35), + Felt::new(0x68aed7a433ba6f89), + Felt::new(0x872f414e44578643), + Felt::new(0x21f3e5c852e0edee), + Felt::new(0x617580f1bd0a9bbd), ]), Word::new([ - Felt::new(0xd30946664518ff6e), - Felt::new(0xd3e54aedfb7ba7e5), - Felt::new(0xb91107b2bfadfa1d), - Felt::new(0x2f7b0b2cb06cc43b), + Felt::new(0x6e9c957b61e49f55), + Felt::new(0xd08f4ef34c34daca), + Felt::new(0xd9498340c980973a), + Felt::new(0x592dc9098a00bcf5), ]), Word::new([ - Felt::new(0x47d1dc850260558e), - Felt::new(0x8e5dbde02c522c39), - Felt::new(0x3464d9fe9fd4a1e), - Felt::new(0xf9e5bcfe534437be), + Felt::new(0xdb3a7671f2f213ff), + Felt::new(0x98d8c80be9778636), + Felt::new(0xa83e7eda3baae466), + Felt::new(0x414627e94cef5a42), ]), Word::new([ - Felt::new(0x83378fd3d8e8a235), - Felt::new(0x5c12793119b6dfdb), - Felt::new(0xfc6f110fe6acbc57), - Felt::new(0x3138336422622a48), + Felt::new(0x9f8c71dd51c1b90b), + Felt::new(0x72849d1a55d42ee0), + Felt::new(0xb5a9f39b4e358b5a), + Felt::new(0x484007711542ed58), ]), Word::new([ - Felt::new(0x239c939a0a9787a0), - Felt::new(0x6c0d389b75f1cfb4), - Felt::new(0xc1947a136998e2a1), - Felt::new(0x76c1779e38ffb573), + Felt::new(0xf12e3506d6b6c442), + Felt::new(0xc4d45c104667788f), + Felt::new(0xf47c201e0a040319), + Felt::new(0xe62268fa6f2d91e0), ]), Word::new([ - Felt::new(0x7a266f705e62cd23), - Felt::new(0x7246a2960a038c2), - Felt::new(0xc1f47087a22fa2cb), - Felt::new(0xf298d4651af0b8b2), + Felt::new(0xfcec56c151f429d0), + Felt::new(0x240c895a3839cc45), + Felt::new(0x4a2f94d5ab28c7e4), + Felt::new(0x46898fef30fcf6b0), ]), Word::new([ - Felt::new(0x623bcdb6cc15e3ad), - Felt::new(0x8a6e820adf4725c3), - Felt::new(0x48737f1587e13208), - Felt::new(0xbf747c141bf3564c), + Felt::new(0x24a37f64007709c1), + Felt::new(0x30e34cd6365f2af5), + Felt::new(0xbc6ee1fce63257df), + Felt::new(0x47878c244a01a6d4), ]), Word::new([ - Felt::new(0x14842ec18fe2348c), - Felt::new(0x3701e593309841cf), - Felt::new(0x8e85c9f1884fdf7b), - Felt::new(0xa4cc06a6b8cae8e3), + Felt::new(0xf899cf62d3e064da), + Felt::new(0xdac739aafa7c1bf8), + Felt::new(0x2f76cb83eb1ac830), + Felt::new(0x19eaebd00c4585ec), ]), Word::new([ - Felt::new(0xcfebb64f4bf4f79), - Felt::new(0x54754d70569eeecd), - Felt::new(0x50405a6b79d1ae83), - Felt::new(0x9075f17ccebc056c), + Felt::new(0xb5889a2b3ade4339), + Felt::new(0xede5c4fb389619b4), + Felt::new(0x82699c26c8224722), + Felt::new(0xaccc76e026c53c65), ]), Word::new([ - Felt::new(0x9a93d03d0f9c825f), - Felt::new(0xf704fa1580fe53c7), - Felt::new(0xf95df7a7d06a22b7), - Felt::new(0x8462e18adf8b3607), + Felt::new(0x743d9808cb20cc9c), + Felt::new(0x118be69d793662c7), + Felt::new(0xf4e1de748f1cd76d), + Felt::new(0xdff5ee2bd200f9c9), ]), Word::new([ - Felt::new(0xb5210a5cbd9556b4), - Felt::new(0x6fd4218ebf3c7336), - Felt::new(0x19d661830be725ae), - Felt::new(0x28a2862b49428353), + Felt::new(0xfdea51ddaf36659a), + Felt::new(0xdef47a885c19e76c), + Felt::new(0x67fa40c1770baeee), + Felt::new(0x21e5a0cc0fba1cbe), ]), Word::new([ - Felt::new(0x93ceddc8a18724fe), - Felt::new(0x4e3299172e9130ed), - Felt::new(0x80229e0e1808c860), - Felt::new(0x13f479347eb7fd78), + Felt::new(0xeb80d35cc0b80b64), + Felt::new(0x1e4ba2d214e73fc0), + Felt::new(0xe06df54f53df077d), + Felt::new(0x4fb92dcdde85bb1c), ]), Word::new([ - Felt::new(0x86e4db88d39d4203), - Felt::new(0x81c24ca37b068741), - Felt::new(0x12b7d21371ca58f5), - Felt::new(0xb6546d4722efcbb0), + Felt::new(0xa0124f39e4fbbd8a), + Felt::new(0xa435a6d56e35ebf0), + Felt::new(0xa2da045c9e074ea5), + Felt::new(0x84b29221d6db5162), ]), Word::new([ - Felt::new(0x96ce1320155172c5), - Felt::new(0xbf622c3a5ab86fba), - Felt::new(0x5876a31266554836), - Felt::new(0x4f23fd3646963922), + Felt::new(0x863188446bc5e810), + Felt::new(0xe657920004e47792), + Felt::new(0x6763c88831d8bce5), + Felt::new(0x4226d55266af4de1), ]), Word::new([ - Felt::new(0x48f59a613c9baa43), - Felt::new(0x761de5ad2fd2c806), - Felt::new(0x2db99e809e35728f), - Felt::new(0x38b05ac131a0edc0), + Felt::new(0xb60470c3c5b77a8b), + Felt::new(0xdb7427ff68da5d48), + Felt::new(0x313ce707732b0c65), + Felt::new(0xa48b9a001ede6e4f), ]), Word::new([ - Felt::new(0x6e4fba2ef071cb8a), - Felt::new(0x77c415814dc5a0e5), - Felt::new(0xa0492c8344a64bb1), - Felt::new(0xc6dd5e8dbc841fe5), + Felt::new(0xbe58cae47a3bda6c), + Felt::new(0xedf2981cab8486e8), + Felt::new(0xe44eedfd2bd4db7c), + Felt::new(0xdf571d975e7451dc), ]), Word::new([ - Felt::new(0xa31e2e634187fec), - Felt::new(0xa4c019c12457e4b1), - Felt::new(0xa7b9de27a75ec6b4), - Felt::new(0x990bacb76b218164), + Felt::new(0x5d275ba45b8fc0ae), + Felt::new(0x597293899adcd624), + Felt::new(0x3d9d9d9f905c69a9), + Felt::new(0x3a2c0b8006b88d28), ]), Word::new([ - Felt::new(0x97c85363ab1c997e), - Felt::new(0xa95cd8ccab0b41b3), - Felt::new(0xb98b7ebc3680470b), - Felt::new(0x22fe1b13640f19a9), + Felt::new(0x566ea960c032817e), + Felt::new(0x3fc2f2397688666f), + Felt::new(0xae91b4ebf6d38e4e), + Felt::new(0x55678e62f7c0bad9), ]), Word::new([ - Felt::new(0x113c9a5f0dfbf187), - Felt::new(0x77f2dc9c46f3d699), - Felt::new(0xc3d92d34c950f8f4), - Felt::new(0x9cc6aaf7ffdaf2b6), + Felt::new(0x68a5ab07664b7030), + Felt::new(0x734268d2eddd56dc), + Felt::new(0x741e2227a74ba6a9), + Felt::new(0x6db8b16f53a72693), ]), Word::new([ - Felt::new(0xa5f51bc68b62924c), - Felt::new(0x54182d0b8b519f87), - Felt::new(0x15b42760e2ad50a5), - Felt::new(0x3b2d54cae046788), + Felt::new(0x1a741f201036a8ef), + Felt::new(0x7ec9f53168688afe), + Felt::new(0xf7f10daf37abc4c3), + Felt::new(0xe22740bb94b207f5), ]), Word::new([ - Felt::new(0xefec815078a58b7d), - Felt::new(0x2d02bd88ae2b8a3d), - Felt::new(0x7b3dee115eaac60a), - Felt::new(0x8e659da09a00ffad), + Felt::new(0xcf1682e05e224ca3), + Felt::new(0xb19bc6e35bc5563c), + Felt::new(0x36b025ea30c77fd1), + Felt::new(0x9cba72b1fe696a74), ]), Word::new([ - Felt::new(0x1987fb02253b4338), - Felt::new(0xa7c1e3a856b329be), - Felt::new(0x8d90defd305553e8), - Felt::new(0xb132ee2f7526c94d), + Felt::new(0x6727617dfcad0e43), + Felt::new(0x99f101fde0e17103), + Felt::new(0x5c5795c42f9154cb), + Felt::new(0x442937b3e266f4f), ]), Word::new([ - Felt::new(0x1556b5441e77734f), - Felt::new(0xa2ceaf4b2822a233), - Felt::new(0x41e5ee79d553e00c), - Felt::new(0xf2cdc04fd67a69f2), + Felt::new(0xe6d73c0ee48c7c65), + Felt::new(0x6899de7915dd4ad3), + Felt::new(0x650106188d5c1fa2), + Felt::new(0xfaf90f9fb37c2d6e), ]), Word::new([ - Felt::new(0xd4a8d6025cb6e3a), - Felt::new(0xd8d181277e183f21), - Felt::new(0x3bf9725618de11d3), - Felt::new(0xb26a0eb5a7d9c86e), + Felt::new(0x4248bb3fcd7ad129), + Felt::new(0xeb70d914516b8428), + Felt::new(0x28feb90174c69f3f), + Felt::new(0x1ec9ac80fc9fbb60), ]), Word::new([ - Felt::new(0xcdc5ad1e45e351c2), - Felt::new(0xf00b06807244caa6), - Felt::new(0xbbb01495c9a7e17d), - Felt::new(0xd9614df7e656a73f), + Felt::new(0x106686f6c74957d5), + Felt::new(0x32105c15b1aa5c4), + Felt::new(0x6dedbe92c47a4b32), + Felt::new(0xfc9d1cf1465600e0), ]), Word::new([ - Felt::new(0xfc61931c05c4a55f), - Felt::new(0xcff6ce2372650a9), - Felt::new(0x6e6c32ff4dc92c6), - Felt::new(0x1b72d8c04b0e409d), + Felt::new(0x39cb2c4dbe76972a), + Felt::new(0x4ebb766f9906e2c5), + Felt::new(0x755f76642ccbc6f), + Felt::new(0x5b00eadd79ed3e47), ]), Word::new([ Felt::new(0x77d6e2f32439dbf0), @@ -1569,7 +1569,7 @@ const EMPTY_SUBTREES: [Word; 256] = [ Felt::new(0xd3ad9fb0cea61624), Felt::new(0x66ab5c684fbb8597), ]), - EMPTY_WORD, + Word::new([Felt::new(0x0), Felt::new(0x0), Felt::new(0x0), Felt::new(0x0)]), ]; #[test] @@ -1589,7 +1589,7 @@ fn all_depths_opens_to_zero() { assert_eq!(depth as usize + 1, subtree.len()); // assert the opening is zero - let initial = EMPTY_WORD; + let initial = crate::EMPTY_WORD; assert_eq!(initial, subtree.remove(0)); // compute every node of the path manually and compare with the output @@ -1607,7 +1607,7 @@ fn all_depths_opens_to_zero() { fn test_entry() { // check the leaf is always the empty work for depth in 0..255 { - assert_eq!(EmptySubtreeRoots::entry(depth, depth), &EMPTY_WORD); + assert_eq!(EmptySubtreeRoots::entry(depth, depth), &crate::EMPTY_WORD); } // check the root matches the first element of empty_hashes diff --git a/miden-crypto/src/merkle/smt/forest/tests.rs b/miden-crypto/src/merkle/smt/forest/tests.rs index a6b663cf3..005ae9217 100644 --- a/miden-crypto/src/merkle/smt/forest/tests.rs +++ b/miden-crypto/src/merkle/smt/forest/tests.rs @@ -35,10 +35,10 @@ fn test_insert_root_empty() -> Result<(), MerkleError> { assert_eq!( forest.insert(empty_tree_root, key, value)?, Word::new([ - Felt::new(10376354645124572258), - Felt::new(13808228093617896354), - Felt::new(4835829334388921262), - Felt::new(2144113770050911180) + Felt::new(8004305032057544734), + Felt::new(8775568154390432518), + Felt::new(15738879297545046620), + Felt::new(8472837894474537954), ]), ); Ok(()) @@ -55,10 +55,10 @@ fn test_insert_multiple_values() -> Result<(), MerkleError> { assert_eq!( new_root, Word::new([ - Felt::new(10376354645124572258), - Felt::new(13808228093617896354), - Felt::new(4835829334388921262), - Felt::new(2144113770050911180) + Felt::new(8004305032057544734), + Felt::new(8775568154390432518), + Felt::new(15738879297545046620), + Felt::new(8472837894474537954), ]), ); @@ -66,10 +66,10 @@ fn test_insert_multiple_values() -> Result<(), MerkleError> { assert_eq!( new_root, Word::new([ - Felt::new(10376354645124572258), - Felt::new(13808228093617896354), - Felt::new(4835829334388921262), - Felt::new(2144113770050911180) + Felt::new(8004305032057544734), + Felt::new(8775568154390432518), + Felt::new(15738879297545046620), + Felt::new(8472837894474537954), ]), ); @@ -82,10 +82,10 @@ fn test_insert_multiple_values() -> Result<(), MerkleError> { assert_eq!( new_root, Word::new([ - Felt::new(1600265794710932756), - Felt::new(4102884415474859847), - Felt::new(7916203901318401823), - Felt::new(9187865964280213047) + Felt::new(11871408080611032882), + Felt::new(15075599519659351786), + Felt::new(2187602169790640097), + Felt::new(3917634304176870231), ]) ); @@ -111,10 +111,10 @@ fn test_batch_insert() -> Result<(), MerkleError> { assert_eq!( new_root, Word::new([ - Felt::new(7086678883692273722), - Felt::new(12292668811816691012), - Felt::new(10126815404170194367), - Felt::new(1147037274136690014) + Felt::new(4696704423458811136), + Felt::new(6409025055729277967), + Felt::new(16123112516746934247), + Felt::new(14531375043307302369), ]) ); From 2f2675a1e4877852504f1ce8c7026f86531bdb2e Mon Sep 17 00:00:00 2001 From: al <82364884+Al-Kindi-0@users.noreply.github.com> Date: Fri, 2 Jan 2026 22:17:39 +0400 Subject: [PATCH 02/13] fix fmt --- miden-crypto/src/hash/algebraic_sponge/poseidon2/mod.rs | 3 ++- miden-crypto/src/hash/algebraic_sponge/rescue/rpo/tests.rs | 4 +++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/miden-crypto/src/hash/algebraic_sponge/poseidon2/mod.rs b/miden-crypto/src/hash/algebraic_sponge/poseidon2/mod.rs index 33b072455..ee00298bb 100644 --- a/miden-crypto/src/hash/algebraic_sponge/poseidon2/mod.rs +++ b/miden-crypto/src/hash/algebraic_sponge/poseidon2/mod.rs @@ -478,7 +478,8 @@ mod p3_tests { #[ignore] // TODO: The state layout now matches Plonky3 (rate=[0-7], capacity=[8-11]), but there's // still a digest position mismatch: - // - Miden's Poseidon2::hash_elements() reads digest from state[4..8] (DIGEST_RANGE, middle word) + // - Miden's Poseidon2::hash_elements() reads digest from state[4..8] (DIGEST_RANGE, middle + // word) // - Plonky3's PaddingFreeSponge reads digest from state[0..OUT] (first 4 elements) fn test_poseidon2_hasher_vs_hash_elements() { // Test with empty input diff --git a/miden-crypto/src/hash/algebraic_sponge/rescue/rpo/tests.rs b/miden-crypto/src/hash/algebraic_sponge/rescue/rpo/tests.rs index caeb31933..d34a60dee 100644 --- a/miden-crypto/src/hash/algebraic_sponge/rescue/rpo/tests.rs +++ b/miden-crypto/src/hash/algebraic_sponge/rescue/rpo/tests.rs @@ -15,7 +15,9 @@ const INV_ALPHA: u64 = 10540996611094048183; use crate::{ ONE, Word, ZERO, field::{PrimeCharacteristicRing, PrimeField64}, - hash::algebraic_sponge::{AlgebraicSponge, BINARY_CHUNK_SIZE, CAPACITY_RANGE, RATE_RANGE, RATE_WIDTH}, + hash::algebraic_sponge::{ + AlgebraicSponge, BINARY_CHUNK_SIZE, CAPACITY_RANGE, RATE_RANGE, RATE_WIDTH, + }, rand::test_utils::rand_value, }; From cdc2741e3d27ddbde21eb2bef8aeeb2dbaed68b7 Mon Sep 17 00:00:00 2001 From: al <82364884+Al-Kindi-0@users.noreply.github.com> Date: Sun, 4 Jan 2026 00:08:31 +0400 Subject: [PATCH 03/13] feat: update word comparison to LE convention --- miden-crypto/src/merkle/smt/full/leaf.rs | 4 ++-- miden-crypto/src/word/lexicographic.rs | 12 ++++++------ 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/miden-crypto/src/merkle/smt/full/leaf.rs b/miden-crypto/src/merkle/smt/full/leaf.rs index 69ef0f284..bf0909868 100644 --- a/miden-crypto/src/merkle/smt/full/leaf.rs +++ b/miden-crypto/src/merkle/smt/full/leaf.rs @@ -385,9 +385,9 @@ pub(crate) fn kv_to_elements((key, value): (Word, Word)) -> impl Iterator Ordering { - for (v1, v2) in key_1.iter().zip(key_2.iter()).rev() { + for (v1, v2) in key_1.iter().zip(key_2.iter()) { let v1 = (*v1).as_canonical_u64(); let v2 = (*v2).as_canonical_u64(); if v1 != v2 { diff --git a/miden-crypto/src/word/lexicographic.rs b/miden-crypto/src/word/lexicographic.rs index b41502dd9..bbf9f911d 100644 --- a/miden-crypto/src/word/lexicographic.rs +++ b/miden-crypto/src/word/lexicographic.rs @@ -73,9 +73,8 @@ impl + Copy> Ord for LexicographicWord { for (felt0, felt1) in self_word .iter() - .rev() .map(Felt::as_canonical_u64) - .zip(other_word.iter().rev().map(Felt::as_canonical_u64)) + .zip(other_word.iter().map(Felt::as_canonical_u64)) { let ordering = felt0.cmp(&felt1); if let Ordering::Less | Ordering::Greater = ordering { @@ -144,10 +143,11 @@ mod tests { (Ordering::Less, [0, 0, 0, 0u32], [0, 1, 0, 0u32]), (Ordering::Less, [0, 0, 0, 0u32], [0, 0, 1, 0u32]), (Ordering::Less, [0, 0, 0, 0u32], [0, 0, 0, 1u32]), - (Ordering::Greater, [0, 0, 0, 1u32], [1, 1, 1, 0u32]), - (Ordering::Greater, [0, 0, 1, 0u32], [1, 1, 0, 0u32]), - (Ordering::Less, [1, 1, 1, 0u32], [0, 0, 0, 1u32]), - (Ordering::Less, [1, 1, 0, 0u32], [0, 0, 1, 0u32]), + // In LE convention, word[0] is compared first (most significant) + (Ordering::Less, [0, 0, 0, 1u32], [1, 1, 1, 0u32]), + (Ordering::Less, [0, 0, 1, 0u32], [1, 1, 0, 0u32]), + (Ordering::Greater, [1, 1, 1, 0u32], [0, 0, 0, 1u32]), + (Ordering::Greater, [1, 1, 0, 0u32], [0, 0, 1, 0u32]), ] { assert_eq!( LexicographicWord::from(key0.map(Felt::from_u32)) From 693f8e8952f6c7b32e38e10f7b0f026a072737ce Mon Sep 17 00:00:00 2001 From: al <82364884+Al-Kindi-0@users.noreply.github.com> Date: Wed, 7 Jan 2026 14:15:13 +0400 Subject: [PATCH 04/13] fix comments --- miden-crypto/src/merkle/smt/full/leaf.rs | 2 +- miden-crypto/src/word/lexicographic.rs | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/miden-crypto/src/merkle/smt/full/leaf.rs b/miden-crypto/src/merkle/smt/full/leaf.rs index bf0909868..2ad0a70b0 100644 --- a/miden-crypto/src/merkle/smt/full/leaf.rs +++ b/miden-crypto/src/merkle/smt/full/leaf.rs @@ -385,7 +385,7 @@ pub(crate) fn kv_to_elements((key, value): (Word, Word)) -> impl Iterator Ordering { for (v1, v2) in key_1.iter().zip(key_2.iter()) { let v1 = (*v1).as_canonical_u64(); diff --git a/miden-crypto/src/word/lexicographic.rs b/miden-crypto/src/word/lexicographic.rs index bbf9f911d..5ff8c4f82 100644 --- a/miden-crypto/src/word/lexicographic.rs +++ b/miden-crypto/src/word/lexicographic.rs @@ -143,7 +143,6 @@ mod tests { (Ordering::Less, [0, 0, 0, 0u32], [0, 1, 0, 0u32]), (Ordering::Less, [0, 0, 0, 0u32], [0, 0, 1, 0u32]), (Ordering::Less, [0, 0, 0, 0u32], [0, 0, 0, 1u32]), - // In LE convention, word[0] is compared first (most significant) (Ordering::Less, [0, 0, 0, 1u32], [1, 1, 1, 0u32]), (Ordering::Less, [0, 0, 1, 0u32], [1, 1, 0, 0u32]), (Ordering::Greater, [1, 1, 1, 0u32], [0, 0, 0, 1u32]), From 3f18eb4e4ee0a19735238141e8443a5e35a2c67e Mon Sep 17 00:00:00 2001 From: al <82364884+Al-Kindi-0@users.noreply.github.com> Date: Thu, 8 Jan 2026 11:37:24 +0400 Subject: [PATCH 05/13] undo changes to word order --- CHANGELOG.md | 1 + miden-crypto/src/merkle/smt/full/leaf.rs | 4 ++-- miden-crypto/src/word/lexicographic.rs | 11 ++++++----- 3 files changed, 9 insertions(+), 7 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 662759e95..45c935406 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,7 @@ - Use more idiomatic Plonky3 APIs ([#743](https://github.com/0xMiden/crypto/pull/743)). - Make concurrent feature interact with plonky3's parallel features, replace homegrown iterator macros with p3-maybe-rayon ([#749](https://github.com/0xMiden/crypto/pull/749)). - Reduce dependency on std in tests, add test helpers to access Rngs in no-std contexts ([#752](https://github.com/0xMiden/crypto/pull/752)). +- [BREAKING] Changed sponge state layout from `[CAPACITY, RATE1, RATE0]` (BE) to `[RATE0, RATE1, CAPACITY]` (LE) ([#755](https://github.com/0xMiden/crypto/pull/755)) # 0.20.1 (2025-12-29) diff --git a/miden-crypto/src/merkle/smt/full/leaf.rs b/miden-crypto/src/merkle/smt/full/leaf.rs index 2ad0a70b0..69ef0f284 100644 --- a/miden-crypto/src/merkle/smt/full/leaf.rs +++ b/miden-crypto/src/merkle/smt/full/leaf.rs @@ -385,9 +385,9 @@ pub(crate) fn kv_to_elements((key, value): (Word, Word)) -> impl Iterator Ordering { - for (v1, v2) in key_1.iter().zip(key_2.iter()) { + for (v1, v2) in key_1.iter().zip(key_2.iter()).rev() { let v1 = (*v1).as_canonical_u64(); let v2 = (*v2).as_canonical_u64(); if v1 != v2 { diff --git a/miden-crypto/src/word/lexicographic.rs b/miden-crypto/src/word/lexicographic.rs index 5ff8c4f82..b41502dd9 100644 --- a/miden-crypto/src/word/lexicographic.rs +++ b/miden-crypto/src/word/lexicographic.rs @@ -73,8 +73,9 @@ impl + Copy> Ord for LexicographicWord { for (felt0, felt1) in self_word .iter() + .rev() .map(Felt::as_canonical_u64) - .zip(other_word.iter().map(Felt::as_canonical_u64)) + .zip(other_word.iter().rev().map(Felt::as_canonical_u64)) { let ordering = felt0.cmp(&felt1); if let Ordering::Less | Ordering::Greater = ordering { @@ -143,10 +144,10 @@ mod tests { (Ordering::Less, [0, 0, 0, 0u32], [0, 1, 0, 0u32]), (Ordering::Less, [0, 0, 0, 0u32], [0, 0, 1, 0u32]), (Ordering::Less, [0, 0, 0, 0u32], [0, 0, 0, 1u32]), - (Ordering::Less, [0, 0, 0, 1u32], [1, 1, 1, 0u32]), - (Ordering::Less, [0, 0, 1, 0u32], [1, 1, 0, 0u32]), - (Ordering::Greater, [1, 1, 1, 0u32], [0, 0, 0, 1u32]), - (Ordering::Greater, [1, 1, 0, 0u32], [0, 0, 1, 0u32]), + (Ordering::Greater, [0, 0, 0, 1u32], [1, 1, 1, 0u32]), + (Ordering::Greater, [0, 0, 1, 0u32], [1, 1, 0, 0u32]), + (Ordering::Less, [1, 1, 1, 0u32], [0, 0, 0, 1u32]), + (Ordering::Less, [1, 1, 0, 0u32], [0, 0, 1, 0u32]), ] { assert_eq!( LexicographicWord::from(key0.map(Felt::from_u32)) From 4e665552305e6e16fdbeb30d88a57df5a0f95cf3 Mon Sep 17 00:00:00 2001 From: al <82364884+Al-Kindi-0@users.noreply.github.com> Date: Thu, 8 Jan 2026 13:55:03 +0400 Subject: [PATCH 06/13] fix stale comments --- miden-crypto/src/hash/algebraic_sponge/poseidon2/mod.rs | 8 ++++---- miden-crypto/src/hash/algebraic_sponge/rescue/rpo/mod.rs | 8 ++++---- miden-crypto/src/hash/algebraic_sponge/rescue/rpx/mod.rs | 8 ++++---- 3 files changed, 12 insertions(+), 12 deletions(-) diff --git a/miden-crypto/src/hash/algebraic_sponge/poseidon2/mod.rs b/miden-crypto/src/hash/algebraic_sponge/poseidon2/mod.rs index ee00298bb..ba212010d 100644 --- a/miden-crypto/src/hash/algebraic_sponge/poseidon2/mod.rs +++ b/miden-crypto/src/hash/algebraic_sponge/poseidon2/mod.rs @@ -329,8 +329,8 @@ use p3_symmetric::{ /// `CryptographicPermutation` traits, allowing Poseidon2 to be used within the Plonky3 ecosystem. /// /// The permutation operates on a state of 12 field elements (STATE_WIDTH = 12), with: -/// - Rate: 8 elements (positions 4-11) -/// - Capacity: 4 elements (positions 0-3) +/// - Rate: 8 elements (positions 0-7) +/// - Capacity: 4 elements (positions 8-11) /// - Digest output: 4 elements (positions 4-7) #[derive(Debug, Copy, Clone, Eq, PartialEq)] pub struct Poseidon2Permutation256; @@ -349,10 +349,10 @@ impl Poseidon2Permutation256 { /// the remaining 4 elements are reserved for capacity. pub const STATE_WIDTH: usize = STATE_WIDTH; - /// The rate portion of the state is located in elements 4 through 11 (inclusive). + /// The rate portion of the state is located in elements 0 through 7 (inclusive). pub const RATE_RANGE: Range = Poseidon2::RATE_RANGE; - /// The capacity portion of the state is located in elements 0, 1, 2, and 3. + /// The capacity portion of the state is located in elements 8, 9, 10, and 11. pub const CAPACITY_RANGE: Range = Poseidon2::CAPACITY_RANGE; /// The output of the hash function can be read from state elements 4, 5, 6, and 7. diff --git a/miden-crypto/src/hash/algebraic_sponge/rescue/rpo/mod.rs b/miden-crypto/src/hash/algebraic_sponge/rescue/rpo/mod.rs index 96e1370c9..1b5b841ef 100644 --- a/miden-crypto/src/hash/algebraic_sponge/rescue/rpo/mod.rs +++ b/miden-crypto/src/hash/algebraic_sponge/rescue/rpo/mod.rs @@ -210,8 +210,8 @@ use p3_symmetric::{ /// `CryptographicPermutation` traits, allowing RPO to be used within the Plonky3 ecosystem. /// /// The permutation operates on a state of 12 field elements (STATE_WIDTH = 12), with: -/// - Rate: 8 elements (positions 4-11) -/// - Capacity: 4 elements (positions 0-3) +/// - Rate: 8 elements (positions 0-7) +/// - Capacity: 4 elements (positions 8-11) /// - Digest output: 4 elements (positions 4-7) #[derive(Debug, Copy, Clone, Eq, PartialEq)] pub struct RpoPermutation256; @@ -227,10 +227,10 @@ impl RpoPermutation256 { /// the remaining 4 elements are reserved for capacity. pub const STATE_WIDTH: usize = STATE_WIDTH; - /// The rate portion of the state is located in elements 4 through 11 (inclusive). + /// The rate portion of the state is located in elements 0 through 7 (inclusive). pub const RATE_RANGE: Range = Rpo256::RATE_RANGE; - /// The capacity portion of the state is located in elements 0, 1, 2, and 3. + /// The capacity portion of the state is located in elements 8, 9, 10, and 11. pub const CAPACITY_RANGE: Range = Rpo256::CAPACITY_RANGE; /// The output of the hash function can be read from state elements 4, 5, 6, and 7. diff --git a/miden-crypto/src/hash/algebraic_sponge/rescue/rpx/mod.rs b/miden-crypto/src/hash/algebraic_sponge/rescue/rpx/mod.rs index a510665ee..add5539a2 100644 --- a/miden-crypto/src/hash/algebraic_sponge/rescue/rpx/mod.rs +++ b/miden-crypto/src/hash/algebraic_sponge/rescue/rpx/mod.rs @@ -338,8 +338,8 @@ use p3_symmetric::{ /// `CryptographicPermutation` traits, allowing RPX to be used within the Plonky3 ecosystem. /// /// The permutation operates on a state of 12 field elements (STATE_WIDTH = 12), with: -/// - Rate: 8 elements (positions 4-11) -/// - Capacity: 4 elements (positions 0-3) +/// - Rate: 8 elements (positions 0-7) +/// - Capacity: 4 elements (positions 8-11) /// - Digest output: 4 elements (positions 4-7) #[derive(Debug, Copy, Clone, Eq, PartialEq)] pub struct RpxPermutation256; @@ -352,10 +352,10 @@ impl RpxPermutation256 { /// the remaining 4 elements are reserved for capacity. pub const STATE_WIDTH: usize = STATE_WIDTH; - /// The rate portion of the state is located in elements 4 through 11 (inclusive). + /// The rate portion of the state is located in elements 0 through 7 (inclusive). pub const RATE_RANGE: Range = Rpx256::RATE_RANGE; - /// The capacity portion of the state is located in elements 0, 1, 2, and 3. + /// The capacity portion of the state is located in elements 8, 9, 10, and 11. pub const CAPACITY_RANGE: Range = Rpx256::CAPACITY_RANGE; /// The output of the hash function can be read from state elements 4, 5, 6, and 7. From eb1df143614d264979e09f6dd534861c9513d286 Mon Sep 17 00:00:00 2001 From: al <82364884+Al-Kindi-0@users.noreply.github.com> Date: Fri, 9 Jan 2026 14:14:03 +0400 Subject: [PATCH 07/13] remap digest to be top word of state --- miden-crypto/src/aead/aead_rpo/mod.rs | 6 +- miden-crypto/src/hash/algebraic_sponge/mod.rs | 5 +- .../hash/algebraic_sponge/poseidon2/mod.rs | 146 +- .../hash/algebraic_sponge/poseidon2/test.rs | 118 +- .../hash/algebraic_sponge/rescue/rpo/mod.rs | 6 +- .../hash/algebraic_sponge/rescue/rpo/tests.rs | 191 +- .../hash/algebraic_sponge/rescue/rpx/mod.rs | 7 +- .../hash/algebraic_sponge/rescue/rpx/tests.rs | 18 - miden-crypto/src/merkle/empty_roots.rs | 2047 +++++++++-------- miden-crypto/src/merkle/smt/forest/tests.rs | 40 +- 10 files changed, 1255 insertions(+), 1329 deletions(-) diff --git a/miden-crypto/src/aead/aead_rpo/mod.rs b/miden-crypto/src/aead/aead_rpo/mod.rs index bbf895497..2d29ae386 100644 --- a/miden-crypto/src/aead/aead_rpo/mod.rs +++ b/miden-crypto/src/aead/aead_rpo/mod.rs @@ -528,13 +528,13 @@ impl SpongeState { squeezed_data } - /// Squeezes an authentication tag + /// Squeezes an authentication tag (from RATE0, the first rate word) fn squeeze_tag(&mut self) -> AuthTag { self.permute(); AuthTag( - self.state[RATE_RANGE_SECOND_HALF] + self.state[RATE_RANGE_FIRST_HALF] .try_into() - .expect("rate second half is exactly AUTH_TAG_SIZE elements"), + .expect("rate first half is exactly AUTH_TAG_SIZE elements"), ) } diff --git a/miden-crypto/src/hash/algebraic_sponge/mod.rs b/miden-crypto/src/hash/algebraic_sponge/mod.rs index 2a9d82cc8..7ea6ce27e 100644 --- a/miden-crypto/src/hash/algebraic_sponge/mod.rs +++ b/miden-crypto/src/hash/algebraic_sponge/mod.rs @@ -41,9 +41,8 @@ pub(crate) const INPUT2_RANGE: Range = 4..8; pub(crate) const CAPACITY_RANGE: Range = 8..12; /// The output of the hash function is a digest which consists of 4 field elements or 32 bytes, -/// taken from the second word of the rate portion of the state (the middle word of the 3-word -/// sponge state). -pub(crate) const DIGEST_RANGE: Range = 4..8; +/// taken from the first word of the rate portion of the state. +pub(crate) const DIGEST_RANGE: Range = 0..4; /// The number of byte chunks defining a field element when hashing a sequence of bytes const BINARY_CHUNK_SIZE: usize = 7; diff --git a/miden-crypto/src/hash/algebraic_sponge/poseidon2/mod.rs b/miden-crypto/src/hash/algebraic_sponge/poseidon2/mod.rs index ba212010d..0a576dd8e 100644 --- a/miden-crypto/src/hash/algebraic_sponge/poseidon2/mod.rs +++ b/miden-crypto/src/hash/algebraic_sponge/poseidon2/mod.rs @@ -112,8 +112,8 @@ impl Poseidon2 { /// The capacity portion of the state is located in elements 8, 9, 10, and 11. pub const CAPACITY_RANGE: Range = CAPACITY_RANGE; - /// The output of the hash function can be read from state elements 4, 5, 6, and 7 (the second - /// word of the rate portion, i.e. the middle word of the sponge state). + /// The output of the hash function can be read from state elements 0, 1, 2, and 3 (the first + /// word of the state). pub const DIGEST_RANGE: Range = DIGEST_RANGE; /// Matrix used for computing the linear layers of internal rounds. @@ -355,7 +355,7 @@ impl Poseidon2Permutation256 { /// The capacity portion of the state is located in elements 8, 9, 10, and 11. pub const CAPACITY_RANGE: Range = Poseidon2::CAPACITY_RANGE; - /// The output of the hash function can be read from state elements 4, 5, 6, and 7. + /// The output of the hash function can be read from state elements 0, 1, 2, and 3. pub const DIGEST_RANGE: Range = Poseidon2::DIGEST_RANGE; // POSEIDON2 PERMUTATION @@ -411,143 +411,3 @@ pub type Poseidon2Compression = TruncatedPermutation = DuplexChallenger; - -#[cfg(test)] -mod p3_tests { - use p3_symmetric::{CryptographicHasher, PseudoCompressionFunction}; - - use super::*; - - #[test] - fn test_poseidon2_permutation_basic() { - let mut state = [Felt::new(0); STATE_WIDTH]; - - // Apply permutation - let perm = Poseidon2Permutation256; - perm.permute_mut(&mut state); - - // State should be different from all zeros after permutation - assert_ne!(state, [Felt::new(0); STATE_WIDTH]); - } - - #[test] - fn test_poseidon2_permutation_consistency() { - let mut state1 = [Felt::new(0); STATE_WIDTH]; - let mut state2 = [Felt::new(0); STATE_WIDTH]; - - // Apply permutation using the trait - let perm = Poseidon2Permutation256; - perm.permute_mut(&mut state1); - - // Apply permutation directly - Poseidon2Permutation256::apply_permutation(&mut state2); - - // Both should produce the same result - assert_eq!(state1, state2); - } - - #[test] - fn test_poseidon2_permutation_deterministic() { - let input = [ - Felt::new(1), - Felt::new(2), - Felt::new(3), - Felt::new(4), - Felt::new(5), - Felt::new(6), - Felt::new(7), - Felt::new(8), - Felt::new(9), - Felt::new(10), - Felt::new(11), - Felt::new(12), - ]; - - let mut state1 = input; - let mut state2 = input; - - let perm = Poseidon2Permutation256; - perm.permute_mut(&mut state1); - perm.permute_mut(&mut state2); - - // Same input should produce same output - assert_eq!(state1, state2); - } - - #[test] - #[ignore] - // TODO: The state layout now matches Plonky3 (rate=[0-7], capacity=[8-11]), but there's - // still a digest position mismatch: - // - Miden's Poseidon2::hash_elements() reads digest from state[4..8] (DIGEST_RANGE, middle - // word) - // - Plonky3's PaddingFreeSponge reads digest from state[0..OUT] (first 4 elements) - fn test_poseidon2_hasher_vs_hash_elements() { - // Test with empty input - let expected: [Felt; 4] = Poseidon2::hash_elements::(&[]).into(); - let hasher = Poseidon2Hasher::new(Poseidon2Permutation256); - let result = hasher.hash_iter([]); - assert_eq!(result, expected, "Empty input should produce same digest"); - - // Test with 4 elements (one digest worth) - let input4 = [Felt::new(1), Felt::new(2), Felt::new(3), Felt::new(4)]; - let expected: [Felt; 4] = Poseidon2::hash_elements(&input4).into(); - let result = hasher.hash_iter(input4); - assert_eq!(result, expected, "4 elements should produce same digest"); - - // Test with 8 elements (exactly one rate) - let input8 = [ - Felt::new(1), - Felt::new(2), - Felt::new(3), - Felt::new(4), - Felt::new(5), - Felt::new(6), - Felt::new(7), - Felt::new(8), - ]; - let expected: [Felt; 4] = Poseidon2::hash_elements(&input8).into(); - let result = hasher.hash_iter(input8); - assert_eq!(result, expected, "8 elements (one rate) should produce same digest"); - - // Test with 16 elements (two rates) - let input16 = [ - Felt::new(1), - Felt::new(2), - Felt::new(3), - Felt::new(4), - Felt::new(5), - Felt::new(6), - Felt::new(7), - Felt::new(8), - Felt::new(9), - Felt::new(10), - Felt::new(11), - Felt::new(12), - Felt::new(13), - Felt::new(14), - Felt::new(15), - Felt::new(16), - ]; - let expected: [Felt; 4] = Poseidon2::hash_elements(&input16).into(); - let result = hasher.hash_iter(input16); - assert_eq!(result, expected, "16 elements (two rates) should produce same digest"); - } - - #[test] - #[ignore] - // TODO: Same digest position mismatch as test_poseidon2_hasher_vs_hash_elements above. - // Poseidon2::merge() reads from state[4..8], TruncatedPermutation reads from state[0..4]. - fn test_poseidon2_compression_vs_merge() { - let digest1 = [Felt::new(1), Felt::new(2), Felt::new(3), Felt::new(4)]; - let digest2 = [Felt::new(5), Felt::new(6), Felt::new(7), Felt::new(8)]; - - // Poseidon2::merge expects &[Word; 2] - let expected: [Felt; 4] = Poseidon2::merge(&[digest1.into(), digest2.into()]).into(); - - // Poseidon2Compression expects [[Felt; 4]; 2] - let compress = Poseidon2Compression::new(Poseidon2Permutation256); - let result = compress.compress([digest1, digest2]); - - assert_eq!(result, expected, "Poseidon2Compression should match Poseidon2::merge"); - } -} diff --git a/miden-crypto/src/hash/algebraic_sponge/poseidon2/test.rs b/miden-crypto/src/hash/algebraic_sponge/poseidon2/test.rs index 0d2cdf193..52d42bba2 100644 --- a/miden-crypto/src/hash/algebraic_sponge/poseidon2/test.rs +++ b/miden-crypto/src/hash/algebraic_sponge/poseidon2/test.rs @@ -1,4 +1,6 @@ -use super::{Felt, ZERO}; +use p3_symmetric::{CryptographicHasher, PseudoCompressionFunction}; + +use super::*; use crate::hash::{algebraic_sponge::AlgebraicSponge, poseidon2::Poseidon2}; #[test] @@ -36,3 +38,117 @@ fn permutation_test_vector() { assert_eq!(perm[10], Felt::new(0xec467926508fbe67)); assert_eq!(perm[11], Felt::new(0x6a50450ddf85a6ed)); } + +#[test] +fn test_poseidon2_permutation_basic() { + let mut state = [Felt::new(0); STATE_WIDTH]; + + // Apply permutation + let perm = Poseidon2Permutation256; + perm.permute_mut(&mut state); + + // State should be different from all zeros after permutation + assert_ne!(state, [Felt::new(0); STATE_WIDTH]); +} + +#[test] +fn test_poseidon2_permutation_consistency() { + let mut state1 = [Felt::new(0); STATE_WIDTH]; + let mut state2 = [Felt::new(0); STATE_WIDTH]; + + // Apply permutation using the trait + let perm = Poseidon2Permutation256; + perm.permute_mut(&mut state1); + + // Apply permutation directly + Poseidon2Permutation256::apply_permutation(&mut state2); + + // Both should produce the same result + assert_eq!(state1, state2); +} + +#[test] +fn test_poseidon2_permutation_deterministic() { + let input = [ + Felt::new(1), + Felt::new(2), + Felt::new(3), + Felt::new(4), + Felt::new(5), + Felt::new(6), + Felt::new(7), + Felt::new(8), + Felt::new(9), + Felt::new(10), + Felt::new(11), + Felt::new(12), + ]; + + let mut state1 = input; + let mut state2 = input; + + let perm = Poseidon2Permutation256; + perm.permute_mut(&mut state1); + perm.permute_mut(&mut state2); + + // Same input should produce same output + assert_eq!(state1, state2); +} + +#[test] +fn test_poseidon2_hasher_vs_hash_elements() { + let hasher = Poseidon2Hasher::new(Poseidon2Permutation256); + + // Test with 8 elements (exactly one rate) + let input8 = [ + Felt::new(1), + Felt::new(2), + Felt::new(3), + Felt::new(4), + Felt::new(5), + Felt::new(6), + Felt::new(7), + Felt::new(8), + ]; + let expected: [Felt; 4] = Poseidon2::hash_elements(&input8).into(); + let result = hasher.hash_iter(input8); + assert_eq!(result, expected, "8 elements (one rate) should produce same digest"); + + // Test with 16 elements (two rates) + let input16 = [ + Felt::new(1), + Felt::new(2), + Felt::new(3), + Felt::new(4), + Felt::new(5), + Felt::new(6), + Felt::new(7), + Felt::new(8), + Felt::new(9), + Felt::new(10), + Felt::new(11), + Felt::new(12), + Felt::new(13), + Felt::new(14), + Felt::new(15), + Felt::new(16), + ]; + let expected: [Felt; 4] = Poseidon2::hash_elements(&input16).into(); + let result = hasher.hash_iter(input16); + assert_eq!(result, expected, "16 elements (two rates) should produce same digest"); +} + +#[test] +fn test_poseidon2_compression_vs_merge() { + let digest1 = [Felt::new(1), Felt::new(2), Felt::new(3), Felt::new(4)]; + let digest2 = [Felt::new(5), Felt::new(6), Felt::new(7), Felt::new(8)]; + + // Poseidon2::merge expects &[Word; 2] + let expected: [Felt; 4] = Poseidon2::merge(&[digest1.into(), digest2.into()]).into(); + + // Poseidon2Compression expects [[Felt; 4]; 2] + let compress = Poseidon2Compression::new(Poseidon2Permutation256); + let result = compress.compress([digest1, digest2]); + + assert_eq!(result, expected, "Poseidon2Compression should match Poseidon2::merge"); +} diff --git a/miden-crypto/src/hash/algebraic_sponge/rescue/rpo/mod.rs b/miden-crypto/src/hash/algebraic_sponge/rescue/rpo/mod.rs index 1b5b841ef..ce68562ce 100644 --- a/miden-crypto/src/hash/algebraic_sponge/rescue/rpo/mod.rs +++ b/miden-crypto/src/hash/algebraic_sponge/rescue/rpo/mod.rs @@ -101,8 +101,8 @@ impl Rpo256 { /// The capacity portion of the state is located in elements 8, 9, 10, and 11. pub const CAPACITY_RANGE: Range = CAPACITY_RANGE; - /// The output of the hash function can be read from state elements 4, 5, 6, and 7 (the second - /// word of the rate portion, i.e. the middle word of the sponge state). + /// The output of the hash function can be read from state elements 0, 1, 2, and 3 (the first + /// word of the state). pub const DIGEST_RANGE: Range = DIGEST_RANGE; /// MDS matrix used for computing the linear layer in a RPO round. @@ -233,7 +233,7 @@ impl RpoPermutation256 { /// The capacity portion of the state is located in elements 8, 9, 10, and 11. pub const CAPACITY_RANGE: Range = Rpo256::CAPACITY_RANGE; - /// The output of the hash function can be read from state elements 4, 5, 6, and 7. + /// The output of the hash function can be read from state elements 0, 1, 2, and 3. pub const DIGEST_RANGE: Range = Rpo256::DIGEST_RANGE; // RESCUE PERMUTATION diff --git a/miden-crypto/src/hash/algebraic_sponge/rescue/rpo/tests.rs b/miden-crypto/src/hash/algebraic_sponge/rescue/rpo/tests.rs index d34a60dee..143e7724e 100644 --- a/miden-crypto/src/hash/algebraic_sponge/rescue/rpo/tests.rs +++ b/miden-crypto/src/hash/algebraic_sponge/rescue/rpo/tests.rs @@ -281,118 +281,118 @@ proptest! { const EXPECTED: [Word; 19] = [ Word::new([ - Felt::new(15469139178109825283), - Felt::new(13298322520406718581), - Felt::new(17526830383584509711), - Felt::new(11090661028409776847), + Felt::new(8563248028282119176), + Felt::new(14757918088501470722), + Felt::new(14042820149444308297), + Felt::new(7607140247535155355), ]), Word::new([ - Felt::new(11706991355830235601), - Felt::new(17934710181964143981), - Felt::new(4452402857411820110), - Felt::new(11507536382314375479), + Felt::new(8762449007102993687), + Felt::new(4386081033660325954), + Felt::new(5000814629424193749), + Felt::new(8171580292230495897), ]), Word::new([ - Felt::new(2999547141091331606), - Felt::new(3815970388294335083), - Felt::new(3235818406702695957), - Felt::new(6413763952416051197), + Felt::new(16710087681096729759), + Felt::new(10808706421914121430), + Felt::new(14661356949236585983), + Felt::new(5683478730832134441), ]), Word::new([ - Felt::new(5139836888548140301), - Felt::new(3876981810195464724), - Felt::new(16089700743443351350), - Felt::new(1833434212470092856), + Felt::new(5309818427047650994), + Felt::new(17172251659920546244), + Felt::new(8288476618870804357), + Felt::new(18080473279382182941), ]), Word::new([ - Felt::new(15554982301745873839), - Felt::new(151818417656338362), - Felt::new(9548070910841645331), - Felt::new(13558459638592248743), + Felt::new(3647545403045515695), + Felt::new(3358383208908083302), + Felt::new(8797161010298072910), + Felt::new(2412100201132087248), ]), Word::new([ - Felt::new(2397011179117920116), - Felt::new(8752502466497753750), - Felt::new(4652194430176185727), - Felt::new(474647832046121463), + Felt::new(8409780526028662686), + Felt::new(214479528340808320), + Felt::new(13626616722984122219), + Felt::new(13991752159726061594), ]), Word::new([ - Felt::new(4230974115326455730), - Felt::new(1896316786078360494), - Felt::new(11147868109563898491), - Felt::new(6393232086365640838), + Felt::new(4800410126693035096), + Felt::new(8293686005479024958), + Felt::new(16849389505608627981), + Felt::new(12129312715917897796), ]), Word::new([ - Felt::new(2837471104304140642), - Felt::new(5153261125632881780), - Felt::new(640241909830199468), - Felt::new(16978206582833722982), + Felt::new(5421234586123900205), + Felt::new(9738602082989433872), + Felt::new(7017816005734536787), + Felt::new(8635896173743411073), ]), Word::new([ - Felt::new(9383518511358660362), - Felt::new(9070368828200673888), - Felt::new(16333766749737601006), - Felt::new(267018218564404219), + Felt::new(11707446879505873182), + Felt::new(7588005580730590001), + Felt::new(4664404372972250366), + Felt::new(17613162115550587316), ]), Word::new([ - Felt::new(9842084245203653494), - Felt::new(3624620050543733613), - Felt::new(11549596931368439046), - Felt::new(15569501800395392802), + Felt::new(6991094187713033844), + Felt::new(10140064581418506488), + Felt::new(1235093741254112241), + Felt::new(16755357411831959519), ]), Word::new([ - Felt::new(1982074106153676251), - Felt::new(3670811651680553202), - Felt::new(13020939175959765999), - Felt::new(1631228032466827189), + Felt::new(18007834547781860956), + Felt::new(5262789089508245576), + Felt::new(4752286606024269423), + Felt::new(15626544383301396533), ]), Word::new([ - Felt::new(12498438494396623236), - Felt::new(12522140033657837500), - Felt::new(15931812573179338859), - Felt::new(4524495014558894935), + Felt::new(5419895278045886802), + Felt::new(10747737918518643252), + Felt::new(14861255521757514163), + Felt::new(3291029997369465426), ]), Word::new([ - Felt::new(15280875087510385592), - Felt::new(1616122979288813833), - Felt::new(8971164051716151989), - Felt::new(7735253038562305937), + Felt::new(16916426112258580265), + Felt::new(8714377345140065340), + Felt::new(14207246102129706649), + Felt::new(6226142825442954311), ]), Word::new([ - Felt::new(3109214984643679462), - Felt::new(911083193857751305), - Felt::new(5901679412876477991), - Felt::new(13358708367525191703), + Felt::new(7320977330193495928), + Felt::new(15630435616748408136), + Felt::new(10194509925259146809), + Felt::new(15938750299626487367), ]), Word::new([ - Felt::new(15186971827737962282), - Felt::new(18413440267559781060), - Felt::new(10496575362998017360), - Felt::new(13081559717536478834), + Felt::new(9872217233988117092), + Felt::new(5336302253150565952), + Felt::new(9650742686075483437), + Felt::new(8725445618118634861), ]), Word::new([ - Felt::new(5459020364317991813), - Felt::new(13522209963728741381), - Felt::new(7336753520967971663), - Felt::new(6316033838662753634), + Felt::new(12539853708112793207), + Felt::new(10831674032088582545), + Felt::new(11090804155187202889), + Felt::new(105068293543772992), ]), Word::new([ - Felt::new(9420108075927647958), - Felt::new(6547816111471735269), - Felt::new(12220545288446975893), - Felt::new(3577117082695137213), + Felt::new(7287113073032114129), + Felt::new(6373434548664566745), + Felt::new(8097061424355177769), + Felt::new(14780666619112596652), ]), Word::new([ - Felt::new(12908714971205406449), - Felt::new(12995350974802899384), - Felt::new(5883568711258737532), - Felt::new(383173514483963899), + Felt::new(17147873541222871127), + Felt::new(17350918081193545524), + Felt::new(5785390176806607444), + Felt::new(12480094913955467088), ]), Word::new([ - Felt::new(17503723628055804519), - Felt::new(9438267265380355731), - Felt::new(8794036951449618344), - Felt::new(10910433304110137166), + Felt::new(17273934282489765074), + Felt::new(8007352780590012415), + Felt::new(16690624932024962846), + Felt::new(8137543572359747206), ]), ]; @@ -464,40 +464,10 @@ mod p3_tests { } #[test] - #[ignore] - // TODO: The state layout now matches Plonky3 (rate=[0-7], capacity=[8-11]), but there's - // still a digest position mismatch: - // - Miden's Rpo256::hash_elements() reads digest from state[4..8] (DIGEST_RANGE, middle word) - // - Plonky3's PaddingFreeSponge reads digest from state[0..OUT] (first 4 elements) fn test_rpo_hasher_vs_hash_elements() { - // Test with empty input - let expected: [Felt; 4] = Rpo256::hash_elements::(&[]).into(); let hasher = RpoHasher::new(RpoPermutation256); - let result = hasher.hash_iter([]); - assert_eq!(result, expected, "Empty input should produce same digest"); - // Test with 4 elements (one digest worth) - let input4 = [Felt::new(1), Felt::new(2), Felt::new(3), Felt::new(4)]; - let expected: [Felt; 4] = Rpo256::hash_elements(&input4).into(); - let result = hasher.hash_iter(input4); - assert_eq!(result, expected, "4 elements should produce same digest"); - - // Test with 8 elements (exactly one rate) - let input8 = [ - Felt::new(1), - Felt::new(2), - Felt::new(3), - Felt::new(4), - Felt::new(5), - Felt::new(6), - Felt::new(7), - Felt::new(8), - ]; - let expected: [Felt; 4] = Rpo256::hash_elements(&input8).into(); - let result = hasher.hash_iter(input8); - assert_eq!(result, expected, "8 elements (one rate) should produce same digest"); - - // Test with 12 elements (more than one rate) + // Test with 8 elements (one rate) let input12 = [ Felt::new(1), Felt::new(2), @@ -507,10 +477,6 @@ mod p3_tests { Felt::new(6), Felt::new(7), Felt::new(8), - Felt::new(9), - Felt::new(10), - Felt::new(11), - Felt::new(12), ]; let expected: [Felt; 4] = Rpo256::hash_elements(&input12).into(); let result = hasher.hash_iter(input12); @@ -541,9 +507,6 @@ mod p3_tests { } #[test] - #[ignore] - // TODO: Same digest position mismatch as test_rpo_hasher_vs_hash_elements above. - // Rpo256::merge() reads from state[4..8], TruncatedPermutation reads from state[0..4]. fn test_rpo_compression_vs_merge() { let digest1 = [Felt::new(1), Felt::new(2), Felt::new(3), Felt::new(4)]; let digest2 = [Felt::new(5), Felt::new(6), Felt::new(7), Felt::new(8)]; diff --git a/miden-crypto/src/hash/algebraic_sponge/rescue/rpx/mod.rs b/miden-crypto/src/hash/algebraic_sponge/rescue/rpx/mod.rs index add5539a2..884c0c37e 100644 --- a/miden-crypto/src/hash/algebraic_sponge/rescue/rpx/mod.rs +++ b/miden-crypto/src/hash/algebraic_sponge/rescue/rpx/mod.rs @@ -103,8 +103,8 @@ impl Rpx256 { /// The capacity portion of the state is located in elements 8, 9, 10, and 11. pub const CAPACITY_RANGE: Range = CAPACITY_RANGE; - /// The output of the hash function can be read from state elements 4, 5, 6, and 7 (the second - /// word of the rate portion, i.e. the middle word of the sponge state). + /// The output of the hash function can be read from state elements 0, 1, 2, and 3 (the first + /// word of the state). pub const DIGEST_RANGE: Range = DIGEST_RANGE; /// MDS matrix used for computing the linear layer in the (FB) and (E) rounds. @@ -358,7 +358,8 @@ impl RpxPermutation256 { /// The capacity portion of the state is located in elements 8, 9, 10, and 11. pub const CAPACITY_RANGE: Range = Rpx256::CAPACITY_RANGE; - /// The output of the hash function can be read from state elements 4, 5, 6, and 7. + /// The output of the hash function can be read from state elements 0, 1, 2, and 3 (the first + /// word of the state). pub const DIGEST_RANGE: Range = Rpx256::DIGEST_RANGE; // RPX PERMUTATION diff --git a/miden-crypto/src/hash/algebraic_sponge/rescue/rpx/tests.rs b/miden-crypto/src/hash/algebraic_sponge/rescue/rpx/tests.rs index 7a0d6371d..fcf1ec31a 100644 --- a/miden-crypto/src/hash/algebraic_sponge/rescue/rpx/tests.rs +++ b/miden-crypto/src/hash/algebraic_sponge/rescue/rpx/tests.rs @@ -325,23 +325,8 @@ mod p3_tests { } #[test] - #[ignore] - // TODO: The state layout now matches Plonky3 (rate=[0-7], capacity=[8-11]), but there's - // still a digest position mismatch: - // - Miden's Rpx256::hash_elements() reads digest from state[4..8] (DIGEST_RANGE, middle word) - // - Plonky3's PaddingFreeSponge reads digest from state[0..OUT] (first 4 elements) fn test_rpx_hasher_vs_hash_elements() { - // Test with empty input - let expected: [Felt; 4] = Rpx256::hash_elements::(&[]).into(); let hasher = RpxHasher::new(RpxPermutation256); - let result = hasher.hash_iter([]); - assert_eq!(result, expected, "Empty input should produce same digest"); - - // Test with 4 elements (one digest worth) - let input4 = [Felt::new(1), Felt::new(2), Felt::new(3), Felt::new(4)]; - let expected: [Felt; 4] = Rpx256::hash_elements(&input4).into(); - let result = hasher.hash_iter(input4); - assert_eq!(result, expected, "4 elements should produce same digest"); // Test with 8 elements (exactly one rate) let input8 = [ @@ -383,9 +368,6 @@ mod p3_tests { } #[test] - #[ignore] - // TODO: Same digest position mismatch as test_rpx_hasher_vs_hash_elements above. - // Rpx256::merge() reads from state[4..8], TruncatedPermutation reads from state[0..4]. fn test_rpx_compression_vs_merge() { let digest1 = [Felt::new(1), Felt::new(2), Felt::new(3), Felt::new(4)]; let digest2 = [Felt::new(5), Felt::new(6), Felt::new(7), Felt::new(8)]; diff --git a/miden-crypto/src/merkle/empty_roots.rs b/miden-crypto/src/merkle/empty_roots.rs index 61fff9988..a75acfafe 100644 --- a/miden-crypto/src/merkle/empty_roots.rs +++ b/miden-crypto/src/merkle/empty_roots.rs @@ -40,1536 +40,1541 @@ impl EmptySubtreeRoots { const EMPTY_SUBTREES: [Word; 256] = [ Word::new([ - Felt::new(0xd4d013b3bb384b34), - Felt::new(0xd03164f8cbc65f58), - Felt::new(0xbbfc036f32fc5c85), - Felt::new(0xf7eabfadb9a3fb61), + Felt::new(0x7a1518d5c23cc058), + Felt::new(0x68c3009f92842fe8), + Felt::new(0xd5f1a30fb13293d2), + Felt::new(0x2cbc88b0ef345756), ]), Word::new([ - Felt::new(0xf67819110a99cafd), - Felt::new(0xef4a557934d0e308), - Felt::new(0x38031399d83ac329), - Felt::new(0xce88f2cbc782d190), + Felt::new(0x10192708daa40df6), + Felt::new(0xb3613b10fc0b47ee), + Felt::new(0xc95db182feebc1e5), + Felt::new(0x809d1e4bbb7c7c33), ]), Word::new([ - Felt::new(0xac2fe313423178d2), - Felt::new(0xc8a44a83bcc6e12c), - Felt::new(0xbe463e50848cfaab), - Felt::new(0x974703e9298be16b), + Felt::new(0xad7baa5771559881), + Felt::new(0x5de508956dd867ae), + Felt::new(0x2905c6540347266e), + Felt::new(0x40dc622dd8de98fa), ]), Word::new([ - Felt::new(0x879a7b6596dda9d9), - Felt::new(0xeb84fe8bcacdd2a2), - Felt::new(0x4840c52b62678f35), - Felt::new(0xbdb0155f421fa824), + Felt::new(0xbace6cc736e6618d), + Felt::new(0x4c3dabe05eae1960), + Felt::new(0x99a1853ba5a1932e), + Felt::new(0x89ca023beb042e34), ]), Word::new([ - Felt::new(0xef950eb94178972d), - Felt::new(0xed3b56a2ee3e12cd), - Felt::new(0x4ce4e3dc76ff1240), - Felt::new(0x4abfa77e86abfd46), + Felt::new(0x1c6e4ae9e5fc202a), + Felt::new(0x357a7ec4c1cf5318), + Felt::new(0xebf47c3fd4907657), + Felt::new(0xd8b4615d7a06584c), ]), Word::new([ - Felt::new(0x37a613ec638abc0d), - Felt::new(0x175a746054e30ce5), - Felt::new(0x5f9a13bf814d989a), - Felt::new(0xa87b8193d1558cfb), + Felt::new(0x6521715bc4f45483), + Felt::new(0x2d716202b5dc0c89), + Felt::new(0x722e8ddc909837c9), + Felt::new(0x9eef9cbb233433d9), ]), Word::new([ - Felt::new(0x785fe8125ea68f6f), - Felt::new(0xfb24b14b32d727b0), - Felt::new(0xb694a134f1a93ea3), - Felt::new(0x25a5a60d80a3f845), + Felt::new(0x21a2144315f40cc9), + Felt::new(0xfad12b6052f35f53), + Felt::new(0x4f58a0263b6ac06b), + Felt::new(0x1c5a93c3e0ed3b81), ]), Word::new([ - Felt::new(0x860d2c1f729163b5), - Felt::new(0x2d633c512bcdd061), - Felt::new(0x279ad767db4e8c58), - Felt::new(0x9cca290b0d23c7), + Felt::new(0xe17df7b2e3f1f4fd), + Felt::new(0x78ddd43c79108b8b), + Felt::new(0xa944f62ebf53debf), + Felt::new(0xdc419e00ea1ac673), ]), Word::new([ - Felt::new(0x242a36a169740cdc), - Felt::new(0xd52c9f5159ca6de7), - Felt::new(0x56bd22a92d8ac820), - Felt::new(0xc47b5731b5d117e8), + Felt::new(0x13550b71498b1593), + Felt::new(0x6ffdfe94d842999f), + Felt::new(0x17ed8a0d20f1a97a), + Felt::new(0x8470bed4ee7714fb), ]), Word::new([ - Felt::new(0xe0ec018cda37fc72), - Felt::new(0xc6c4c0c4027ac161), - Felt::new(0x31706e4106bb7364), - Felt::new(0x2c98fdc73a6aff32), + Felt::new(0xca8c0f221d45e21c), + Felt::new(0xab7ec8a17338a271), + Felt::new(0x198d2c572ad44b73), + Felt::new(0x97fb2d5d68366dfe), ]), Word::new([ - Felt::new(0x5c353e1ae891454f), - Felt::new(0x81288a98893b47b7), - Felt::new(0xb4123d11cf90f0d6), - Felt::new(0x59d86d7b3e4d8803), + Felt::new(0xb227f02eca29f805), + Felt::new(0xf481fa56981769e8), + Felt::new(0xe5e143a48c597276), + Felt::new(0x882fd1e2a743442), ]), Word::new([ - Felt::new(0x6ed50dc2f8ebca44), - Felt::new(0x96cac3183d07e9ee), - Felt::new(0x510e65c781fd85ae), - Felt::new(0x364de2f26f64f4b9), + Felt::new(0xfadcfe0374b44556), + Felt::new(0x43a3da6902312ed1), + Felt::new(0x2900f9e01835eac8), + Felt::new(0x2830bc4d5a08631b), ]), Word::new([ - Felt::new(0x46acade0fa75da3), - Felt::new(0xe5ca56dd8a3ec270), - Felt::new(0x496e1498d81c5867), - Felt::new(0x8a357dd809d4e1af), + Felt::new(0x6e425eaeaf389630), + Felt::new(0x8060635d9c8d40bd), + Felt::new(0x782055fcc4027bab), + Felt::new(0x1cd8f421713d0039), ]), Word::new([ - Felt::new(0x79ea9c14b4f80e54), - Felt::new(0x883a1aa66b877d7d), - Felt::new(0x2821d027cf4b82f), - Felt::new(0x498b9fbbb9154b65), + Felt::new(0x7bba2a234f88e315), + Felt::new(0xcd615c602b5fe2cd), + Felt::new(0x5a9e081b1af5d7fa), + Felt::new(0xecfa1e7751d9919), ]), Word::new([ - Felt::new(0x8141c1f5a278091b), - Felt::new(0xa462c11136d598b), - Felt::new(0x93ac8ed23507910a), - Felt::new(0x514a3f91433bd1), + Felt::new(0xac2565372049b11), + Felt::new(0x1399af9f36718fdb), + Felt::new(0x86e0730595695b77), + Felt::new(0xce24042e52ea8f72), ]), Word::new([ - Felt::new(0x2638564f8f4124a8), - Felt::new(0xedb10a48ac24fbde), - Felt::new(0x8614d28f2aa8fc8f), - Felt::new(0x36ec52375c4db737), + Felt::new(0x31a44240c5ea1596), + Felt::new(0x6ac2462879567985), + Felt::new(0xc5dff2fa6e4bf9ed), + Felt::new(0x109baf62f5656431), ]), Word::new([ - Felt::new(0x17bb63973b3ce758), - Felt::new(0xbceb2233c011acb9), - Felt::new(0x1353c736a9944f64), - Felt::new(0x755cb79ca6f7f55c), + Felt::new(0xc0a1d9643a789711), + Felt::new(0x287754605bb44336), + Felt::new(0x96e143926e6b05a7), + Felt::new(0x27896b88297f95fe), ]), Word::new([ - Felt::new(0xcd102aca9271751c), - Felt::new(0xe9517a03fa6e0961), - Felt::new(0x31253e5814e7c010), - Felt::new(0x391f3e31cb7a16d8), + Felt::new(0x68bf7a3147fe7190), + Felt::new(0xad11cc1491d94621), + Felt::new(0x1c5684427eb041d3), + Felt::new(0xd2cd7f76c89ed840), ]), Word::new([ - Felt::new(0xacd417612af2a6ac), - Felt::new(0x238b4d41647e0407), - Felt::new(0x43bd0eb02df70e6a), - Felt::new(0xe9f44baff7a2a27a), + Felt::new(0xd227c79d40d38aa0), + Felt::new(0xde50cadec8a7f9e8), + Felt::new(0x1966a4fabc12be53), + Felt::new(0x2cc1aec4bf8eb07a), ]), Word::new([ - Felt::new(0x1116ad4d849e6806), - Felt::new(0xd6190ac4ec72eef2), - Felt::new(0x3ecf9207fd73cd85), - Felt::new(0x6c78ec956d2d1051), + Felt::new(0x215ee19f91f3b3c), + Felt::new(0xa431547dc8268b58), + Felt::new(0x2a0d094750f517b7), + Felt::new(0x1bed221ea2d85b43), ]), Word::new([ - Felt::new(0x205fe8449bfce0de), - Felt::new(0xe165f38d70da454a), - Felt::new(0x822e14e93a452d0a), - Felt::new(0x94d05b4cd577a64), + Felt::new(0x3cdc78415946c8a5), + Felt::new(0x5f907795364f886a), + Felt::new(0xcda1dc461e842b0a), + Felt::new(0x713eef642ca36a92), ]), Word::new([ - Felt::new(0xf492fd7cacb1922), - Felt::new(0x2a703ca8f69ad1c8), - Felt::new(0xfcadfa03b409ead8), - Felt::new(0x782795592ae9a71e), + Felt::new(0x53f883132cfd1fc3), + Felt::new(0xed640e5ed33c0033), + Felt::new(0xcb2403903bfcc4a7), + Felt::new(0xfddb8e4711c089c7), ]), Word::new([ - Felt::new(0xa64f8b17ffb12710), - Felt::new(0x62f2e2fcae200d34), - Felt::new(0xbafb78b1425cddb1), - Felt::new(0xcfb390385991d1a7), + Felt::new(0xbc76a3d22dc4a6a3), + Felt::new(0xc5132a2358773b7b), + Felt::new(0x160effcc8acea428), + Felt::new(0xc7e8567ab4eb5d75), ]), Word::new([ - Felt::new(0x3536fe931db61ed7), - Felt::new(0x23cc15387a7c7c4d), - Felt::new(0xd186b10bba44f5a0), - Felt::new(0xcc0774c067c213ca), + Felt::new(0x6227233a672c4d53), + Felt::new(0x7021cea1e48eeef0), + Felt::new(0xeddedec3ef0be480), + Felt::new(0xa12e79c58f0f5195), ]), Word::new([ - Felt::new(0x27f3232af1718d73), - Felt::new(0x6990c361978421b3), - Felt::new(0xa4a29b2ef4262014), - Felt::new(0x2245bc20ac47d643), + Felt::new(0x968638ed9f01e885), + Felt::new(0xffea5aba5916bc0), + Felt::new(0x839a8aed3e4a4d4a), + Felt::new(0xcc8ced80d6d55b30), ]), Word::new([ - Felt::new(0xfaf974458f303f50), - Felt::new(0xd0f09ad179c053b4), - Felt::new(0x1da69781fd4092b9), - Felt::new(0x1a199f9d1188e3a4), + Felt::new(0x420f83d6ff9afeb6), + Felt::new(0x8175237f0a60471d), + Felt::new(0xd2e50161a05523c0), + Felt::new(0x58758141d44bb085), ]), Word::new([ - Felt::new(0x8507c4f9b071ed40), - Felt::new(0x474c7c36c6f0e46), - Felt::new(0x1c86f35500c8ffb6), - Felt::new(0x1e643fd431145fbc), + Felt::new(0x8f6c9d38bcd56c06), + Felt::new(0x5d76e879f318dbb), + Felt::new(0x63824a7a2d1e847e), + Felt::new(0x157a7b7cd42546a0), ]), Word::new([ - Felt::new(0xdda5fad6063ec39c), - Felt::new(0x5beb591fe9f74db8), - Felt::new(0x2cd9f4a80f04ff02), - Felt::new(0x7268b4fb35179185), + Felt::new(0x7b09646224c1fe2e), + Felt::new(0xa382a27d974d9aa8), + Felt::new(0xff220f696f8bb528), + Felt::new(0x1abc61b6597dc6c5), ]), Word::new([ - Felt::new(0x308f6a5c95ce95fc), - Felt::new(0x82f70df64a17e9f0), - Felt::new(0xe80de3338c098af1), - Felt::new(0x5fe10b5e07998b3b), + Felt::new(0x2288f10b538108f5), + Felt::new(0x6ae6919992381a06), + Felt::new(0xfb2ff6c6d7a95519), + Felt::new(0x90da6d7a159eab68), ]), Word::new([ - Felt::new(0x28e4f449c4dc2adf), - Felt::new(0xe174db2e584aa9c3), - Felt::new(0xe8e3eb3aed67d861), - Felt::new(0x38fc385388fe3b4b), + Felt::new(0x8396e3f3e4411a3e), + Felt::new(0x8a7a5d5c8d5b9453), + Felt::new(0xb74a5105cb6340d3), + Felt::new(0xef3a0ed14f6349fb), ]), Word::new([ - Felt::new(0xae686c27269cbf5b), - Felt::new(0x11b9c5ff17793d4), - Felt::new(0xe0c5db4b2059c649), - Felt::new(0x445555cda23e2339), + Felt::new(0x19661575d6f57881), + Felt::new(0x3979a60e79d44f7c), + Felt::new(0x6bfb0808c2a0170e), + Felt::new(0x63e20a4286bb3f0f), ]), Word::new([ - Felt::new(0x37af66cbfacb6574), - Felt::new(0xb6f29cd32ecff8a9), - Felt::new(0x109cc2114e88e51), - Felt::new(0x315e647d8b7aff19), + Felt::new(0xe9b45b0e8461467), + Felt::new(0x49df3dc7fe793402), + Felt::new(0x9b77b3d339e4e9d4), + Felt::new(0x51da4e29d3f43dba), ]), Word::new([ - Felt::new(0x88435bdfe977671b), - Felt::new(0xbac2cd47398206ae), - Felt::new(0x8a6524314f775ffa), - Felt::new(0x50a0747244165a47), + Felt::new(0xe70a0e47287d6ea1), + Felt::new(0x8ecbdce5ed4904e1), + Felt::new(0x48a8d45f3fb7bfe9), + Felt::new(0x303b724ed4de6599), ]), Word::new([ - Felt::new(0xf93146fff2f3e0a0), - Felt::new(0xd1a7fb4ede819b11), - Felt::new(0x349045c7bc84e1e), - Felt::new(0x9c2b9a154ae7bbe7), + Felt::new(0x11e1af5bdbb1dd3c), + Felt::new(0xd623d0a0e66efba3), + Felt::new(0x820e7f8c20355f29), + Felt::new(0xd14d6d3907f79f54), ]), Word::new([ - Felt::new(0xad06f8b05dac78ee), - Felt::new(0x37816807e44d3780), - Felt::new(0xe8e5bd1da59ce1d9), - Felt::new(0x91ae41e1b89275aa), + Felt::new(0x264792bb76d1c6c7), + Felt::new(0xe2982176db15e281), + Felt::new(0x8e563c0ffd9cf26f), + Felt::new(0xb84d656d2098fb2c), ]), Word::new([ - Felt::new(0x4715873f981c2ccf), - Felt::new(0xb7aa499ae6b01e62), - Felt::new(0x959a1928d30e11d0), - Felt::new(0xcc9abdbe7aaad07b), + Felt::new(0xb4b65da1a2f37ac1), + Felt::new(0x8ce542279c62b719), + Felt::new(0x2bb44a38cd28334), + Felt::new(0x3460af36ee05e6a4), ]), Word::new([ - Felt::new(0x3dcf6c350a8e526), - Felt::new(0xc52777fc1f6b32e8), - Felt::new(0x9c49c05bb56ddc2e), - Felt::new(0xa1b3dfc99f13a03f), + Felt::new(0xd0c6531207ed16da), + Felt::new(0x65b14c94e53348ca), + Felt::new(0xb146aa53607084ed), + Felt::new(0x1be4eed9b6ae4de7), ]), Word::new([ - Felt::new(0xa597f830226ef1f5), - Felt::new(0x5e1fcf25e10b4cf3), - Felt::new(0xe025b9a81ee9756d), - Felt::new(0x5dd31ba2e0ec0692), + Felt::new(0x63a3380d1a006c75), + Felt::new(0xa739bf6245222179), + Felt::new(0x13df3fe01a95dd79), + Felt::new(0xcb589a58b4375231), ]), Word::new([ - Felt::new(0x4be63f346843f194), - Felt::new(0xb30132e5e74d00db), - Felt::new(0xe2ccdeb944709adc), - Felt::new(0xd1f0139c25f9b13d), + Felt::new(0x275515c40097d89b), + Felt::new(0x464331cfc86aaf76), + Felt::new(0x2d69a8c1271cc1c9), + Felt::new(0x9f135fa326f0a170), ]), Word::new([ - Felt::new(0xca9cd71ab6856ea8), - Felt::new(0x10f6ea721a4bf0a5), - Felt::new(0x9a06e1a183a22306), - Felt::new(0x8a3faeaf4a2ea40), + Felt::new(0x330774dff4622a45), + Felt::new(0xdab997e374e73361), + Felt::new(0x722fd5d7b681296b), + Felt::new(0x652d9ac7fb305ca1), ]), Word::new([ - Felt::new(0xb7e44129fa910201), - Felt::new(0xee63e42d5870e05), - Felt::new(0x90de82957f6f7611), - Felt::new(0x922508602610b4c4), + Felt::new(0x8ac8a548fa2901b2), + Felt::new(0xe5939b720a40e027), + Felt::new(0xe1c12b4143f08e7), + Felt::new(0x47181ac3bbfe7c55), ]), Word::new([ - Felt::new(0x5748ea87fe17aa82), - Felt::new(0xf254ca97acb5860b), - Felt::new(0xf226ad12f0ef99d1), - Felt::new(0xe8f16fcdee81c903), + Felt::new(0x75f1101119bd9132), + Felt::new(0x48061d0a7e02ff4f), + Felt::new(0x87321a2bb298fa5), + Felt::new(0xaa9e0199e75a8b88), ]), Word::new([ - Felt::new(0xb9082632c812362), - Felt::new(0x9ebd9df147cc9ac1), - Felt::new(0x149c151789f00cc), - Felt::new(0xec10fb00b714c0c9), + Felt::new(0x203e8caee818bbe7), + Felt::new(0x54ec39e86e3bfc74), + Felt::new(0x37a6a845c6b64b5a), + Felt::new(0xd18931d1b800606c), ]), Word::new([ - Felt::new(0xf223d6595826f21d), - Felt::new(0xce63a90b49c4ca59), - Felt::new(0xf727d89b56e794bb), - Felt::new(0x1c9181246b3526b6), + Felt::new(0x57e03388213c8b13), + Felt::new(0x47f26439d9764d57), + Felt::new(0xee8b0e6683b76e4d), + Felt::new(0x9d732634cb929b4d), ]), Word::new([ - Felt::new(0xe0af5862ca07232b), - Felt::new(0xb860dc5cf7476388), - Felt::new(0x318cf53cb85cf0aa), - Felt::new(0xc77418b80807b2f4), + Felt::new(0x6e22ad3534c01591), + Felt::new(0x2c54132d486f7026), + Felt::new(0x8efa48a4071e3403), + Felt::new(0x9949b817da0f2395), ]), Word::new([ - Felt::new(0x315464c85cd19846), - Felt::new(0x14b0c0ef112d95fe), - Felt::new(0xdece0dcc6de0455f), - Felt::new(0x3b164fa9f4be4c06), + Felt::new(0x48415b26c3ff6633), + Felt::new(0xa3e301f4a2512c0), + Felt::new(0x45223bfb0ea9933f), + Felt::new(0x704bf93dfdb84760), ]), Word::new([ - Felt::new(0x8e66d668c9d512c5), - Felt::new(0xea846421e3ec6e05), - Felt::new(0xffc03d33dadcbac8), - Felt::new(0xab1ae8f59bf9a5d6), + Felt::new(0x18c8d36aca06d30a), + Felt::new(0x599733c783e95db0), + Felt::new(0x47d6e190eae194d9), + Felt::new(0x9bceba0c6f764cef), ]), Word::new([ - Felt::new(0xe163b5dabfe4edd0), - Felt::new(0x4dc36c5ed11f9cb2), - Felt::new(0xc451461bd8f8cda5), - Felt::new(0x9792f15ace2257a7), + Felt::new(0x90617f8240949645), + Felt::new(0xe0a01888d04566a7), + Felt::new(0xc413a63dc2e5b2a7), + Felt::new(0x4b5df8cbc7de8b0a), ]), Word::new([ - Felt::new(0xad94af4ea13cbd58), - Felt::new(0x49c76b5c6b037521), - Felt::new(0x3fff24b5cba2abbc), - Felt::new(0xd2ea4cae87e32bc3), + Felt::new(0xe35b06d63cef6c26), + Felt::new(0xb9f9bb36756e258), + Felt::new(0xb46751fdf68f1f85), + Felt::new(0x95b95fd16bc2e91e), ]), Word::new([ - Felt::new(0x5ee230a2b21fbcc7), - Felt::new(0xe7c913b10480cb37), - Felt::new(0x6a24020e33160aa4), - Felt::new(0x84c850b3d3ee08d2), + Felt::new(0x5d70054d30c0bc16), + Felt::new(0xec83cbed7d84059d), + Felt::new(0x589fa4f1fb83a737), + Felt::new(0x704ba66a12a7cb82), ]), Word::new([ - Felt::new(0x3bd7c1276c057731), - Felt::new(0x7624e520a4e8689f), - Felt::new(0x9fc7046216ea744f), - Felt::new(0x1e91ef277981e545), + Felt::new(0xccd71b6ac807031f), + Felt::new(0x27c6d6972ca2f038), + Felt::new(0x15f7b976b1a83b6a), + Felt::new(0x2fc2021f31eda8e8), ]), Word::new([ - Felt::new(0x750ed3b5ce658966), - Felt::new(0x1ad8497510856c13), - Felt::new(0x6a454fcd8e9aecae), - Felt::new(0xe173f9edaa9f520), + Felt::new(0x5b83a427101b26d1), + Felt::new(0xe228ce6616b91449), + Felt::new(0x6dd910afce37d26a), + Felt::new(0xd5a859060e53feba), ]), Word::new([ - Felt::new(0x3da83f217a938e84), - Felt::new(0x72429a871dd069e8), - Felt::new(0x56fef2cfd959214e), - Felt::new(0xebdec7e27de3d78e), + Felt::new(0x2ec1ebe8d98ab168), + Felt::new(0x84940081d4b37e6a), + Felt::new(0xb5abbe477682d673), + Felt::new(0xb6e35a3f33737ce5), ]), Word::new([ - Felt::new(0xe4f9bd5af54aea89), - Felt::new(0x93e3490464ba3dec), - Felt::new(0x2977298399d5431a), - Felt::new(0x8cbf576d0718e734), + Felt::new(0x1f81bb8e5d9b6775), + Felt::new(0x2041277fe91d6647), + Felt::new(0x9f33bcba3329e05), + Felt::new(0x2ab1e65fd5a966e), ]), Word::new([ - Felt::new(0xbab45c995d032de2), - Felt::new(0x72f5b2172139a0ac), - Felt::new(0x9e187c1cf79c0b58), - Felt::new(0x9b90ca39e8bb2da9), + Felt::new(0x33bc5fb208fa395e), + Felt::new(0x5410fc2bf42413d4), + Felt::new(0xe1ad110a80d22fd), + Felt::new(0xa2054e3a0d379015), ]), Word::new([ - Felt::new(0xae672772d64afa0c), - Felt::new(0x370fa7b34411bee9), - Felt::new(0x28ae49eb522be4f3), - Felt::new(0x1e5737f6b6d7a0f), + Felt::new(0x9699cc4fdfd42834), + Felt::new(0xa76f357aad26bd8e), + Felt::new(0x7f53ea51859546da), + Felt::new(0xc6cf1c173bfe674d), ]), Word::new([ - Felt::new(0x1c901146dab3e028), - Felt::new(0xa48d69faa209a43d), - Felt::new(0x812dee69d638b842), - Felt::new(0xafef0923d1fc3d54), + Felt::new(0xa6ed91e61e570a03), + Felt::new(0xddd8836d1bcf7a1b), + Felt::new(0x151fa005c6cbec3e), + Felt::new(0x5a6b90196b04c5e), ]), Word::new([ - Felt::new(0x59633b3e017134fb), - Felt::new(0xb0e7714970789f95), - Felt::new(0x8d025fa5876626da), - Felt::new(0x964013427fb35552), + Felt::new(0xa1384b20e2f7f0e0), + Felt::new(0x5997839cc1485d52), + Felt::new(0x764262542d2ce276), + Felt::new(0xbb5ce0fc148f2f8), ]), Word::new([ - Felt::new(0xa6f318dbb996cec6), - Felt::new(0x602d3f78ea9e5fc7), - Felt::new(0x33cc086f6c81ec4c), - Felt::new(0xfb5875ef0723ac08), + Felt::new(0xcf58de7ecc74b7d0), + Felt::new(0x2d05d90f8f89a003), + Felt::new(0x140c36afde7a8503), + Felt::new(0x2c85492253719879), ]), Word::new([ - Felt::new(0x47f22a85e61ccce2), - Felt::new(0x183642989e08d0c4), - Felt::new(0xdbc6ac210367e51d), - Felt::new(0x713d9f083fb06bed), + Felt::new(0xc43f9d1075e50eb5), + Felt::new(0x21a4177440ee0514), + Felt::new(0x6556ffb110aee068), + Felt::new(0x5c4ac4233182eed8), ]), Word::new([ - Felt::new(0x3b9b50e61ac294de), - Felt::new(0xa2d43695646f9847), - Felt::new(0xbf7baaab45a7a335), - Felt::new(0xfff6990e4e2af1c5), + Felt::new(0xd161b6f2ba6083eb), + Felt::new(0xf9ca3dff0f55b7b0), + Felt::new(0xea722afc3a4ca67c), + Felt::new(0xfa69b06dd2793839), ]), Word::new([ - Felt::new(0x2f14338754790fc2), - Felt::new(0x880c6e172b727a07), - Felt::new(0x62648c19e70a3d9a), - Felt::new(0x11cb177e7cfb88c0), + Felt::new(0x49937dceddf01780), + Felt::new(0xd0923d2e8faf74c4), + Felt::new(0x820f1991402fc8a8), + Felt::new(0x67a2d055ea1f777c), ]), Word::new([ - Felt::new(0xbcc6ccf09f20091d), - Felt::new(0x7522cbe658fd241a), - Felt::new(0x1812abe3a41a4280), - Felt::new(0xfc42fb700c9dee6b), + Felt::new(0xc39ffe45524b9e65), + Felt::new(0x956a2ac4ff4c63bb), + Felt::new(0x93eeccaea6136bb2), + Felt::new(0x7b88b7f2852ed69b), ]), Word::new([ - Felt::new(0x9f9ed8a88a3d4726), - Felt::new(0xba717fb8a0e5a430), - Felt::new(0x8b6c5d03ae8285e0), - Felt::new(0xc79ea08e4547b79c), + Felt::new(0x7ebf64a852d49f4c), + Felt::new(0x5d2f34df27b34c2b), + Felt::new(0xd82dd65960331467), + Felt::new(0x7ee8a1c82f2775ba), ]), Word::new([ - Felt::new(0xbfabb7d2dcad0d97), - Felt::new(0x1b1b6214bd392a65), - Felt::new(0xc0dfcf7f7c8a0075), - Felt::new(0x92f1111ac16144a6), + Felt::new(0x341eef38eb1b44b0), + Felt::new(0x11e89c557152d8d7), + Felt::new(0xd298bf05bcfe7f29), + Felt::new(0xb6ab5d0889a6a990), ]), Word::new([ - Felt::new(0xbf5f42c3265dcb0), - Felt::new(0x407eb8baea7dcb85), - Felt::new(0xb8ed9f82f53adca), - Felt::new(0x48259d20bd4bdb71), + Felt::new(0x9d0e247831447b45), + Felt::new(0xb9b37f61a359984e), + Felt::new(0x35acfcf2065910a1), + Felt::new(0x39ed68f475187cd6), ]), Word::new([ - Felt::new(0xc4f4b1eb33ce8426), - Felt::new(0x5a8bde74b2d03fef), - Felt::new(0x92edaf43c6da7999), - Felt::new(0x72e9f2ac423e2c0a), + Felt::new(0x3fac499e38fc1c4f), + Felt::new(0xac5f1f88b4c0b263), + Felt::new(0x8ae162b1de7dd0e9), + Felt::new(0x695b42060377397c), ]), Word::new([ - Felt::new(0x598f122070bf172b), - Felt::new(0x5150f2a1c8871ab9), - Felt::new(0xb12f586f154cdad3), - Felt::new(0xcfce74f1c561e599), + Felt::new(0xbd58816e80b1327), + Felt::new(0x7c6f6ececda432bc), + Felt::new(0x8a5806e14c3af9fe), + Felt::new(0x6d49dacfbb83465b), ]), Word::new([ - Felt::new(0x438ae220bc4198c0), - Felt::new(0x8dc7553ee68ff669), - Felt::new(0xc535627dc3bc8821), - Felt::new(0x9f82b9714c7fccf9), + Felt::new(0xf6015087f3a73253), + Felt::new(0x175d591b6e76f2cc), + Felt::new(0x7bec8218e9320dd1), + Felt::new(0x7d31b42b1ce3ab16), ]), Word::new([ - Felt::new(0x652ffdc3400dafdb), - Felt::new(0xa66c9e994e20af01), - Felt::new(0x7d34b0be5266c533), - Felt::new(0xea275f50b8ff8b9e), + Felt::new(0xf0c9e338add8f04d), + Felt::new(0xf2dc1dae4ddae881), + Felt::new(0xa2fcda9b1106379e), + Felt::new(0x5a0de26644862d15), ]), Word::new([ - Felt::new(0x7a91e0682cfb3425), - Felt::new(0x544b7251e18d909e), - Felt::new(0xd3d9b1f4d64c1345), - Felt::new(0x3a7ac3166398adf9), + Felt::new(0xb5c03bd3c6896148), + Felt::new(0xfe7a36bfa33c147a), + Felt::new(0x729e44eed48564a8), + Felt::new(0x22cf77310aa13eee), ]), Word::new([ - Felt::new(0x13b43b61fd8b9763), - Felt::new(0x7621715646680ba7), - Felt::new(0x9554a9e85f3ef765), - Felt::new(0xb82abbece04fe626), + Felt::new(0x9772b44487c3cd80), + Felt::new(0xc669f2622ac9ca43), + Felt::new(0x942fc94dad4a902e), + Felt::new(0x3f89e3b19deb8c97), ]), Word::new([ - Felt::new(0x47c8c9caaae02ee2), - Felt::new(0x69170ecdb159f653), - Felt::new(0x19e86343ec24c391), - Felt::new(0xd97d7f86759e06db), + Felt::new(0x48485ad32a4c0f96), + Felt::new(0x5613169c77f1b833), + Felt::new(0x25472149c26b0004), + Felt::new(0x63d85088841a9ee8), ]), Word::new([ - Felt::new(0xaa016ad8b15ae2a3), - Felt::new(0xbf79198389f5e29a), - Felt::new(0xebb1be02db8e5dad), - Felt::new(0xbaad4adddac74614), + Felt::new(0x7f25634b7a87282d), + Felt::new(0x834e1d48d1253c1d), + Felt::new(0x727e328428579bbc), + Felt::new(0x7ca91d98d4a1bf3c), ]), Word::new([ - Felt::new(0xa598203fd55a57b5), - Felt::new(0x792d5bb12dfa6981), - Felt::new(0x60165fc661111f52), - Felt::new(0xfba792703986303a), + Felt::new(0x8094a778288c8003), + Felt::new(0xf8696b015bd1d989), + Felt::new(0x987f8a6c08926e30), + Felt::new(0xf2e59da44b90b561), ]), Word::new([ - Felt::new(0x22945a0a7900e41f), - Felt::new(0x6be915078ff845f2), - Felt::new(0x217d9b0dd802d38a), - Felt::new(0x78f69158f7f54bf9), + Felt::new(0xbe0f3a746cdbdc00), + Felt::new(0x5680d157e1c756fc), + Felt::new(0x59399408affa9b63), + Felt::new(0x8b226544c63fc2a1), ]), Word::new([ - Felt::new(0x76e23b690cd0c900), - Felt::new(0x6d8206a2d66bbeb), - Felt::new(0xe9aa6f3f234fbbb4), - Felt::new(0xe44e67909ba1f23c), + Felt::new(0x1b03f4daa6c14153), + Felt::new(0xcaf37c5daad9a5a8), + Felt::new(0xedf3f3cf082b0a1), + Felt::new(0x7bb50256590e6865), ]), Word::new([ - Felt::new(0xb54f48d189e7a365), - Felt::new(0xd266320771aab9f3), - Felt::new(0xafcc721b705424b5), - Felt::new(0x6408c7735a1039fc), + Felt::new(0x684ed80902ec623c), + Felt::new(0x9bb72a38cfd2ef85), + Felt::new(0x4e430aacabcf36a9), + Felt::new(0xb92c1d0058aab97a), ]), Word::new([ - Felt::new(0x15f30216ae30560b), - Felt::new(0x4459070f418e2bfd), - Felt::new(0x9913a6f33eb9830b), - Felt::new(0x57f960ec9034c946), + Felt::new(0x583f0f6c7a070004), + Felt::new(0x79ff8256f4b8502a), + Felt::new(0xf526e258a8562a7e), + Felt::new(0x61968b703bd4e7cc), ]), Word::new([ - Felt::new(0x3a81ce1c4756c8a6), - Felt::new(0xb340cc1d756ec0a7), - Felt::new(0xa8270bc5bdc0b8cb), - Felt::new(0x689965c6ba6cbe15), + Felt::new(0x518358593f4db560), + Felt::new(0xdb403bba6c33d816), + Felt::new(0x9f4ddc99df045703), + Felt::new(0x92aa4f28f2824faf), ]), Word::new([ - Felt::new(0x37f8b3632548361c), - Felt::new(0x8d04fff8fc271035), - Felt::new(0x6660bc2cafa82aa9), - Felt::new(0x8afbedd48a8365cd), + Felt::new(0x22bb678fbb6ea5f4), + Felt::new(0xf94dddeaf2e4ec8a), + Felt::new(0x54da9c720acfd54b), + Felt::new(0xada06e412b00a686), ]), Word::new([ - Felt::new(0xd2441cfa99cc7793), - Felt::new(0x9fa78d1bdb13041a), - Felt::new(0x77ff29ad572478e7), - Felt::new(0x6d9f5ef24c925e07), + Felt::new(0xa1618e51012a9c5e), + Felt::new(0xa15f5b55de9259d9), + Felt::new(0x618e763dc2525b88), + Felt::new(0x8e835e132a5ac557), ]), Word::new([ - Felt::new(0x2c80aa446b66d913), - Felt::new(0x57275023986521ae), - Felt::new(0xaedcf3d27a794882), - Felt::new(0x19a6cef92c027139), + Felt::new(0xef5f289ff8fa900d), + Felt::new(0x9cc1221cebc531a9), + Felt::new(0x47609f2d3797ff59), + Felt::new(0x9ff11778bd6f382b), ]), Word::new([ - Felt::new(0xbd054fd6a112de4e), - Felt::new(0x834c58a59932bbf8), - Felt::new(0x3ae96c071ee1793d), - Felt::new(0x8ef8f97ff99c5454), + Felt::new(0x2b34581141c1e8c2), + Felt::new(0x2257c1ce6c15034b), + Felt::new(0xc43eb451d891272), + Felt::new(0x28c2d8cda0d777d7), ]), Word::new([ - Felt::new(0x8856f7bb1b174a59), - Felt::new(0xf6563ff354a46696), - Felt::new(0xe1fbc7d206c90227), - Felt::new(0xcaa3af84acd3c8e1), + Felt::new(0xe4afdafd0f672a82), + Felt::new(0x9341ac68032a3f58), + Felt::new(0xbe8d67ddf9cfc529), + Felt::new(0x27b3ccb1bac459f3), ]), Word::new([ - Felt::new(0x66772e7cb41d39fc), - Felt::new(0xacca4213ddea573d), - Felt::new(0x42664f05a276b4cc), - Felt::new(0xb29fe26a22456679), + Felt::new(0x9388197772683085), + Felt::new(0x3778f785db5104f2), + Felt::new(0x9ba77ce1b812d2b3), + Felt::new(0xd5d85d366fba18e), ]), Word::new([ - Felt::new(0x24e2318aebce5b35), - Felt::new(0x73077a8a48ad184), - Felt::new(0x8bbc90259569d580), - Felt::new(0x56480eff5d4c906a), + Felt::new(0xe614624c3de46b54), + Felt::new(0x98438853a5f8e423), + Felt::new(0x75fc1975efa50e2e), + Felt::new(0x7b3bc747fe7d9ef5), ]), Word::new([ - Felt::new(0x35b40543fd5d212b), - Felt::new(0xa58a937ff2de45f6), - Felt::new(0x5fcccfd472db95d8), - Felt::new(0x4f161100757a6dea), + Felt::new(0x4389e290ab7be5de), + Felt::new(0xb0f8ae1bdfe7a503), + Felt::new(0x4a0bba5e50d04a4f), + Felt::new(0xf404eeb6b51c2105), ]), Word::new([ - Felt::new(0x5dadd572c3c22422), - Felt::new(0x3206d7f7b44ebf8d), - Felt::new(0x8b4bf193244db448), - Felt::new(0x6bcb14c07dcc9c98), + Felt::new(0xc35f756e305c9519), + Felt::new(0x4e686fe3acc002a3), + Felt::new(0xac394c30603412b8), + Felt::new(0x18be6e6b58ef489), ]), Word::new([ - Felt::new(0xaa20788fc7f3a4d0), - Felt::new(0xe2e2bfd3f097ca53), - Felt::new(0xa978d0066c19352f), - Felt::new(0x5398d184423634e7), + Felt::new(0xf29ba52464444de2), + Felt::new(0x727389ba7a8880a), + Felt::new(0x177fb574915927fb), + Felt::new(0x8f73e16ebb2cc82a), ]), Word::new([ - Felt::new(0x91d0351a7c8be21f), - Felt::new(0xda7751040d856eea), - Felt::new(0x4c5a8dc777ef48de), - Felt::new(0x5b2f5c5e4cca2803), + Felt::new(0x997851ba4388feab), + Felt::new(0x8e2a5f7d9ac44c9d), + Felt::new(0x8a3cb20c8e7e8c74), + Felt::new(0x5ae3eee7da848df7), ]), Word::new([ - Felt::new(0xc691ee791a55a457), - Felt::new(0xeb1c793f34c2734), - Felt::new(0xbcae087a3d678be3), - Felt::new(0xf3831ebdcedce937), + Felt::new(0x6d45c2cdad589122), + Felt::new(0xced0a31ff9c64e3e), + Felt::new(0x98b60b642b30fa4a), + Felt::new(0x90be60523065a966), ]), Word::new([ - Felt::new(0x70698bc7a47bfee6), - Felt::new(0xd0de44e29f3f53c3), - Felt::new(0x1c783f6a3027d6d4), - Felt::new(0xcf471edad4b8b5b1), + Felt::new(0xc5469bc4f00a8b98), + Felt::new(0xfea50c983bad6953), + Felt::new(0x77a1f18d385da1cf), + Felt::new(0x78258773d7497a4c), ]), Word::new([ - Felt::new(0x9d9a7ba0c28c9b0), - Felt::new(0xa9c5ded371690a3), - Felt::new(0x68cead239c142d5d), - Felt::new(0xb3da455ac3e8c280), + Felt::new(0xbe1ba2a05855dba2), + Felt::new(0xd25b3fbd2aeff508), + Felt::new(0xa21fba1bed1ec4d), + Felt::new(0x28dd25121e82491b), ]), Word::new([ - Felt::new(0x45e78e5a90711466), - Felt::new(0x5e586906a8afdbfe), - Felt::new(0x6957d43fe2fbf643), - Felt::new(0x8169390aa0a7a016), + Felt::new(0x26ebaf1a66aa491a), + Felt::new(0x11d70f7351ee6327), + Felt::new(0xf535e89e7a333f31), + Felt::new(0x81f0540d0aaf2fcd), ]), Word::new([ - Felt::new(0x651849781803dcba), - Felt::new(0x1dfa87fa6bb77c70), - Felt::new(0x407a3c5fa2a98eba), - Felt::new(0x1d68b5e80773f948), + Felt::new(0xeaa63a84b49f9af3), + Felt::new(0x2b560a1b9e2f030d), + Felt::new(0xa8058c8c80d5122f), + Felt::new(0xa7d5eb61056af830), ]), Word::new([ - Felt::new(0xd1bc04ab006424b9), - Felt::new(0xc26dca97a7c8b57c), - Felt::new(0x3ebccc08d498980f), - Felt::new(0x4aadc0cf30681742), + Felt::new(0x93f61b54d7c8b14f), + Felt::new(0xa05e12137fbee56f), + Felt::new(0xed0ca87839d2afbc), + Felt::new(0xee1d0c89603096c9), ]), Word::new([ - Felt::new(0x691bbae5c2363914), - Felt::new(0x2701ea5c4090a565), - Felt::new(0x543dad0d02a72d6c), - Felt::new(0x7ca616c64e6e8431), + Felt::new(0xd32f7fd432f7c926), + Felt::new(0x9a10ef3aedd9c5cc), + Felt::new(0x987ff803b8ad5608), + Felt::new(0xfe0474bb58ed017d), ]), Word::new([ - Felt::new(0xd3e4efff0a78a14f), - Felt::new(0xfc4778255fc8af49), - Felt::new(0x546dc6aa0893f40a), - Felt::new(0xef5cce0fc114d149), + Felt::new(0x730b984ab280d1eb), + Felt::new(0x59a4121bb947dd5d), + Felt::new(0xcf3a0ce3778acbad), + Felt::new(0x5db9a2dcb6f5168c), ]), Word::new([ - Felt::new(0x649810ed8e93ca3e), - Felt::new(0x4485a76dd95d5525), - Felt::new(0x7c900111bca87c90), - Felt::new(0x10e1fe25f069dde8), + Felt::new(0x1017554397bc5cf1), + Felt::new(0xe4b0c8118343e3fe), + Felt::new(0x874d4c65e29e473b), + Felt::new(0x3fe19c4c0f73bf91), ]), Word::new([ - Felt::new(0xec89042fdd1f8b54), - Felt::new(0xf0078a00c08ce8e4), - Felt::new(0x62270559b0fc131b), - Felt::new(0xe0b082313e5a1e06), + Felt::new(0x1cd2791b4ac8bb3b), + Felt::new(0x82772647faaa67d8), + Felt::new(0x7cd3cf3dbd601244), + Felt::new(0xa8931437bd6e90a6), ]), Word::new([ - Felt::new(0x45339be9146a2de8), - Felt::new(0x5fc43b172c080f4a), - Felt::new(0x1326d84051af11cc), - Felt::new(0xd4388c68206e571), + Felt::new(0x74fbc0ab37c21d7b), + Felt::new(0x1f8e2d4c14e1ca17), + Felt::new(0x8dadb87ff6a1f8ed), + Felt::new(0xb706bbc88126c74e), ]), Word::new([ - Felt::new(0x90f7990f2011d278), - Felt::new(0xd7fd43dfe4e2801a), - Felt::new(0x891eeb2683ddbcd), - Felt::new(0x6428a09bd8abd20d), + Felt::new(0x31b4709960a4d7b4), + Felt::new(0x508dc734dfe651f6), + Felt::new(0xafb61654eb7900f7), + Felt::new(0xc881d1a87e04d076), ]), Word::new([ - Felt::new(0xa5391efe50dbd262), - Felt::new(0xed3faada8319059c), - Felt::new(0x65ba768005e0ca21), - Felt::new(0x1db0617dde441c19), + Felt::new(0xf671c8c96ffdf309), + Felt::new(0x4005499dff3633b1), + Felt::new(0x1d46b157205ff55c), + Felt::new(0xcb2e52106d23325d), ]), Word::new([ - Felt::new(0xfd185ff92b0d6665), - Felt::new(0x493b9e981a928985), - Felt::new(0x10a8cc048b503dfc), - Felt::new(0x431de81f245199a1), + Felt::new(0xa0f62c3db76f6d96), + Felt::new(0x5e7853c7126abf61), + Felt::new(0x829e4767b3f3d677), + Felt::new(0x6997a407759f40ac), ]), Word::new([ - Felt::new(0xe7bd111d49122dee), - Felt::new(0xf3cbc6eb3ae9ad03), - Felt::new(0x1aa06cb4e6bfd9d0), - Felt::new(0x7000818ef60948bf), + Felt::new(0x6c13bfd2f92eb71d), + Felt::new(0x1297af3418d02e44), + Felt::new(0x50c8024a610d8ef4), + Felt::new(0x287f45266da74eda), ]), Word::new([ - Felt::new(0x3f937eae6d1bc12f), - Felt::new(0x31a6204b20c50f62), - Felt::new(0x2cb6d3bf7fb63b71), - Felt::new(0x1c6cebf6859f190), + Felt::new(0x5a1764d52f31ba3d), + Felt::new(0xa9cf37c5cf23f5a6), + Felt::new(0x4e9c41b0d6167ec8), + Felt::new(0x512047298db42fa4), ]), Word::new([ - Felt::new(0x23a2608bd7511a70), - Felt::new(0x2328fecd0c0a2f0), - Felt::new(0x143309aa803444bb), - Felt::new(0x2eecdeeb0b07b412), + Felt::new(0x72d22ed9f10b4809), + Felt::new(0xe6072223f5d44bff), + Felt::new(0xfc35f03e39f9f907), + Felt::new(0xa6217147569d81e1), ]), Word::new([ - Felt::new(0x7d5255c15fc9e91e), - Felt::new(0x88fa800205f9bb7e), - Felt::new(0xd0d04e515e67def2), - Felt::new(0x1ed6ea55bc8dd77), + Felt::new(0xb05f52950422138d), + Felt::new(0xd05697d1fe3a2dcc), + Felt::new(0x77e6ba921c3d88b), + Felt::new(0xe2a049098b844637), ]), Word::new([ - Felt::new(0xe9fc5915ab61bc1c), - Felt::new(0xe0fa6afd6ba01d69), - Felt::new(0xd68964b10660f670), - Felt::new(0x71ac2e66b0aae13b), + Felt::new(0x47c051e54f0aac4f), + Felt::new(0xa2c9c34701a64715), + Felt::new(0x53aa9094fc804523), + Felt::new(0x4ad7c5a854c20094), ]), Word::new([ - Felt::new(0x4b9e9c11f88d00f5), - Felt::new(0x904f275afc6569f6), - Felt::new(0x239211eb0caaae5f), - Felt::new(0x65b0d08a872ad7e3), + Felt::new(0xae5aae06914bebe0), + Felt::new(0xba723bcdede0b2f), + Felt::new(0x57c796a840fde9ac), + Felt::new(0x3e630cb89060c007), ]), Word::new([ - Felt::new(0x2d8d73f55112b25b), - Felt::new(0x26ec281b0f117fed), - Felt::new(0xa46f4c881fc9e482), - Felt::new(0x12f35ea175321d2a), + Felt::new(0x20c5789c29a5098b), + Felt::new(0xcd1dbf19d9030f54), + Felt::new(0x94cf701e167bdfbf), + Felt::new(0x13a58075092e3c2a), ]), Word::new([ - Felt::new(0xc925b59421e1185a), - Felt::new(0xece7ad8c5b6a7db5), - Felt::new(0xbc442d8a7c34f00b), - Felt::new(0xc374185ff90c0322), + Felt::new(0x1f24ae51589d6ef5), + Felt::new(0x3f603db464d888ac), + Felt::new(0x7fb3e77a51402568), + Felt::new(0xe1681cb7d5007e14), ]), Word::new([ - Felt::new(0x7fba94f35276b575), - Felt::new(0xd625f7f21f1baac), - Felt::new(0xc41275842f9300ee), - Felt::new(0x5492c759b87ee3c9), + Felt::new(0xe99e3c5ab6ad7091), + Felt::new(0x45c5aea5b498809a), + Felt::new(0xca221abad77fba94), + Felt::new(0x7c05f1dedf417422), ]), Word::new([ - Felt::new(0x5e7ac2514a419f0), - Felt::new(0xb0199d08f87b3ed8), - Felt::new(0x13b400822a4b9e1d), - Felt::new(0xdb6b8650afbd6151), + Felt::new(0x82a4f1fc61c2eb21), + Felt::new(0x6545946d94f26f7), + Felt::new(0xcac20af3361044e4), + Felt::new(0x5d1ec31b917476ed), ]), Word::new([ - Felt::new(0x8376cb5929253d7c), - Felt::new(0x42d91f237dd12ad6), - Felt::new(0x9e67f40f473b732), - Felt::new(0xeca585705164c30c), + Felt::new(0xf68ed2385443efd7), + Felt::new(0x8a693e27c0322995), + Felt::new(0x8441621b830d66a2), + Felt::new(0x301f6af5039281c8), ]), Word::new([ - Felt::new(0xf56d326ab2704657), - Felt::new(0x36b7b3cbb427dac5), - Felt::new(0xf5a3c35828d1dc16), - Felt::new(0xe4cfcc9f8e73ad43), + Felt::new(0x8d870b01e938568a), + Felt::new(0xd6b64b50844165b9), + Felt::new(0x95bb2039306f03db), + Felt::new(0x8e03338457833af8), ]), Word::new([ - Felt::new(0xd8f934e88142ea2), - Felt::new(0x8ab48d17bb596fcd), - Felt::new(0x97e762d1913c0de5), - Felt::new(0xc8e798ef60c725c7), + Felt::new(0x8cc1aa0c601d1bb), + Felt::new(0xef0e3a67248752ec), + Felt::new(0x6f3fe9f5023ea283), + Felt::new(0xc8d9d24d2b8e2f95), ]), Word::new([ - Felt::new(0x2b33eb4fe46d78ff), - Felt::new(0xe4fbf85087422d68), - Felt::new(0xa3be71210e8f07c), - Felt::new(0xa1e41e6de4e24b04), + Felt::new(0x8e054ccf1f409dd), + Felt::new(0x2c464d96520ff0f9), + Felt::new(0x94ffad08bdf83708), + Felt::new(0x1edf4b6cdbdd60c9), ]), Word::new([ - Felt::new(0x3499268114e2ff9a), - Felt::new(0x3a4eb48c12aad261), - Felt::new(0x343cfd326c8df4b1), - Felt::new(0x74cbc3fb5b2c35c5), + Felt::new(0xb0b696a89d49914), + Felt::new(0x6e776735f98bb4e), + Felt::new(0x5c21944f44b21087), + Felt::new(0x849734992138dc1f), ]), Word::new([ - Felt::new(0xe2db367c1f0e87a4), - Felt::new(0x257b6b62b00cdc95), - Felt::new(0x8ad4bbfe269b4f24), - Felt::new(0x15a7808dae47469f), + Felt::new(0x4bdde21742bfefa3), + Felt::new(0xdafc80a1f0b26a33), + Felt::new(0x72cd9166fb2e8798), + Felt::new(0x4fd0c44ab7647ae2), ]), Word::new([ - Felt::new(0xf3f305ae11e902e3), - Felt::new(0xab8176baa941360), - Felt::new(0x673dd00da221d423), - Felt::new(0xf120e4140db91620), + Felt::new(0x8fe670a9b7a4cdb), + Felt::new(0x66744865e1c00d3), + Felt::new(0x76fff27436cae08d), + Felt::new(0x565df8deedd57ccd), ]), Word::new([ - Felt::new(0xe13397eddcef1eb8), - Felt::new(0xbb461d028b2262e5), - Felt::new(0xbda28412299d8c4d), - Felt::new(0xf9a109d8f521a030), + Felt::new(0xc3c67b9b5552028b), + Felt::new(0xac755b3eac5b39cb), + Felt::new(0x2c81b9567fb06b87), + Felt::new(0x4cf63467c28df5aa), ]), Word::new([ - Felt::new(0x657ee72c8354d725), - Felt::new(0x3a4c9b595816234a), - Felt::new(0x34c6d1c59e857419), - Felt::new(0xde2140b75cda5dd9), + Felt::new(0xc6103f36100f0110), + Felt::new(0x7eb64907c28b9fa6), + Felt::new(0x27d7d1b5ebc4aeda), + Felt::new(0x1da94af08a75a5e), ]), Word::new([ - Felt::new(0xb2f7808dd5314cd), - Felt::new(0x7c92e41ab97b7a69), - Felt::new(0x549f566db9a2d2cc), - Felt::new(0x3cbfc66615ab87c3), + Felt::new(0x2f0c864709131f3b), + Felt::new(0x6bfbc8a702cf804f), + Felt::new(0x3f99016c9064e748), + Felt::new(0xf0c3bebc441e06c4), ]), Word::new([ - Felt::new(0xf8f3210f53c4a73c), - Felt::new(0xe02f8e93ca2188b3), - Felt::new(0xa85f1eec8661e796), - Felt::new(0xb54092a35c662891), + Felt::new(0x5a7cd4e8ae2216d1), + Felt::new(0x927f67dcae500db6), + Felt::new(0x988de42eab734530), + Felt::new(0xb351a01e3defb152), ]), Word::new([ - Felt::new(0xcc140605c8a0d881), - Felt::new(0x5c7fe7024738f5cf), - Felt::new(0x13c57d32b06956a5), - Felt::new(0x2bff77fe08d36405), + Felt::new(0x7742e4639683760a), + Felt::new(0x2e5e877b874c7152), + Felt::new(0x5ab41de05a496568), + Felt::new(0xbb4a1da6a81258dc), ]), Word::new([ - Felt::new(0x604a6b8a3ae5b211), - Felt::new(0x5b14ba687fb547f6), - Felt::new(0x45f41c6840cae70), - Felt::new(0xb4d5c4e603e7cc3b), + Felt::new(0xcba648f645196338), + Felt::new(0xbea16b163870415b), + Felt::new(0x18850f365ea62ce), + Felt::new(0xdb9a08a8f49dde6a), ]), Word::new([ - Felt::new(0x1fdc3eb7a3d09c11), - Felt::new(0xe10c597520ebbeba), - Felt::new(0xd9d46277af171b81), - Felt::new(0xfb66d8ffed0bef45), + Felt::new(0x2ad1b5164eb56b6e), + Felt::new(0xdc58fbf36c6b4fcf), + Felt::new(0xbbb986b3687e607a), + Felt::new(0x134d10fa63d56583), ]), Word::new([ - Felt::new(0x3b19f1217bb8ac2c), - Felt::new(0xc30c4d66bc8307e3), - Felt::new(0x2937cf7d450d6ec6), - Felt::new(0x1a3d27024116c65a), + Felt::new(0xad20e15f0a3ee8b3), + Felt::new(0xab19103387b6db49), + Felt::new(0x4c2ac536c55369c3), + Felt::new(0xe90d3067d5032686), ]), Word::new([ - Felt::new(0x43e05c31ac79e6e1), - Felt::new(0xe0e4963f57bdad22), - Felt::new(0x5d6a9d02318c7052), - Felt::new(0x2ab9fd1657a6fadb), + Felt::new(0xacf847f2722006e1), + Felt::new(0xcccd5bee8edaab77), + Felt::new(0xaf647369cc0bd07d), + Felt::new(0xac1bfe67d11eb1bf), ]), Word::new([ - Felt::new(0x870787ce13b67a3f), - Felt::new(0xdf6f383b7692c34b), - Felt::new(0xec1f9575cae0fb8c), - Felt::new(0x1ed224d4a11a1cac), + Felt::new(0xe61111070c4fa0cd), + Felt::new(0x678079994529da0b), + Felt::new(0x97f5072ac759665e), + Felt::new(0xd536a68f9a4f607e), ]), Word::new([ - Felt::new(0xb14f93cd4d7a6190), - Felt::new(0x1175e467ae8927f1), - Felt::new(0xd766f48993f79b8d), - Felt::new(0xd0ecb7b95da7a3a), + Felt::new(0x46b7a14b30fbc9f), + Felt::new(0x90857d5c4265abe1), + Felt::new(0x52b1a794404385c7), + Felt::new(0xc5dcb92c2df08437), ]), Word::new([ - Felt::new(0xf295cc19be44b7b), - Felt::new(0xf8c363f4ccd43929), - Felt::new(0x25dd3ecc30d5444b), - Felt::new(0xa063f10b17b9dcb0), + Felt::new(0xc79c6daf729eeb36), + Felt::new(0x3c8983a8d9974006), + Felt::new(0x92eff347ec15f71a), + Felt::new(0x17e86b546b852eb4), ]), Word::new([ - Felt::new(0x8d5d0e77c8267630), - Felt::new(0xaff7c4d2f12478c9), - Felt::new(0x2a33f3ba8713cfc4), - Felt::new(0xc1280360eb72e35f), + Felt::new(0x9ffd0848241eefe3), + Felt::new(0x605c79e50ebb085c), + Felt::new(0xb2bd2ab9f3697b7c), + Felt::new(0xe041389cb7150d9b), ]), Word::new([ - Felt::new(0xd65de0b57652adc7), - Felt::new(0xfbfb5deaa67d3f5f), - Felt::new(0xf80fed0effee9198), - Felt::new(0x7e139def23feb7a8), + Felt::new(0xe6104dca1a2feec5), + Felt::new(0x5a79f163170b01e9), + Felt::new(0xe84905e5a557ae64), + Felt::new(0xa9e2e8e3aae6976c), ]), Word::new([ - Felt::new(0xb4cf7c907eb0febe), - Felt::new(0x176f5bcbca3a6edf), - Felt::new(0xc6b4758c8ae4d5e9), - Felt::new(0x93c702b36ef009ea), + Felt::new(0xc1bd5e298b8eadf1), + Felt::new(0xf42b7225d038f3c1), + Felt::new(0x75503169d1d0f385), + Felt::new(0x3e3c6a4b486af2c), ]), Word::new([ - Felt::new(0x7f9cd2b8111f7fc9), - Felt::new(0x8764ee15c8a8fd1e), - Felt::new(0xfbe86cb1e581a8ee), - Felt::new(0xb841aba3fe114522), + Felt::new(0xe1f61460f57d2438), + Felt::new(0xc36dd5e7c345a99f), + Felt::new(0x873fb3656add0e10), + Felt::new(0x6504cbdd0e44b39c), ]), Word::new([ - Felt::new(0x6b64364593166c72), - Felt::new(0xbd45aadb0cb8be97), - Felt::new(0x55e33691198d1c63), - Felt::new(0xdf152a5bc9d89ec1), + Felt::new(0x3fc8825536595d1c), + Felt::new(0xe3a989ac24c442ff), + Felt::new(0x3f00298a381f556a), + Felt::new(0xf0e79665f5120cfc), ]), Word::new([ - Felt::new(0x8f92a67707c031ee), - Felt::new(0xa7e9c99dcdce915f), - Felt::new(0xa8c464c9655377e8), - Felt::new(0x3f9862d16c624dc5), + Felt::new(0xc52ffaee0c323307), + Felt::new(0x24d4b284d557b6db), + Felt::new(0xc6cc213c02c167c8), + Felt::new(0x8db5af59bd93c51f), ]), Word::new([ - Felt::new(0x122f73b5cf63f6e), - Felt::new(0xab8a77660bf07314), - Felt::new(0xdb4a9f742ac96790), - Felt::new(0x2c744408fb6e9114), + Felt::new(0x784b5f5e63326944), + Felt::new(0xb8b422abe90f40b7), + Felt::new(0x774646e33258bc8d), + Felt::new(0xc84da11887cb5742), ]), Word::new([ - Felt::new(0x31504ebc54a0b34), - Felt::new(0x93a548139238f54e), - Felt::new(0xa44eab497d5f43de), - Felt::new(0xa47c24d2b11970b4), + Felt::new(0x652dc7cb8a1f6c09), + Felt::new(0xee834858c182190f), + Felt::new(0x8b69716414504dca), + Felt::new(0x651eea2ddd727479), ]), Word::new([ - Felt::new(0x90bd7b36e037e432), - Felt::new(0xf03b6474b5a7fed), - Felt::new(0x1049be2c887db78f), - Felt::new(0x45bfc229a2fe81fb), + Felt::new(0xc7eacb774a32bb70), + Felt::new(0xfd4ed5472cacbf3), + Felt::new(0x478a07c571d2447d), + Felt::new(0x8eb18bc9d29dec70), ]), Word::new([ - Felt::new(0xabcefab499c0518e), - Felt::new(0x8bed8a8c40f921d2), - Felt::new(0xf4ae6b74a02eb437), - Felt::new(0x6c4d719eb921ae9d), + Felt::new(0x663c4616d424ebf4), + Felt::new(0xeefdee99f237d5ab), + Felt::new(0xe0b6d308cd592024), + Felt::new(0x4208b7351fa4302a), ]), Word::new([ - Felt::new(0x260185045bb46d9d), - Felt::new(0xcf6ec8ae1f324cde), - Felt::new(0xbf83f33d0d1f4e54), - Felt::new(0x3e7ca1d7b25b432d), + Felt::new(0xd481d45f71b56b77), + Felt::new(0xb10316f16afe4550), + Felt::new(0xc55ef6e4bb501483), + Felt::new(0x9494dbc8ff511634), ]), Word::new([ - Felt::new(0xb8f8851ca74c1cda), - Felt::new(0x4f6df636586033d9), - Felt::new(0x6c994c0373b29e0a), - Felt::new(0x73dbba9f1ed6e62d), + Felt::new(0xce6ab27c75267570), + Felt::new(0xa841b38a81153b84), + Felt::new(0x2a982e69815eb95), + Felt::new(0x3a781dbedba07fff), ]), Word::new([ - Felt::new(0xc25d70362fbb8e6), - Felt::new(0x9cf890e6f04bcd17), - Felt::new(0x8a0de9733a8073fe), - Felt::new(0x46530c0b1af91701), + Felt::new(0xb9986f52024a4070), + Felt::new(0xd7b04dacfb578a4c), + Felt::new(0x84335c4107ff51b4), + Felt::new(0x57d34e97a7f5bc14), ]), Word::new([ - Felt::new(0x2833f20b21253d73), - Felt::new(0x171651cfff7653e7), - Felt::new(0xaf46abb15edab5d6), - Felt::new(0xf6c4fbcf9bfb1d00), + Felt::new(0xcaf39a0799c252), + Felt::new(0xc59e04527c15e01d), + Felt::new(0xc3ee742f12d01965), + Felt::new(0x6c363303a5379a6), ]), Word::new([ - Felt::new(0x977adf260beec8f9), - Felt::new(0x5b1d61a580e45560), - Felt::new(0x73ca72831e5ed08b), - Felt::new(0x22ff61c90fb6e384), + Felt::new(0x85a9cc8568e7530e), + Felt::new(0x2cec56ea82497437), + Felt::new(0x405667275bb5fe7e), + Felt::new(0x7ec253c378286890), ]), Word::new([ - Felt::new(0xad56100db7ca3d2e), - Felt::new(0xc5d8ae7a5383a975), - Felt::new(0xa98f96eb5c11adda), - Felt::new(0x7d237a5fe25e1eb), + Felt::new(0xd718ae4b8686d41e), + Felt::new(0xadc41b281bdd380f), + Felt::new(0x568fa3dcb8be911a), + Felt::new(0xfcce156b4bbf07ca), ]), Word::new([ - Felt::new(0xa07becb353f7632d), - Felt::new(0xe6e9d83924e7d496), - Felt::new(0x12ca0d4e0dbe8926), - Felt::new(0x6f91ced93d13bbc9), + Felt::new(0x284a977ee6ab740), + Felt::new(0x52da1ee52275d41b), + Felt::new(0x44c940a446c5038d), + Felt::new(0x74332541d3a3eb4a), ]), Word::new([ - Felt::new(0x6205022f021e9e52), - Felt::new(0xb21425564d0dc6e), - Felt::new(0xd01417852116ed4), - Felt::new(0xc6e8873a45103e07), + Felt::new(0xe14f55528c248fcb), + Felt::new(0x3b14809519bb04f5), + Felt::new(0xa2ebb8accb489605), + Felt::new(0xa2f4a2890f3f7743), ]), Word::new([ - Felt::new(0xa5f38eebc66c8343), - Felt::new(0xa450e9296284f3d5), - Felt::new(0xe37183efd7fdcf95), - Felt::new(0xd6bb1cb064b35688), + Felt::new(0x9b2bc7e94b75374e), + Felt::new(0xc2879b31f4035c4f), + Felt::new(0xbd600bdc34732d3c), + Felt::new(0x6dfa6d51fef2721c), ]), Word::new([ - Felt::new(0x748b2d0dd944d29b), - Felt::new(0xd3b3b54a3da8a1d3), - Felt::new(0x21d7bd2270d61e92), - Felt::new(0x9b75fa746ae8b2a1), + Felt::new(0x902331d94df3505a), + Felt::new(0xfda6cde5628308f9), + Felt::new(0x34b439c067c7b4d3), + Felt::new(0x2b7878660dc8efd9), ]), Word::new([ - Felt::new(0xa511501f657507a0), - Felt::new(0x19165e4754f3ed9d), - Felt::new(0x2ace29354f4e1d8f), - Felt::new(0xadce35ebef9d24f3), + Felt::new(0xdd66f8d7698e4eb8), + Felt::new(0x1d03969c9d146092), + Felt::new(0xf8eac97f83c08043), + Felt::new(0x9b59e29ef763e459), ]), Word::new([ - Felt::new(0xd4ba2d693b3633f7), - Felt::new(0x52efedf7c2ac4aaa), - Felt::new(0xeb37284afc24c35b), - Felt::new(0x863f13cc0bf171fb), + Felt::new(0x6c309112a472dcc8), + Felt::new(0xe089a50410c3b074), + Felt::new(0xff23afa304ff16f), + Felt::new(0xbe1bd4aa7a393695), ]), Word::new([ - Felt::new(0x8adabc40751600f6), - Felt::new(0x5238237a22320513), - Felt::new(0x505d4119aff831b5), - Felt::new(0x737bd824227bdf79), + Felt::new(0x303f9384cec5e0c9), + Felt::new(0xfbee0ab1ff8dadcb), + Felt::new(0xcaf6a4571a59e33c), + Felt::new(0x85516327705ec9a2), ]), Word::new([ - Felt::new(0xc1de282526b1afb), - Felt::new(0x19f8e7f3bf0385ff), - Felt::new(0x55fb725d5460a86e), - Felt::new(0xcad39afdf9fa734c), + Felt::new(0xb3f872265da8c2c), + Felt::new(0xb47964162479bebc), + Felt::new(0x86e8e5b1b092fa71), + Felt::new(0x32266efeb618442c), ]), Word::new([ - Felt::new(0x637e4a633e7de21c), - Felt::new(0x29d2c89b8f2a2ec), - Felt::new(0x69a37600dd8006f9), - Felt::new(0xffe3ace3832836be), + Felt::new(0xa0ee5b88ffa1bf17), + Felt::new(0x2c7981644c2c8f06), + Felt::new(0xd9b896e51031b30d), + Felt::new(0x3c369de24985490d), ]), Word::new([ - Felt::new(0x7e7bb406e6e68eb6), - Felt::new(0x42fd1a00fe90f07a), - Felt::new(0xdc929ff5c1f95f36), - Felt::new(0x2e0fcdc7ec106f74), + Felt::new(0x151881390e803f09), + Felt::new(0x76629fefc37ec9a3), + Felt::new(0xdc30ef977a01cffc), + Felt::new(0x8a1b767747d677de), ]), Word::new([ - Felt::new(0xb8edfe12d74f2432), - Felt::new(0x90655225dc06dad8), - Felt::new(0x187b20a22e063446), - Felt::new(0x99e524f17a47f4ab), + Felt::new(0x98f81ad1dc5d3f53), + Felt::new(0x6bf3729004afe0d3), + Felt::new(0xbf194c54a20e0299), + Felt::new(0x1431836bedeb6093), ]), Word::new([ - Felt::new(0xe3214c002b4d91b9), - Felt::new(0x8ce0980a402beea4), - Felt::new(0xb80bd13058762136), - Felt::new(0xefd36e8aaa35a4eb), + Felt::new(0xd9a4f944c886c196), + Felt::new(0x43bc25f7df3201b6), + Felt::new(0xdb2d5dad33db4893), + Felt::new(0xe476f132869558fe), ]), Word::new([ - Felt::new(0xc8c24a71db116def), - Felt::new(0x9fda558b10f464f3), - Felt::new(0x834f584b76c4f511), - Felt::new(0x8879a92b279f5dff), + Felt::new(0xdd8d86a42c418610), + Felt::new(0xb9a2476435d3a058), + Felt::new(0x1cae777275604da6), + Felt::new(0x21e886725e0c18f9), ]), Word::new([ - Felt::new(0xa9cc91a4844140ba), - Felt::new(0xd99c820f6ba53279), - Felt::new(0x22ce2e5c1bb67c2), - Felt::new(0xe4ed89b91a3215bc), + Felt::new(0xa46f20d055f7216f), + Felt::new(0x4900ac3f4370a63), + Felt::new(0x99ca62f79ef5f8b9), + Felt::new(0xc2de59ce20691978), ]), Word::new([ - Felt::new(0xb1f07af2b0d44426), - Felt::new(0xc93ac44cec3001b6), - Felt::new(0xa0cc5631afe8a52), - Felt::new(0xefc2eb64204581d0), + Felt::new(0x7a48631a0bfff3eb), + Felt::new(0x3b94c6e453004591), + Felt::new(0x5fab1652ae822b3), + Felt::new(0x400b37cc56fa1d22), ]), Word::new([ - Felt::new(0x4d596e360735cd62), - Felt::new(0x883c4a5afb24c772), - Felt::new(0xe6c74e3673dd040d), - Felt::new(0x6de900ae0a64e62a), + Felt::new(0x40d0b3847cc462ec), + Felt::new(0x2c5e05c7e87962e3), + Felt::new(0x840520a1bc365f88), + Felt::new(0x2ab54e2273ad9f81), ]), Word::new([ - Felt::new(0x72e1554134177582), - Felt::new(0x74c2dde1e7d50f7), - Felt::new(0x237367b8ff8d1b97), - Felt::new(0x7cdaec5a8f3596a7), + Felt::new(0xcdf5f717928c8a89), + Felt::new(0xb612eb0a97227ef8), + Felt::new(0xc71f4387804459fd), + Felt::new(0x8bdc0619d4e1659e), ]), Word::new([ - Felt::new(0x8d5ac0e295e9ad40), - Felt::new(0xb12011f67d462a4e), - Felt::new(0x6214a41f78b42e2a), - Felt::new(0x89d751210bd9bedf), + Felt::new(0x52fde7c40e364968), + Felt::new(0xed8b8c233f32a499), + Felt::new(0xdb69dc89c4a1cf9e), + Felt::new(0x8a602b6c7125b3ce), ]), Word::new([ - Felt::new(0x5ee06879079ffec8), - Felt::new(0xaa7047aa22e4aefe), - Felt::new(0x18ae92e73f414cf8), - Felt::new(0xd8c2d9ed8a016651), + Felt::new(0xde95dfa36608bc73), + Felt::new(0x36893df69ef5c7b6), + Felt::new(0x296e79075c4a7d0f), + Felt::new(0xad9dc949d6b30d78), ]), Word::new([ - Felt::new(0x6bf7f0c5ef5fb62), - Felt::new(0x3ab988fe26df509e), - Felt::new(0xb8d98916a3d6f8c0), - Felt::new(0xb8a2ccf3d88aa22b), + Felt::new(0xfdd13861d5320017), + Felt::new(0x175043526474a728), + Felt::new(0x9ec8cdd1448b992d), + Felt::new(0x7cf5a38e86cb4f6c), ]), Word::new([ - Felt::new(0xeb14f90eb129495), - Felt::new(0xad5544f3d2fa34a5), - Felt::new(0xa5dcbdb33fd3ae5f), - Felt::new(0xc146d0e211609f2a), + Felt::new(0xfda651ec0660e8cd), + Felt::new(0xf04e4f664a56f41a), + Felt::new(0x292a9003e6767a0a), + Felt::new(0xe50ccfe917bd456), ]), Word::new([ - Felt::new(0x23eeabdad5222559), - Felt::new(0xf94212e980d51b58), - Felt::new(0xf8bd5fcfc020fd47), - Felt::new(0x3e8c699a4f3f9ed0), + Felt::new(0xc688eadb9f01e59c), + Felt::new(0x47b9cd7023903603), + Felt::new(0x318bfae1e06fe3da), + Felt::new(0xc83189d37992f87f), ]), Word::new([ - Felt::new(0x35510ef512eba172), - Felt::new(0x243e71b8bb0bfa9), - Felt::new(0xc178c0407c5b8c5a), - Felt::new(0x719b9dbe54690edf), + Felt::new(0xe4fb5c90773f9ea1), + Felt::new(0x13b1582bad1f031b), + Felt::new(0x9ee222546a5b1217), + Felt::new(0xcaf5cdadfaf7d9b4), ]), Word::new([ - Felt::new(0x7a729626722ec422), - Felt::new(0x5df920bef43b68be), - Felt::new(0xf44b13d234f9f0e3), - Felt::new(0x3ebe8b56ff76c2da), + Felt::new(0xaf90f25be574025e), + Felt::new(0xa6a79bae7183edb2), + Felt::new(0xfd3f30f11cb7d962), + Felt::new(0xa80fb4b3cb60debb), ]), Word::new([ - Felt::new(0x521a6c924b85acd6), - Felt::new(0xda67ddaeeb322495), - Felt::new(0xb1f5cf4394b4c0b9), - Felt::new(0xd063bcdfbd1cca6), + Felt::new(0x4da76d203efa5600), + Felt::new(0xa8690c93cf9d295a), + Felt::new(0x2f24955130442d09), + Felt::new(0x4ee238c83e47b9aa), ]), Word::new([ - Felt::new(0x82b7e92b9a2d6c2), - Felt::new(0x6e7dc03dbd0e3887), - Felt::new(0x26574b1181171077), - Felt::new(0x21d1c72cda3ae50d), + Felt::new(0x9d867192ce6c7de8), + Felt::new(0xa5e41d4bc73618e8), + Felt::new(0xb5c83dd5d51d84b0), + Felt::new(0xb18e472768a75d96), ]), Word::new([ - Felt::new(0x4f1dd03ac44d5b93), - Felt::new(0x3719c2c17c16573f), - Felt::new(0xa62b25429e586d67), - Felt::new(0x91ece8161ce4fd47), + Felt::new(0x59d6601a9b015b25), + Felt::new(0xc843c1aa885ae236), + Felt::new(0x9a158183e08b5dc6), + Felt::new(0x1145844b22b49390), ]), Word::new([ - Felt::new(0x74fed6086fa9e444), - Felt::new(0x9e1bb02f6d1ae35b), - Felt::new(0x9a1fac3e0d85b4ec), - Felt::new(0x851a0f32ff83ea46), + Felt::new(0x6524ab5a3897e1fb), + Felt::new(0x4734b8ef3529204f), + Felt::new(0x13d39127b429dfab), + Felt::new(0x20b6b93f96712a75), ]), Word::new([ - Felt::new(0xfdf751ce8311a960), - Felt::new(0x995db041e58c6b4b), - Felt::new(0xfd2329370427b43b), - Felt::new(0x5464a4535b97b588), + Felt::new(0x331d2c37945eb6a3), + Felt::new(0xe22e4d90443e4cd3), + Felt::new(0xa6f7c6e30b0aa924), + Felt::new(0x60291d1d37a29298), ]), Word::new([ - Felt::new(0x566bb18034c4f2df), - Felt::new(0xa29b8f0166ee91e6), - Felt::new(0xd99f7d8bac1a300e), - Felt::new(0x3623e182ecfaa2d1), + Felt::new(0x38a14a1754501dbd), + Felt::new(0x4167f7d92b1c2ce2), + Felt::new(0x13ab7681212a624), + Felt::new(0xbaaf8e1ac64cd97d), ]), Word::new([ - Felt::new(0x28bb3fa02deeb5f4), - Felt::new(0x9973c94fe575f58), - Felt::new(0x7fecf369b4c75201), - Felt::new(0x46ac9e6ef87b64db), + Felt::new(0x5fbbcd61ca726726), + Felt::new(0xd2582d23ba908b74), + Felt::new(0x330e3dbb3e9eb2d5), + Felt::new(0x951652929797868e), ]), Word::new([ - Felt::new(0x77156d3318b84c9c), - Felt::new(0xe90ac7f7735d014e), - Felt::new(0xd94597b0f9c42ca5), - Felt::new(0x98e1722780783100), + Felt::new(0xec01babca08bd895), + Felt::new(0xba9a7626ddd6668f), + Felt::new(0x9179b39124aedfc4), + Felt::new(0x5affa3c62c4b3a65), ]), Word::new([ - Felt::new(0x88a527fe1a96e0f4), - Felt::new(0x91cff1cafe6246bf), - Felt::new(0x5fa8b7963f0a33cf), - Felt::new(0x1a508cdc64416220), + Felt::new(0x4f8bea84ae68c86b), + Felt::new(0xcef547bf6c813156), + Felt::new(0x57463124b1dc489), + Felt::new(0xb4ea4cc2377e6fe1), ]), Word::new([ - Felt::new(0x87a89450bc5f86cb), - Felt::new(0xa3525d6cc28b29a8), - Felt::new(0xa987ca169f962184), - Felt::new(0x8d693a95bf3b308b), + Felt::new(0x1e5cc70d1dc1841e), + Felt::new(0x321ad7eab2f70418), + Felt::new(0x806dd438381a20e7), + Felt::new(0xa25b9f1a88890e06), ]), Word::new([ - Felt::new(0xb3ac2bf2d6bf6a1b), - Felt::new(0x400de6a583281412), - Felt::new(0x48c37a98a327cb2d), - Felt::new(0x8f07ad8c5f976fff), + Felt::new(0x17dd1a39290a6672), + Felt::new(0xa76b6687282df90a), + Felt::new(0x5549085194b9310), + Felt::new(0x47468128e17ff977), ]), Word::new([ - Felt::new(0x7c7e5b1bf28628d1), - Felt::new(0x5431db8f2d931abc), - Felt::new(0x2ff48e4d67c941b4), - Felt::new(0xb12eb971883414ae), + Felt::new(0x8951be2c71b6aa25), + Felt::new(0xc8849cb2f3d17d55), + Felt::new(0x45006c090e491d86), + Felt::new(0x6437fa6577394ca6), ]), Word::new([ - Felt::new(0x6600bdb29e65b07a), - Felt::new(0x717cfd190413ab00), - Felt::new(0xcf168b5a3866ff72), - Felt::new(0xbea885247f7da786), + Felt::new(0xa89d3f1ac7597df9), + Felt::new(0xc14f31ba91c1bd97), + Felt::new(0x487e19d8fdfb574), + Felt::new(0x6af87b44b56ed3f6), ]), Word::new([ - Felt::new(0x330ed69ada6e87ed), - Felt::new(0x185406699f6df77d), - Felt::new(0xd439f4a71006e469), - Felt::new(0x361e9bfaf5ed849c), + Felt::new(0xa5eaadab93f885fd), + Felt::new(0xc42867bf591206f4), + Felt::new(0xdfc5efa38a456769), + Felt::new(0x9f6ce48420cdf929), ]), Word::new([ - Felt::new(0x9c768b1bf13ac484), - Felt::new(0xd9d4c94e6f5aca01), - Felt::new(0x43d63d3adddd2408), - Felt::new(0x973d4a38470f26fb), + Felt::new(0x1f52d69390fd9980), + Felt::new(0xa06a4c951d9e332), + Felt::new(0xddefc965eb12ccc7), + Felt::new(0x544db122c8ec2200), ]), Word::new([ - Felt::new(0xbcf2e27086297a62), - Felt::new(0xa9a9e6af284d1e9), - Felt::new(0xb50cc0e2ba6d8ef3), - Felt::new(0xd0124f1e61a89e12), + Felt::new(0x9d331e003c39481f), + Felt::new(0xc29377c5b7262063), + Felt::new(0xd10c96634885ae64), + Felt::new(0x53b174d630f0a988), ]), Word::new([ - Felt::new(0xb4c0b52477226b1f), - Felt::new(0xb1755a2a840a831), - Felt::new(0x8de661c5f4bd9276), - Felt::new(0x8d124f0f3082cfbc), + Felt::new(0x7e36a51c053b79c3), + Felt::new(0x1539bac1275df6dc), + Felt::new(0x35d946afc238a3f2), + Felt::new(0x5a32f67c1500f6aa), ]), Word::new([ - Felt::new(0x6ed5ae308aa4bc7e), - Felt::new(0xe6a058fd79632207), - Felt::new(0xb951365f5848d42a), - Felt::new(0x5351e6e47fed2efd), + Felt::new(0xb80fd935de9c2911), + Felt::new(0x15997eaf79765d40), + Felt::new(0xa600dcb22c577529), + Felt::new(0xe15004068a2d6a93), ]), Word::new([ - Felt::new(0x8bf48a21b17ebfa2), - Felt::new(0x1f109ebbbfa3399f), - Felt::new(0x3c9b44b1248c31c0), - Felt::new(0x63adebe371b8bc48), + Felt::new(0x97d7528bd226911f), + Felt::new(0x636a7ee15ed43326), + Felt::new(0x25a943cbdbb77f80), + Felt::new(0x2eae2a071905d048), ]), Word::new([ - Felt::new(0x222099944ea7cc27), - Felt::new(0x316d0d6f15f41f46), - Felt::new(0xf17a1c6075a142f6), - Felt::new(0x35e50a02433991d7), + Felt::new(0x2cba8fe9fea65ee7), + Felt::new(0x6a41be71d2fc7028), + Felt::new(0x605212e2ee9bc5b), + Felt::new(0xc21c2908a5658935), ]), Word::new([ - Felt::new(0xfb2367e02a63a830), - Felt::new(0xec1c038af97c4bd1), - Felt::new(0xb3d489220fbb7df3), - Felt::new(0x792cb7969609334a), + Felt::new(0xaac0de8bd44b1d9f), + Felt::new(0x7225852b69d88957), + Felt::new(0x2f7c909294f15753), + Felt::new(0x7affa1185c0381b7), ]), Word::new([ - Felt::new(0x8d76893d4ca22979), - Felt::new(0x2c7ba9d515b4e3f4), - Felt::new(0x39edc914820c4ca0), - Felt::new(0xe639b77a01292a15), + Felt::new(0x34ca88a0e0d63460), + Felt::new(0x389fbe4ae11a59f6), + Felt::new(0x81e26cd8421a5db7), + Felt::new(0xdfac53bc294b2842), ]), Word::new([ - Felt::new(0x9b29640d071b0f11), - Felt::new(0x308cb2d119d63acc), - Felt::new(0x5d573a7d33b488cd), - Felt::new(0x7eeb10baca790915), + Felt::new(0x46568c6daa1fffec), + Felt::new(0x2e2cda75ec40e041), + Felt::new(0x54fc7cb3b80bee28), + Felt::new(0xf0195f14b6ce7a91), ]), Word::new([ - Felt::new(0xcaa0baf1eb15ce67), - Felt::new(0x89f30dae011914da), - Felt::new(0xbb9a31468b153cee), - Felt::new(0x1b92a7d0d1fce8bb), + Felt::new(0x13593d27ded29298), + Felt::new(0xefe26b0c14bf1017), + Felt::new(0xfe921a040d8b3627), + Felt::new(0x79e4d45d9160c42), ]), Word::new([ - Felt::new(0x7705c0b4816f8c8e), - Felt::new(0xa0ee27f0210207dc), - Felt::new(0x1ec9024f4368818a), - Felt::new(0xf3bf993f2fe0f538), + Felt::new(0x55235f121b2222a0), + Felt::new(0x5a3585db845aec02), + Felt::new(0x63530f0bfe01fd8e), + Felt::new(0xe8b1ca6f13d69fd6), ]), Word::new([ - Felt::new(0xa029e705850e3a3e), - Felt::new(0xe277c0af06a2b9ff), - Felt::new(0x4c40b30cc5b95beb), - Felt::new(0xc0b36a51afe62f5a), + Felt::new(0xe67cc603113d0cfa), + Felt::new(0xe6e6191b2f335634), + Felt::new(0x586d9798d40674ca), + Felt::new(0xcc05c4b81a3e9cf5), ]), Word::new([ - Felt::new(0xdff45e106cb643b), - Felt::new(0x99559a0e5499fe9b), - Felt::new(0x81c5e8b6020138fe), - Felt::new(0xbf6e1cb9cb625a6b), + Felt::new(0x287625a6e0ac9570), + Felt::new(0xb3ca03f21da48806), + Felt::new(0x4d757e14a282da56), + Felt::new(0x62f916fb91c5ad44), ]), Word::new([ - Felt::new(0x9388e9a0b434071f), - Felt::new(0x784722585f5a7aa2), - Felt::new(0x221afc22061b63b2), - Felt::new(0x341153b01693c583), + Felt::new(0x6a3381ff8ac5eda8), + Felt::new(0x18bc36351ee69a6a), + Felt::new(0x96735310f4c0cf6), + Felt::new(0x82d29f8e231dbec6), ]), Word::new([ - Felt::new(0x9177622e69ded3fe), - Felt::new(0x34324c4324e12cd5), - Felt::new(0x59a6b81b4e0c9321), - Felt::new(0xf267e523cd486bcd), + Felt::new(0x22019fe65e285413), + Felt::new(0xf1ea9640113d7e79), + Felt::new(0x6eb829f8d3dac377), + Felt::new(0xa5a5390e2c61e707), ]), Word::new([ - Felt::new(0xc5d14c4b40b190ed), - Felt::new(0xc7437bdd38e193c6), - Felt::new(0x55d189d25bc408e6), - Felt::new(0x68df3f58ce2cd9f9), + Felt::new(0x94f3666f3ec0cad6), + Felt::new(0x41af521db5132b0f), + Felt::new(0x12f521b602f26bb7), + Felt::new(0x6fb0099fc03771d7), ]), Word::new([ - Felt::new(0xa68327c1bef41681), - Felt::new(0x23dbfd6200a53231), - Felt::new(0x498254d87f792150), - Felt::new(0x2a44b2f4aa95eb36), + Felt::new(0xb94b561402c5d3f5), + Felt::new(0x74676ed17243d4ab), + Felt::new(0x501728289cec61a7), + Felt::new(0xa261eeff641cf1f), ]), Word::new([ - Felt::new(0x64e0617f2fa74e39), - Felt::new(0x96e6deb7cc18acf3), - Felt::new(0xcb387346b641d5a9), - Felt::new(0x8812aec31d8823a2), + Felt::new(0x81638d8c4c380987), + Felt::new(0x301ade5b72dae9cf), + Felt::new(0xf83af45539a37292), + Felt::new(0x9c70b7c60b3cd79a), ]), Word::new([ - Felt::new(0xe692e4887677c8fe), - Felt::new(0x14f2fc14386b22d6), - Felt::new(0x28100128fd3c512), - Felt::new(0x459ceee98dbd974e), + Felt::new(0x25e6179ad88ec2c8), + Felt::new(0xd9d92f7f8d44d084), + Felt::new(0x920cf9eac097e734), + Felt::new(0xbe57d8b3b732eee7), ]), Word::new([ - Felt::new(0xac762fde8050484f), - Felt::new(0x730af9b96aa010d2), - Felt::new(0xd78518c6bd98bb61), - Felt::new(0x3cf65f2ca5df413f), + Felt::new(0xea4f289f9693ec8d), + Felt::new(0x588619a7df3e0fc6), + Felt::new(0x6389b9f3593c4147), + Felt::new(0x80eddd98a455f424), ]), Word::new([ - Felt::new(0xb5b906b764d00027), - Felt::new(0x9fef3c78c401e2dc), - Felt::new(0xf97396aa3bc7c85a), - Felt::new(0x47e536bc737555b8), + Felt::new(0xfdb071de197aa1fa), + Felt::new(0x9ebf28b5367b0b30), + Felt::new(0x903691bea5e02644), + Felt::new(0x1885c5b911033b78), ]), Word::new([ - Felt::new(0xd5ffa2b14d89afff), - Felt::new(0x96709c25efd3e35), - Felt::new(0x9861444eea858fd), - Felt::new(0xe97e7ef564aab34), + Felt::new(0x14c62abb80b3a5a), + Felt::new(0xddb6686bbebe29c5), + Felt::new(0xb81da11fbadf796c), + Felt::new(0xf10541bf63efaedc), ]), Word::new([ - Felt::new(0xd7e3fbf61c6f8223), - Felt::new(0x161c8894f336f976), - Felt::new(0x4aa5779491256f1a), - Felt::new(0x13304f507cef63a3), + Felt::new(0x53769de620b4d7d5), + Felt::new(0xc8357de15f14c907), + Felt::new(0x3a3430a09e6ab803), + Felt::new(0x349eb5b389339747), ]), Word::new([ - Felt::new(0x73150e203e8b9f59), - Felt::new(0x7cc26c0dc04c2d24), - Felt::new(0xc4e2e3c2e2fe31b), - Felt::new(0x7144f633a0728c93), + Felt::new(0xd32edd92ee3597cd), + Felt::new(0xfed08f68579f5d19), + Felt::new(0x8080848b85559b70), + Felt::new(0x18ee5f8f74772555), ]), Word::new([ - Felt::new(0x4c34aa465787c650), - Felt::new(0x1f5b6b30b3886ad8), - Felt::new(0x85d5d22c426637b6), - Felt::new(0x714938f35901a5a6), + Felt::new(0x1eaecabc395eb3ca), + Felt::new(0xcee04708413469f3), + Felt::new(0x9e327fc63d557259), + Felt::new(0xb734b4fb745d8876), ]), Word::new([ - Felt::new(0xf2458896b53e2072), - Felt::new(0x1d276282b4ca608e), - Felt::new(0x5383200c860ff1bb), - Felt::new(0xe1ab1f4d0e13baeb), + Felt::new(0xd8334c7f3822e64d), + Felt::new(0xd6fac4cf1a8e9e9b), + Felt::new(0x889e88c42d27086d), + Felt::new(0x9fc028639782ac3e), ]), Word::new([ - Felt::new(0xf5d5c034a0297f9b), - Felt::new(0x8fe0d16710676fb6), - Felt::new(0x45efb3bf6031097a), - Felt::new(0x7a3ebc763170cbff), + Felt::new(0x2b31fcf3db65a0b8), + Felt::new(0x2335ec0c61381060), + Felt::new(0xf83740c4484f865d), + Felt::new(0xca78a031f895b478), ]), Word::new([ - Felt::new(0x700f4c46edd1c1ba), - Felt::new(0xb891fdd1dcc9b4ce), - Felt::new(0xa0eca77abaa82648), - Felt::new(0x1fa70514c05600d2), + Felt::new(0xb024ed5aaab4e0e2), + Felt::new(0xb679e50459d10961), + Felt::new(0x2aa647595b95809a), + Felt::new(0x6cbb814d03cb1050), ]), Word::new([ - Felt::new(0xce651dadc88f1d12), - Felt::new(0x70bb2fe45f3d6441), - Felt::new(0xc9084119c4b1c48c), - Felt::new(0x6eadd41d575eb231), + Felt::new(0x973d00d01b315e5c), + Felt::new(0xca40abc63e02d761), + Felt::new(0xffe9668b74f5d3e), + Felt::new(0x9e32938755c526d1), ]), Word::new([ - Felt::new(0x9ad37c76486ddbd4), - Felt::new(0xc4441d6d4537cea8), - Felt::new(0x35217566b537e99c), - Felt::new(0xb3286d64bc3a8c0e), + Felt::new(0x9d11baa0d7916712), + Felt::new(0xfb39766c72705f4e), + Felt::new(0xb4e2faa466611377), + Felt::new(0xe506307dd8d57b43), ]), Word::new([ - Felt::new(0xb52d785f4d08ef1a), - Felt::new(0xce18284b28477fb7), - Felt::new(0x5b1786b38931c1b4), - Felt::new(0x4eb6848ccfafea80), + Felt::new(0x95ffb9fc14efdecb), + Felt::new(0xbb2eadb4662b9da4), + Felt::new(0x5474a5291e5489f3), + Felt::new(0x95dc151ad0aaca6f), ]), Word::new([ - Felt::new(0x8d1f5927e174300d), - Felt::new(0x82ecc51e9f8fd848), - Felt::new(0x70d2d1205acc7410), - Felt::new(0x450f26de53764aea), + Felt::new(0xea122881fe161b45), + Felt::new(0x96489b253c89ae19), + Felt::new(0xc137c2a9fc3939f9), + Felt::new(0x28ef67075c763533), ]), Word::new([ - Felt::new(0x78d2b10fa83c20a3), - Felt::new(0xba4aa51f82f228df), - Felt::new(0x931595bcd91f012e), - Felt::new(0x806ce2ed4ff375d7), + Felt::new(0xdf9cc227338945fe), + Felt::new(0x4e009f2fa0d11d7a), + Felt::new(0x93d28360b41fea9a), + Felt::new(0x2e23dd18fb5e3430), ]), Word::new([ - Felt::new(0x7f9d9c145a6d8f34), - Felt::new(0x1589efb30430f049), - Felt::new(0xdaae113fe8ea8bf), - Felt::new(0xc22d9ed231e180b8), + Felt::new(0xbbacee1eac480274), + Felt::new(0x5df2420822bbdb29), + Felt::new(0x273876d51ab28a7c), + Felt::new(0x5b2cce865277eb8f), ]), Word::new([ - Felt::new(0x6c9cce48f777b8db), - Felt::new(0xc963033cdfcc3eac), - Felt::new(0xfad09eedfff0482a), - Felt::new(0x28eb5607a25a5cc9), + Felt::new(0x8eacb9ec570d0bfd), + Felt::new(0xd93cb13f32c59541), + Felt::new(0xa03a7780adeab0cb), + Felt::new(0x96bf26bf16a0c20a), ]), Word::new([ - Felt::new(0xa00aef448a097720), - Felt::new(0x31db189b5c633c34), - Felt::new(0xcee74e8d4a496da), - Felt::new(0x1a31a14cce810863), + Felt::new(0xd02199f182c7c44c), + Felt::new(0x2bcb02e4d9972e10), + Felt::new(0x1947aa10d093b782), + Felt::new(0xf8ce237f239a422e), ]), Word::new([ - Felt::new(0xe3d71b05ac867f3a), - Felt::new(0x5c7ab1e6c3f3c749), - Felt::new(0x980f13958d1203d), - Felt::new(0xab6dea61dab9b3cb), + Felt::new(0xc59e3b7237e49c5d), + Felt::new(0x99ef9f91bd859046), + Felt::new(0x1a045cfcbfc42d3c), + Felt::new(0x52f64e1f7e149d50), ]), Word::new([ - Felt::new(0x65cd98966451cc0f), - Felt::new(0xbc86e07d4e4685b1), - Felt::new(0x552d5160d91266ac), - Felt::new(0x838c05d03ef922ad), + Felt::new(0xd80c9ddbb8d33e12), + Felt::new(0xe2eba2ca287db211), + Felt::new(0xbf3b52bf58c3b6fa), + Felt::new(0xe45d1fcd58fae7c1), ]), Word::new([ - Felt::new(0x7ee3580bee2f4108), - Felt::new(0xa15be9b72fe7d7f8), - Felt::new(0x3a6ab01d40b1f9be), - Felt::new(0xf86f8b22a4db595a), + Felt::new(0x58b23f68e7c1181), + Felt::new(0xc1957d3818a0f35f), + Felt::new(0xc369c3257cdff85c), + Felt::new(0x4ecfb5f107df28ce), ]), Word::new([ - Felt::new(0xc9ca753fec71b643), - Felt::new(0xccdc18345ad0bb92), - Felt::new(0xf838d0cd1e9a22b2), - Felt::new(0xceafe749ebe09ca5), + Felt::new(0x4b8c985ba74188b6), + Felt::new(0x66ea95855e191b57), + Felt::new(0x151c0662fe97ef91), + Felt::new(0x517ffd6e5dd87316), ]), Word::new([ - Felt::new(0x68aed7a433ba6f89), - Felt::new(0x872f414e44578643), - Felt::new(0x21f3e5c852e0edee), - Felt::new(0x617580f1bd0a9bbd), + Felt::new(0xaa310cfa768bc071), + Felt::new(0x35c683204f1f7a5b), + Felt::new(0xf1a3e64c7fd12971), + Felt::new(0xc071d798762a5f59), ]), Word::new([ - Felt::new(0x6e9c957b61e49f55), - Felt::new(0xd08f4ef34c34daca), - Felt::new(0xd9498340c980973a), - Felt::new(0x592dc9098a00bcf5), + Felt::new(0xe163a0558e4ada6a), + Felt::new(0x16864ee667320dd0), + Felt::new(0x6a7ee65793d04854), + Felt::new(0x59b459e6c0cfd7e), ]), Word::new([ - Felt::new(0xdb3a7671f2f213ff), - Felt::new(0x98d8c80be9778636), - Felt::new(0xa83e7eda3baae466), - Felt::new(0x414627e94cef5a42), + Felt::new(0x22e4a0a001eb1015), + Felt::new(0xba711695a8865274), + Felt::new(0x586544b816143930), + Felt::new(0xd6e2bf9b531be327), ]), Word::new([ - Felt::new(0x9f8c71dd51c1b90b), - Felt::new(0x72849d1a55d42ee0), - Felt::new(0xb5a9f39b4e358b5a), - Felt::new(0x484007711542ed58), + Felt::new(0x8c72517df821c34b), + Felt::new(0x1a9838a014fd288e), + Felt::new(0xe5411d1d40288388), + Felt::new(0x7d79eb302daa9e3b), ]), Word::new([ - Felt::new(0xf12e3506d6b6c442), - Felt::new(0xc4d45c104667788f), - Felt::new(0xf47c201e0a040319), - Felt::new(0xe62268fa6f2d91e0), + Felt::new(0xe43f22af98d4319c), + Felt::new(0x25e3871ca9f92728), + Felt::new(0x762bf3cdc93e6a14), + Felt::new(0x16f6e357adafee63), ]), Word::new([ - Felt::new(0xfcec56c151f429d0), - Felt::new(0x240c895a3839cc45), - Felt::new(0x4a2f94d5ab28c7e4), - Felt::new(0x46898fef30fcf6b0), + Felt::new(0xa99f1387a11c6c9d), + Felt::new(0x68a1c792ee1cda6), + Felt::new(0xb6af58d26d306e00), + Felt::new(0xfca5d691fd46cb33), ]), Word::new([ - Felt::new(0x24a37f64007709c1), - Felt::new(0x30e34cd6365f2af5), - Felt::new(0xbc6ee1fce63257df), - Felt::new(0x47878c244a01a6d4), + Felt::new(0x46b19d9575d5a999), + Felt::new(0x4c85bbe9c316d745), + Felt::new(0xe75c3c0215fdc2a3), + Felt::new(0x627bcc2c05380f82), ]), Word::new([ - Felt::new(0xf899cf62d3e064da), - Felt::new(0xdac739aafa7c1bf8), - Felt::new(0x2f76cb83eb1ac830), - Felt::new(0x19eaebd00c4585ec), + Felt::new(0xe0d9f7bd745a6139), + Felt::new(0xecd57179df992475), + Felt::new(0x14adc18ec0ab9a32), + Felt::new(0x87e2e8c38e84d27d), ]), Word::new([ - Felt::new(0xb5889a2b3ade4339), - Felt::new(0xede5c4fb389619b4), - Felt::new(0x82699c26c8224722), - Felt::new(0xaccc76e026c53c65), + Felt::new(0xd8ad07ca4b066157), + Felt::new(0x40cbe185468109c0), + Felt::new(0x8ff6e16bb6f0acf3), + Felt::new(0x3a8538ff68aeb4a0), ]), Word::new([ - Felt::new(0x743d9808cb20cc9c), - Felt::new(0x118be69d793662c7), - Felt::new(0xf4e1de748f1cd76d), - Felt::new(0xdff5ee2bd200f9c9), + Felt::new(0x7f0c04ca40410bde), + Felt::new(0xc93b0fc7fe5a4be4), + Felt::new(0x541bd0fff26378a2), + Felt::new(0xf4583e69e45aa98b), ]), Word::new([ - Felt::new(0xfdea51ddaf36659a), - Felt::new(0xdef47a885c19e76c), - Felt::new(0x67fa40c1770baeee), - Felt::new(0x21e5a0cc0fba1cbe), + Felt::new(0x16c3ad2b8fcbf6a6), + Felt::new(0x20f02cdbe3a422ca), + Felt::new(0xa0c82db5bb435141), + Felt::new(0xdf60ac327044e6dd), ]), Word::new([ - Felt::new(0xeb80d35cc0b80b64), - Felt::new(0x1e4ba2d214e73fc0), - Felt::new(0xe06df54f53df077d), - Felt::new(0x4fb92dcdde85bb1c), + Felt::new(0x23f34324486cf69a), + Felt::new(0x56d25f6ea8774a2e), + Felt::new(0x778eb42f8e4203ee), + Felt::new(0xd9bfd51145f77a34), ]), Word::new([ - Felt::new(0xa0124f39e4fbbd8a), - Felt::new(0xa435a6d56e35ebf0), - Felt::new(0xa2da045c9e074ea5), - Felt::new(0x84b29221d6db5162), + Felt::new(0x964229279ccb8ee9), + Felt::new(0x21a4dce43c249fc3), + Felt::new(0xd74eb222e6e70016), + Felt::new(0xf1939377a0cd2d8), ]), Word::new([ - Felt::new(0x863188446bc5e810), - Felt::new(0xe657920004e47792), - Felt::new(0x6763c88831d8bce5), - Felt::new(0x4226d55266af4de1), + Felt::new(0x6accdf4f970c96a2), + Felt::new(0x843589dfd6e770c0), + Felt::new(0xdcf316fec1f41538), + Felt::new(0xc679df0c52121fc9), ]), Word::new([ - Felt::new(0xb60470c3c5b77a8b), - Felt::new(0xdb7427ff68da5d48), - Felt::new(0x313ce707732b0c65), - Felt::new(0xa48b9a001ede6e4f), + Felt::new(0xb84e5d32796aae8c), + Felt::new(0xe8059efb9fbdd0bd), + Felt::new(0xd2727b248292d2fa), + Felt::new(0xfe80340c738661b2), ]), Word::new([ - Felt::new(0xbe58cae47a3bda6c), - Felt::new(0xedf2981cab8486e8), - Felt::new(0xe44eedfd2bd4db7c), - Felt::new(0xdf571d975e7451dc), + Felt::new(0x767c7d96e0863dd9), + Felt::new(0xec2ee4294c5b4456), + Felt::new(0x4e1c55d9f00c292), + Felt::new(0x93d56e40ac873ea4), ]), Word::new([ - Felt::new(0x5d275ba45b8fc0ae), - Felt::new(0x597293899adcd624), - Felt::new(0x3d9d9d9f905c69a9), - Felt::new(0x3a2c0b8006b88d28), + Felt::new(0x9a9ef79a545675db), + Felt::new(0xa72b254d8276b0ed), + Felt::new(0x931881e4971e5385), + Felt::new(0x81c8e39b3f7dd52f), ]), Word::new([ - Felt::new(0x566ea960c032817e), - Felt::new(0x3fc2f2397688666f), - Felt::new(0xae91b4ebf6d38e4e), - Felt::new(0x55678e62f7c0bad9), + Felt::new(0x935669bd1213fd04), + Felt::new(0x72c57f762c09437), + Felt::new(0x18217f624bc70556), + Felt::new(0xd64b394846c549af), ]), Word::new([ - Felt::new(0x68a5ab07664b7030), - Felt::new(0x734268d2eddd56dc), - Felt::new(0x741e2227a74ba6a9), - Felt::new(0x6db8b16f53a72693), + Felt::new(0x9bbb4616365b2ea2), + Felt::new(0x19c8c5d9137e56ce), + Felt::new(0x9d1111260fecec13), + Felt::new(0x41a2b2e0f870b070), ]), Word::new([ - Felt::new(0x1a741f201036a8ef), - Felt::new(0x7ec9f53168688afe), - Felt::new(0xf7f10daf37abc4c3), - Felt::new(0xe22740bb94b207f5), + Felt::new(0xc389cf2838e661df), + Felt::new(0x2b2390795679fc2d), + Felt::new(0x1a06f8f594a5779f), + Felt::new(0x6af322014f565c2f), ]), Word::new([ - Felt::new(0xcf1682e05e224ca3), - Felt::new(0xb19bc6e35bc5563c), - Felt::new(0x36b025ea30c77fd1), - Felt::new(0x9cba72b1fe696a74), + Felt::new(0xa5c607667558109a), + Felt::new(0x7b9587a0fa3b82fe), + Felt::new(0x46514e189536926b), + Felt::new(0xf415f181043e7187), ]), Word::new([ - Felt::new(0x6727617dfcad0e43), - Felt::new(0x99f101fde0e17103), - Felt::new(0x5c5795c42f9154cb), - Felt::new(0x442937b3e266f4f), + Felt::new(0xd116f0cec205c7f8), + Felt::new(0x32b47d268aee9985), + Felt::new(0x33c45a0dce9d411d), + Felt::new(0x1b8666d00071eb40), ]), Word::new([ - Felt::new(0xe6d73c0ee48c7c65), - Felt::new(0x6899de7915dd4ad3), - Felt::new(0x650106188d5c1fa2), - Felt::new(0xfaf90f9fb37c2d6e), + Felt::new(0x763c2acc6485a335), + Felt::new(0x8898a0ecea149931), + Felt::new(0xf950dee87da2cfa0), + Felt::new(0xb67c8db4e1f76963), ]), Word::new([ - Felt::new(0x4248bb3fcd7ad129), - Felt::new(0xeb70d914516b8428), - Felt::new(0x28feb90174c69f3f), - Felt::new(0x1ec9ac80fc9fbb60), + Felt::new(0xeab92f17cc5669e3), + Felt::new(0x1d7c7c77ec161b77), + Felt::new(0x51339cda396b9126), + Felt::new(0x136d9afecd1ce45d), ]), Word::new([ - Felt::new(0x106686f6c74957d5), - Felt::new(0x32105c15b1aa5c4), - Felt::new(0x6dedbe92c47a4b32), - Felt::new(0xfc9d1cf1465600e0), + Felt::new(0x638db6faffb9b065), + Felt::new(0x46b7c590267345a2), + Felt::new(0x3a83af8bdb9fa24a), + Felt::new(0x7c4b3be077e93d15), ]), Word::new([ - Felt::new(0x39cb2c4dbe76972a), - Felt::new(0x4ebb766f9906e2c5), - Felt::new(0x755f76642ccbc6f), - Felt::new(0x5b00eadd79ed3e47), + Felt::new(0x713ca5afe11f3e5b), + Felt::new(0xaafc34e968ae8792), + Felt::new(0x290b4cdef7a48a56), + Felt::new(0xabff471fe841e07f), ]), Word::new([ - Felt::new(0x77d6e2f32439dbf0), - Felt::new(0xa1f8ce9eb02419a5), - Felt::new(0xd3ad9fb0cea61624), - Felt::new(0x66ab5c684fbb8597), + Felt::new(0x46bbadc4fd475e8b), + Felt::new(0xf26792d3ac61c3ae), + Felt::new(0x3e57dafa1a6af337), + Felt::new(0xc6d722ae0d17a589), + ]), + Word::new([ + Felt::new(0x0), + Felt::new(0x0), + Felt::new(0x0), + Felt::new(0x0), ]), - Word::new([Felt::new(0x0), Felt::new(0x0), Felt::new(0x0), Felt::new(0x0)]), ]; #[test] diff --git a/miden-crypto/src/merkle/smt/forest/tests.rs b/miden-crypto/src/merkle/smt/forest/tests.rs index 005ae9217..bfb2547ee 100644 --- a/miden-crypto/src/merkle/smt/forest/tests.rs +++ b/miden-crypto/src/merkle/smt/forest/tests.rs @@ -35,10 +35,10 @@ fn test_insert_root_empty() -> Result<(), MerkleError> { assert_eq!( forest.insert(empty_tree_root, key, value)?, Word::new([ - Felt::new(8004305032057544734), - Felt::new(8775568154390432518), - Felt::new(15738879297545046620), - Felt::new(8472837894474537954), + Felt::new(17566703186976592377), + Felt::new(10698964398442624200), + Felt::new(17156877103802520546), + Felt::new(4782456441201120034), ]), ); Ok(()) @@ -55,10 +55,10 @@ fn test_insert_multiple_values() -> Result<(), MerkleError> { assert_eq!( new_root, Word::new([ - Felt::new(8004305032057544734), - Felt::new(8775568154390432518), - Felt::new(15738879297545046620), - Felt::new(8472837894474537954), + Felt::new(17566703186976592377), + Felt::new(10698964398442624200), + Felt::new(17156877103802520546), + Felt::new(4782456441201120034), ]), ); @@ -66,10 +66,10 @@ fn test_insert_multiple_values() -> Result<(), MerkleError> { assert_eq!( new_root, Word::new([ - Felt::new(8004305032057544734), - Felt::new(8775568154390432518), - Felt::new(15738879297545046620), - Felt::new(8472837894474537954), + Felt::new(17566703186976592377), + Felt::new(10698964398442624200), + Felt::new(17156877103802520546), + Felt::new(4782456441201120034), ]), ); @@ -82,10 +82,10 @@ fn test_insert_multiple_values() -> Result<(), MerkleError> { assert_eq!( new_root, Word::new([ - Felt::new(11871408080611032882), - Felt::new(15075599519659351786), - Felt::new(2187602169790640097), - Felt::new(3917634304176870231), + Felt::new(838199083189246611), + Felt::new(16778657488739036237), + Felt::new(13828051603373627066), + Felt::new(2453801083600635673), ]) ); @@ -111,10 +111,10 @@ fn test_batch_insert() -> Result<(), MerkleError> { assert_eq!( new_root, Word::new([ - Felt::new(4696704423458811136), - Felt::new(6409025055729277967), - Felt::new(16123112516746934247), - Felt::new(14531375043307302369), + Felt::new(117604577632613381), + Felt::new(15058212884545544983), + Felt::new(5650876462024416752), + Felt::new(6460194250276012043), ]) ); From 2aa54d92378e5f041559bb75c498c0bd2a15b8c2 Mon Sep 17 00:00:00 2001 From: al <82364884+Al-Kindi-0@users.noreply.github.com> Date: Fri, 9 Jan 2026 14:17:02 +0400 Subject: [PATCH 08/13] fix lint --- miden-crypto/src/merkle/empty_roots.rs | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/miden-crypto/src/merkle/empty_roots.rs b/miden-crypto/src/merkle/empty_roots.rs index a75acfafe..b993b4119 100644 --- a/miden-crypto/src/merkle/empty_roots.rs +++ b/miden-crypto/src/merkle/empty_roots.rs @@ -1569,12 +1569,7 @@ const EMPTY_SUBTREES: [Word; 256] = [ Felt::new(0x3e57dafa1a6af337), Felt::new(0xc6d722ae0d17a589), ]), - Word::new([ - Felt::new(0x0), - Felt::new(0x0), - Felt::new(0x0), - Felt::new(0x0), - ]), + Word::new([Felt::new(0x0), Felt::new(0x0), Felt::new(0x0), Felt::new(0x0)]), ]; #[test] From 6d17c2bbc5d1a7d3591779f8265af347c8a902c1 Mon Sep 17 00:00:00 2001 From: Bobbin Threadbare Date: Fri, 9 Jan 2026 16:21:37 -0800 Subject: [PATCH 09/13] chore: expose INPUT1_RANGE and INPUT2_RANGE publicly --- CHANGELOG.md | 4 ++-- .../src/hash/algebraic_sponge/poseidon2/mod.rs | 10 ++++++++-- .../src/hash/algebraic_sponge/rescue/mod.rs | 3 ++- .../src/hash/algebraic_sponge/rescue/rpo/mod.rs | 14 ++++++++++---- .../src/hash/algebraic_sponge/rescue/rpx/mod.rs | 15 ++++++++++----- 5 files changed, 32 insertions(+), 14 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 45c935406..2945f3fe7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,10 +1,10 @@ ## 0.21.0 (TBD) -- [BREAKING] Removed `p3-compat` and `winter-compat` features ([#745](https://github.com/0xMiden/crypto/pull/745)). - Use more idiomatic Plonky3 APIs ([#743](https://github.com/0xMiden/crypto/pull/743)). +- [BREAKING] Removed `p3-compat` and `winter-compat` features ([#745](https://github.com/0xMiden/crypto/pull/745)). - Make concurrent feature interact with plonky3's parallel features, replace homegrown iterator macros with p3-maybe-rayon ([#749](https://github.com/0xMiden/crypto/pull/749)). - Reduce dependency on std in tests, add test helpers to access Rngs in no-std contexts ([#752](https://github.com/0xMiden/crypto/pull/752)). -- [BREAKING] Changed sponge state layout from `[CAPACITY, RATE1, RATE0]` (BE) to `[RATE0, RATE1, CAPACITY]` (LE) ([#755](https://github.com/0xMiden/crypto/pull/755)) +- [BREAKING] Changed sponge state layout from `[CAPACITY, RATE1, RATE0]` (BE) to `[RATE0, RATE1, CAPACITY]` (LE) ([#755](https://github.com/0xMiden/crypto/pull/755)). # 0.20.1 (2025-12-29) diff --git a/miden-crypto/src/hash/algebraic_sponge/poseidon2/mod.rs b/miden-crypto/src/hash/algebraic_sponge/poseidon2/mod.rs index 0a576dd8e..04557db9a 100644 --- a/miden-crypto/src/hash/algebraic_sponge/poseidon2/mod.rs +++ b/miden-crypto/src/hash/algebraic_sponge/poseidon2/mod.rs @@ -1,7 +1,7 @@ use super::{ - AlgebraicSponge, CAPACITY_RANGE, DIGEST_RANGE, Felt, RATE_RANGE, Range, STATE_WIDTH, Word, ZERO, + AlgebraicSponge, CAPACITY_RANGE, DIGEST_RANGE, Felt, INPUT1_RANGE, INPUT2_RANGE, + PrimeCharacteristicRing, RATE_RANGE, Range, STATE_WIDTH, Word, ZERO, }; -use crate::field::PrimeCharacteristicRing; mod constants; use constants::{ @@ -109,6 +109,12 @@ impl Poseidon2 { /// The rate portion of the state is located in elements 0 through 7 (inclusive). pub const RATE_RANGE: Range = RATE_RANGE; + /// The first 4-element word of the rate portion. + pub const INPUT1_RANGE: Range = INPUT1_RANGE; + + /// The second 4-element word of the rate portion. + pub const INPUT2_RANGE: Range = INPUT2_RANGE; + /// The capacity portion of the state is located in elements 8, 9, 10, and 11. pub const CAPACITY_RANGE: Range = CAPACITY_RANGE; diff --git a/miden-crypto/src/hash/algebraic_sponge/rescue/mod.rs b/miden-crypto/src/hash/algebraic_sponge/rescue/mod.rs index ba309a4e3..ad702f191 100644 --- a/miden-crypto/src/hash/algebraic_sponge/rescue/mod.rs +++ b/miden-crypto/src/hash/algebraic_sponge/rescue/mod.rs @@ -1,7 +1,8 @@ use p3_field::{Field, PrimeCharacteristicRing}; use super::{ - AlgebraicSponge, CAPACITY_RANGE, DIGEST_RANGE, Felt, RATE_RANGE, Range, STATE_WIDTH, Word, ZERO, + AlgebraicSponge, CAPACITY_RANGE, DIGEST_RANGE, Felt, INPUT1_RANGE, INPUT2_RANGE, RATE_RANGE, + Range, STATE_WIDTH, Word, ZERO, }; mod arch; diff --git a/miden-crypto/src/hash/algebraic_sponge/rescue/rpo/mod.rs b/miden-crypto/src/hash/algebraic_sponge/rescue/rpo/mod.rs index ce68562ce..509b47ec8 100644 --- a/miden-crypto/src/hash/algebraic_sponge/rescue/rpo/mod.rs +++ b/miden-crypto/src/hash/algebraic_sponge/rescue/rpo/mod.rs @@ -1,9 +1,9 @@ use super::{ - ARK1, ARK2, AlgebraicSponge, CAPACITY_RANGE, DIGEST_RANGE, Felt, NUM_ROUNDS, RATE_RANGE, Range, - STATE_WIDTH, Word, add_constants, add_constants_and_apply_inv_sbox, - add_constants_and_apply_sbox, apply_inv_sbox, apply_mds, apply_sbox, + ARK1, ARK2, AlgebraicSponge, CAPACITY_RANGE, DIGEST_RANGE, Felt, INPUT1_RANGE, INPUT2_RANGE, + MDS, NUM_ROUNDS, RATE_RANGE, Range, STATE_WIDTH, Word, add_constants, + add_constants_and_apply_inv_sbox, add_constants_and_apply_sbox, apply_inv_sbox, apply_mds, + apply_sbox, }; -use crate::hash::algebraic_sponge::rescue::mds::MDS; #[cfg(test)] mod tests; @@ -230,6 +230,12 @@ impl RpoPermutation256 { /// The rate portion of the state is located in elements 0 through 7 (inclusive). pub const RATE_RANGE: Range = Rpo256::RATE_RANGE; + /// The first 4-element word of the rate portion. + pub const INPUT1_RANGE: Range = INPUT1_RANGE; + + /// The second 4-element word of the rate portion. + pub const INPUT2_RANGE: Range = INPUT2_RANGE; + /// The capacity portion of the state is located in elements 8, 9, 10, and 11. pub const CAPACITY_RANGE: Range = Rpo256::CAPACITY_RANGE; diff --git a/miden-crypto/src/hash/algebraic_sponge/rescue/rpx/mod.rs b/miden-crypto/src/hash/algebraic_sponge/rescue/rpx/mod.rs index 884c0c37e..fb5ba44d7 100644 --- a/miden-crypto/src/hash/algebraic_sponge/rescue/rpx/mod.rs +++ b/miden-crypto/src/hash/algebraic_sponge/rescue/rpx/mod.rs @@ -1,10 +1,9 @@ use super::{ - ARK1, ARK2, CAPACITY_RANGE, DIGEST_RANGE, Felt, MDS, NUM_ROUNDS, RATE_RANGE, Range, - STATE_WIDTH, Word, add_constants, add_constants_and_apply_ext_round, - add_constants_and_apply_inv_sbox, add_constants_and_apply_sbox, apply_inv_sbox, apply_mds, - apply_sbox, + ARK1, ARK2, AlgebraicSponge, CAPACITY_RANGE, DIGEST_RANGE, Felt, INPUT1_RANGE, INPUT2_RANGE, + MDS, NUM_ROUNDS, RATE_RANGE, Range, STATE_WIDTH, Word, add_constants, + add_constants_and_apply_ext_round, add_constants_and_apply_inv_sbox, + add_constants_and_apply_sbox, apply_inv_sbox, apply_mds, apply_sbox, }; -use crate::hash::algebraic_sponge::AlgebraicSponge; #[cfg(test)] mod tests; @@ -100,6 +99,12 @@ impl Rpx256 { /// The rate portion of the state is located in elements 0 through 7 (inclusive). pub const RATE_RANGE: Range = RATE_RANGE; + /// The first 4-element word of the rate portion. + pub const INPUT1_RANGE: Range = INPUT1_RANGE; + + /// The second 4-element word of the rate portion. + pub const INPUT2_RANGE: Range = INPUT2_RANGE; + /// The capacity portion of the state is located in elements 8, 9, 10, and 11. pub const CAPACITY_RANGE: Range = CAPACITY_RANGE; From 84af1c75f0db9d28924d467be604e388016899b3 Mon Sep 17 00:00:00 2001 From: al <82364884+Al-Kindi-0@users.noreply.github.com> Date: Sat, 10 Jan 2026 10:40:29 +0400 Subject: [PATCH 10/13] update comment deterministic signature Falcon --- miden-crypto/src/dsa/falcon512_rpo/tests/data.rs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/miden-crypto/src/dsa/falcon512_rpo/tests/data.rs b/miden-crypto/src/dsa/falcon512_rpo/tests/data.rs index 54561914b..6e5c14d50 100644 --- a/miden-crypto/src/dsa/falcon512_rpo/tests/data.rs +++ b/miden-crypto/src/dsa/falcon512_rpo/tests/data.rs @@ -1755,8 +1755,7 @@ pub(crate) static SK_POLYS: [[[i16; 512]; 4]; NUM_TEST_VECTORS] = [ /// Serialized deterministic RPO-Falcon-512 signature intended for use as a test vector /// for the determinism in the signing procedure across platforms. /// -/// This was generated on an `Intel Core i5-8279U` running on Linux kernel `5.4.0-144-generic` and -/// built with Rust `1.88.0`. +/// This was generated on an `M4` running on `Sequoia 15.7` and built with Rust `1.90.0`. pub(crate) const DETERMINISTIC_SIGNATURE: [u8; SIG_SERIALIZED_LEN] = [ 185, 1, 49, 100, 34, 177, 39, 53, 190, 227, 187, 229, 174, 59, 206, 209, 55, 168, 94, 121, 223, 102, 175, 213, 188, 26, 185, 233, 198, 252, 249, 138, 82, 22, 171, 253, 118, 25, 164, 99, 187, From 97cdd07edbc18cb3e4c3e04b7655455318dfbc6b Mon Sep 17 00:00:00 2001 From: Bobbin Threadbare Date: Sat, 10 Jan 2026 00:09:32 -0800 Subject: [PATCH 11/13] chore: move input range constants into the correct struct --- .../src/hash/algebraic_sponge/rescue/rpo/mod.rs | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/miden-crypto/src/hash/algebraic_sponge/rescue/rpo/mod.rs b/miden-crypto/src/hash/algebraic_sponge/rescue/rpo/mod.rs index 509b47ec8..068b9c041 100644 --- a/miden-crypto/src/hash/algebraic_sponge/rescue/rpo/mod.rs +++ b/miden-crypto/src/hash/algebraic_sponge/rescue/rpo/mod.rs @@ -98,6 +98,12 @@ impl Rpo256 { /// The rate portion of the state is located in elements 0 through 7 (inclusive). pub const RATE_RANGE: Range = RATE_RANGE; + /// The first 4-element word of the rate portion. + pub const INPUT1_RANGE: Range = INPUT1_RANGE; + + /// The second 4-element word of the rate portion. + pub const INPUT2_RANGE: Range = INPUT2_RANGE; + /// The capacity portion of the state is located in elements 8, 9, 10, and 11. pub const CAPACITY_RANGE: Range = CAPACITY_RANGE; @@ -230,12 +236,6 @@ impl RpoPermutation256 { /// The rate portion of the state is located in elements 0 through 7 (inclusive). pub const RATE_RANGE: Range = Rpo256::RATE_RANGE; - /// The first 4-element word of the rate portion. - pub const INPUT1_RANGE: Range = INPUT1_RANGE; - - /// The second 4-element word of the rate portion. - pub const INPUT2_RANGE: Range = INPUT2_RANGE; - /// The capacity portion of the state is located in elements 8, 9, 10, and 11. pub const CAPACITY_RANGE: Range = Rpo256::CAPACITY_RANGE; From 1544ed13a6daedd93c3c19aae642b75587cb1f12 Mon Sep 17 00:00:00 2001 From: al <82364884+Al-Kindi-0@users.noreply.github.com> Date: Wed, 14 Jan 2026 13:00:15 +0400 Subject: [PATCH 12/13] update comments digest position --- miden-crypto/src/hash/algebraic_sponge/poseidon2/mod.rs | 2 +- miden-crypto/src/hash/algebraic_sponge/rescue/rpo/mod.rs | 2 +- miden-crypto/src/hash/algebraic_sponge/rescue/rpx/mod.rs | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/miden-crypto/src/hash/algebraic_sponge/poseidon2/mod.rs b/miden-crypto/src/hash/algebraic_sponge/poseidon2/mod.rs index 04557db9a..9dc25253a 100644 --- a/miden-crypto/src/hash/algebraic_sponge/poseidon2/mod.rs +++ b/miden-crypto/src/hash/algebraic_sponge/poseidon2/mod.rs @@ -337,7 +337,7 @@ use p3_symmetric::{ /// The permutation operates on a state of 12 field elements (STATE_WIDTH = 12), with: /// - Rate: 8 elements (positions 0-7) /// - Capacity: 4 elements (positions 8-11) -/// - Digest output: 4 elements (positions 4-7) +/// - Digest output: 4 elements (positions 0-3) #[derive(Debug, Copy, Clone, Eq, PartialEq)] pub struct Poseidon2Permutation256; diff --git a/miden-crypto/src/hash/algebraic_sponge/rescue/rpo/mod.rs b/miden-crypto/src/hash/algebraic_sponge/rescue/rpo/mod.rs index 068b9c041..f0b9c8e4c 100644 --- a/miden-crypto/src/hash/algebraic_sponge/rescue/rpo/mod.rs +++ b/miden-crypto/src/hash/algebraic_sponge/rescue/rpo/mod.rs @@ -218,7 +218,7 @@ use p3_symmetric::{ /// The permutation operates on a state of 12 field elements (STATE_WIDTH = 12), with: /// - Rate: 8 elements (positions 0-7) /// - Capacity: 4 elements (positions 8-11) -/// - Digest output: 4 elements (positions 4-7) +/// - Digest output: 4 elements (positions 0-3) #[derive(Debug, Copy, Clone, Eq, PartialEq)] pub struct RpoPermutation256; diff --git a/miden-crypto/src/hash/algebraic_sponge/rescue/rpx/mod.rs b/miden-crypto/src/hash/algebraic_sponge/rescue/rpx/mod.rs index fb5ba44d7..c98c1db0c 100644 --- a/miden-crypto/src/hash/algebraic_sponge/rescue/rpx/mod.rs +++ b/miden-crypto/src/hash/algebraic_sponge/rescue/rpx/mod.rs @@ -345,7 +345,7 @@ use p3_symmetric::{ /// The permutation operates on a state of 12 field elements (STATE_WIDTH = 12), with: /// - Rate: 8 elements (positions 0-7) /// - Capacity: 4 elements (positions 8-11) -/// - Digest output: 4 elements (positions 4-7) +/// - Digest output: 4 elements (positions 0-3) #[derive(Debug, Copy, Clone, Eq, PartialEq)] pub struct RpxPermutation256; From 1d739ec7be8b201876d6c5b71ca89f466bcdcc5d Mon Sep 17 00:00:00 2001 From: al <82364884+Al-Kindi-0@users.noreply.github.com> Date: Wed, 14 Jan 2026 13:27:22 +0400 Subject: [PATCH 13/13] address feedback --- CHANGELOG.md | 2 +- miden-crypto/src/hash/algebraic_sponge/mod.rs | 10 +++++----- .../src/hash/algebraic_sponge/poseidon2/mod.rs | 8 ++++---- miden-crypto/src/hash/algebraic_sponge/rescue/mod.rs | 2 +- .../src/hash/algebraic_sponge/rescue/rpo/mod.rs | 8 ++++---- .../src/hash/algebraic_sponge/rescue/rpo/tests.rs | 2 +- .../src/hash/algebraic_sponge/rescue/rpx/mod.rs | 8 ++++---- 7 files changed, 20 insertions(+), 20 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2945f3fe7..fc4d2ca46 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,7 +1,7 @@ ## 0.21.0 (TBD) -- Use more idiomatic Plonky3 APIs ([#743](https://github.com/0xMiden/crypto/pull/743)). - [BREAKING] Removed `p3-compat` and `winter-compat` features ([#745](https://github.com/0xMiden/crypto/pull/745)). +- Use more idiomatic Plonky3 APIs ([#743](https://github.com/0xMiden/crypto/pull/743)). - Make concurrent feature interact with plonky3's parallel features, replace homegrown iterator macros with p3-maybe-rayon ([#749](https://github.com/0xMiden/crypto/pull/749)). - Reduce dependency on std in tests, add test helpers to access Rngs in no-std contexts ([#752](https://github.com/0xMiden/crypto/pull/752)). - [BREAKING] Changed sponge state layout from `[CAPACITY, RATE1, RATE0]` (BE) to `[RATE0, RATE1, CAPACITY]` (LE) ([#755](https://github.com/0xMiden/crypto/pull/755)). diff --git a/miden-crypto/src/hash/algebraic_sponge/mod.rs b/miden-crypto/src/hash/algebraic_sponge/mod.rs index 7ea6ce27e..30f83bc8d 100644 --- a/miden-crypto/src/hash/algebraic_sponge/mod.rs +++ b/miden-crypto/src/hash/algebraic_sponge/mod.rs @@ -34,8 +34,8 @@ pub(crate) const RATE_RANGE: Range = 0..8; pub(crate) const RATE_WIDTH: usize = RATE_RANGE.end - RATE_RANGE.start; /// The first and second 4-element words of the rate portion. -pub(crate) const INPUT1_RANGE: Range = 0..4; -pub(crate) const INPUT2_RANGE: Range = 4..8; +pub(crate) const RATE0_RANGE: Range = 0..4; +pub(crate) const RATE1_RANGE: Range = 4..8; /// The capacity portion of the state is located in elements 8, 9, 10, and 11. pub(crate) const CAPACITY_RANGE: Range = 8..12; @@ -203,12 +203,12 @@ pub(crate) trait AlgebraicSponge { // - if the value doesn't fit into a single field element, split it into two field elements, // copy them into rate elements 5 and 6 and set the first capacity element to 6. let mut state = [ZERO; STATE_WIDTH]; - state[INPUT1_RANGE].copy_from_slice(seed.as_elements()); - state[INPUT2_RANGE.start] = Felt::new(value); + state[RATE0_RANGE].copy_from_slice(seed.as_elements()); + state[RATE1_RANGE.start] = Felt::new(value); if value < Felt::ORDER_U64 { state[CAPACITY_RANGE.start] = Felt::from_u8(5_u8); } else { - state[INPUT2_RANGE.start + 1] = Felt::new(value / Felt::ORDER_U64); + state[RATE1_RANGE.start + 1] = Felt::new(value / Felt::ORDER_U64); state[CAPACITY_RANGE.start] = Felt::from_u8(6_u8); } diff --git a/miden-crypto/src/hash/algebraic_sponge/poseidon2/mod.rs b/miden-crypto/src/hash/algebraic_sponge/poseidon2/mod.rs index 9dc25253a..b798568d3 100644 --- a/miden-crypto/src/hash/algebraic_sponge/poseidon2/mod.rs +++ b/miden-crypto/src/hash/algebraic_sponge/poseidon2/mod.rs @@ -1,6 +1,6 @@ use super::{ - AlgebraicSponge, CAPACITY_RANGE, DIGEST_RANGE, Felt, INPUT1_RANGE, INPUT2_RANGE, - PrimeCharacteristicRing, RATE_RANGE, Range, STATE_WIDTH, Word, ZERO, + AlgebraicSponge, CAPACITY_RANGE, DIGEST_RANGE, Felt, PrimeCharacteristicRing, RATE_RANGE, + RATE0_RANGE, RATE1_RANGE, Range, STATE_WIDTH, Word, ZERO, }; mod constants; @@ -110,10 +110,10 @@ impl Poseidon2 { pub const RATE_RANGE: Range = RATE_RANGE; /// The first 4-element word of the rate portion. - pub const INPUT1_RANGE: Range = INPUT1_RANGE; + pub const RATE0_RANGE: Range = RATE0_RANGE; /// The second 4-element word of the rate portion. - pub const INPUT2_RANGE: Range = INPUT2_RANGE; + pub const RATE1_RANGE: Range = RATE1_RANGE; /// The capacity portion of the state is located in elements 8, 9, 10, and 11. pub const CAPACITY_RANGE: Range = CAPACITY_RANGE; diff --git a/miden-crypto/src/hash/algebraic_sponge/rescue/mod.rs b/miden-crypto/src/hash/algebraic_sponge/rescue/mod.rs index ad702f191..cf73963ea 100644 --- a/miden-crypto/src/hash/algebraic_sponge/rescue/mod.rs +++ b/miden-crypto/src/hash/algebraic_sponge/rescue/mod.rs @@ -1,7 +1,7 @@ use p3_field::{Field, PrimeCharacteristicRing}; use super::{ - AlgebraicSponge, CAPACITY_RANGE, DIGEST_RANGE, Felt, INPUT1_RANGE, INPUT2_RANGE, RATE_RANGE, + AlgebraicSponge, CAPACITY_RANGE, DIGEST_RANGE, Felt, RATE_RANGE, RATE0_RANGE, RATE1_RANGE, Range, STATE_WIDTH, Word, ZERO, }; diff --git a/miden-crypto/src/hash/algebraic_sponge/rescue/rpo/mod.rs b/miden-crypto/src/hash/algebraic_sponge/rescue/rpo/mod.rs index f0b9c8e4c..f122f05b3 100644 --- a/miden-crypto/src/hash/algebraic_sponge/rescue/rpo/mod.rs +++ b/miden-crypto/src/hash/algebraic_sponge/rescue/rpo/mod.rs @@ -1,6 +1,6 @@ use super::{ - ARK1, ARK2, AlgebraicSponge, CAPACITY_RANGE, DIGEST_RANGE, Felt, INPUT1_RANGE, INPUT2_RANGE, - MDS, NUM_ROUNDS, RATE_RANGE, Range, STATE_WIDTH, Word, add_constants, + ARK1, ARK2, AlgebraicSponge, CAPACITY_RANGE, DIGEST_RANGE, Felt, MDS, NUM_ROUNDS, RATE_RANGE, + RATE0_RANGE, RATE1_RANGE, Range, STATE_WIDTH, Word, add_constants, add_constants_and_apply_inv_sbox, add_constants_and_apply_sbox, apply_inv_sbox, apply_mds, apply_sbox, }; @@ -99,10 +99,10 @@ impl Rpo256 { pub const RATE_RANGE: Range = RATE_RANGE; /// The first 4-element word of the rate portion. - pub const INPUT1_RANGE: Range = INPUT1_RANGE; + pub const RATE0_RANGE: Range = RATE0_RANGE; /// The second 4-element word of the rate portion. - pub const INPUT2_RANGE: Range = INPUT2_RANGE; + pub const RATE1_RANGE: Range = RATE1_RANGE; /// The capacity portion of the state is located in elements 8, 9, 10, and 11. pub const CAPACITY_RANGE: Range = CAPACITY_RANGE; diff --git a/miden-crypto/src/hash/algebraic_sponge/rescue/rpo/tests.rs b/miden-crypto/src/hash/algebraic_sponge/rescue/rpo/tests.rs index 143e7724e..eecb4f666 100644 --- a/miden-crypto/src/hash/algebraic_sponge/rescue/rpo/tests.rs +++ b/miden-crypto/src/hash/algebraic_sponge/rescue/rpo/tests.rs @@ -154,7 +154,7 @@ fn hash_padding_no_extra_permutation_call() { // padding when hashing bytes state[CAPACITY_RANGE.start] = Felt::from_u8(RATE_WIDTH as u8); // place the final padded chunk into the last rate element - state[RATE_RANGE.start + RATE_WIDTH - 1] = Felt::new(u64::from_le_bytes(final_chunk)); + state[RATE_RANGE.end - 1] = Felt::new(u64::from_le_bytes(final_chunk)); Rpo256::apply_permutation(&mut state); assert_eq!(&r1[0..4], &state[DIGEST_RANGE]); diff --git a/miden-crypto/src/hash/algebraic_sponge/rescue/rpx/mod.rs b/miden-crypto/src/hash/algebraic_sponge/rescue/rpx/mod.rs index c98c1db0c..6e48f89e1 100644 --- a/miden-crypto/src/hash/algebraic_sponge/rescue/rpx/mod.rs +++ b/miden-crypto/src/hash/algebraic_sponge/rescue/rpx/mod.rs @@ -1,6 +1,6 @@ use super::{ - ARK1, ARK2, AlgebraicSponge, CAPACITY_RANGE, DIGEST_RANGE, Felt, INPUT1_RANGE, INPUT2_RANGE, - MDS, NUM_ROUNDS, RATE_RANGE, Range, STATE_WIDTH, Word, add_constants, + ARK1, ARK2, AlgebraicSponge, CAPACITY_RANGE, DIGEST_RANGE, Felt, MDS, NUM_ROUNDS, RATE_RANGE, + RATE0_RANGE, RATE1_RANGE, Range, STATE_WIDTH, Word, add_constants, add_constants_and_apply_ext_round, add_constants_and_apply_inv_sbox, add_constants_and_apply_sbox, apply_inv_sbox, apply_mds, apply_sbox, }; @@ -100,10 +100,10 @@ impl Rpx256 { pub const RATE_RANGE: Range = RATE_RANGE; /// The first 4-element word of the rate portion. - pub const INPUT1_RANGE: Range = INPUT1_RANGE; + pub const RATE0_RANGE: Range = RATE0_RANGE; /// The second 4-element word of the rate portion. - pub const INPUT2_RANGE: Range = INPUT2_RANGE; + pub const RATE1_RANGE: Range = RATE1_RANGE; /// The capacity portion of the state is located in elements 8, 9, 10, and 11. pub const CAPACITY_RANGE: Range = CAPACITY_RANGE;