From 952c3f9e76e95bccf3beddd33836e96e1906bb02 Mon Sep 17 00:00:00 2001 From: Zhang Zhuo Date: Wed, 27 Aug 2025 08:30:30 +0800 Subject: [PATCH 1/9] rewrite build guest --- Cargo.lock | 2 +- crates/build-guest/Cargo.toml | 2 +- crates/build-guest/src/main.rs | 403 ++-- .../circuits/batch-circuit/batch_vm_commit.rs | 4 + .../src/child_commitments/chunk_vm_commit.rs | 1 + .../src/child_commitments/mod.rs | 4 +- crates/circuits/batch-circuit/src/circuit.rs | 4 +- .../bundle-circuit/bundle_vm_commit.rs | 4 + .../src/child_commitments/batch_vm_commit.rs | 1 + .../src/child_commitments/mod.rs | 4 +- crates/circuits/bundle-circuit/src/circuit.rs | 4 +- .../circuits/chunk-circuit/chunk_vm_commit.rs | 4 + crates/prover/src/prover/mod.rs | 3 + crates/types/base/src/public_inputs/chunk.rs | 27 + crates/types/chunk/src/execute.rs | 2 +- releases/dev/verifier/verifier.bin | Bin 0 -> 18545 bytes releases/dev/verifier/verifier.sol | 2036 +++++++++++++++++ 17 files changed, 2266 insertions(+), 239 deletions(-) create mode 100644 crates/circuits/batch-circuit/batch_vm_commit.rs create mode 120000 crates/circuits/batch-circuit/src/child_commitments/chunk_vm_commit.rs create mode 100644 crates/circuits/bundle-circuit/bundle_vm_commit.rs create mode 120000 crates/circuits/bundle-circuit/src/child_commitments/batch_vm_commit.rs create mode 100644 crates/circuits/chunk-circuit/chunk_vm_commit.rs create mode 100644 releases/dev/verifier/verifier.bin create mode 100644 releases/dev/verifier/verifier.sol diff --git a/Cargo.lock b/Cargo.lock index cd1753e0..c8587628 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -6536,6 +6536,7 @@ name = "scroll-zkvm-build-guest" version = "0.6.0" dependencies = [ "cargo_metadata 0.19.2", + "clap", "dotenv", "eyre", "hex", @@ -6547,7 +6548,6 @@ dependencies = [ "openvm-sdk", "openvm-stark-sdk", "scroll-zkvm-types", - "serde", "serde_json", "snark-verifier-sdk", "toml", diff --git a/crates/build-guest/Cargo.toml b/crates/build-guest/Cargo.toml index 69be8d47..ed6ade3d 100644 --- a/crates/build-guest/Cargo.toml +++ b/crates/build-guest/Cargo.toml @@ -15,7 +15,6 @@ openvm-build = { workspace = true, default-features = false } openvm-circuit = { workspace = true } eyre.workspace = true -serde.workspace = true hex.workspace = true serde_json.workspace = true snark-verifier-sdk.workspace = true @@ -23,6 +22,7 @@ toml.workspace = true cargo_metadata = "0.19.1" dotenv = "0.15.0" +clap = { version = "4.0", features = ["derive"] } [features] default = [] diff --git a/crates/build-guest/src/main.rs b/crates/build-guest/src/main.rs index b26e57f3..ee573d7d 100644 --- a/crates/build-guest/src/main.rs +++ b/crates/build-guest/src/main.rs @@ -1,24 +1,45 @@ #![allow(clippy::ptr_arg)] //! Build script for guest circuits (chunk, batch, bundle). //! -//! This script handles several stages: -//! 1. Generating leaf commitments for circuit verifiers. -//! 2. Generating the root verifier assembly code (if batch or bundle is built). -//! 3. Building guest programs (ELF), transpiling them to VM executables (.vmexe), -//! and generating executable commitments. +//! This script builds OpenVM guest programs and generates associated assets: //! -//! Environment variables control behavior: -//! - `BUILD_PROJECT`: Comma-separated list of projects to build (e.g., "chunk,batch"). Defaults to "chunk,batch,bundle". -//! - `BUILD_STAGES`: Comma-separated list of stages to run (e.g., "stage1,stage3"). Defaults to "stage1,stage2,stage3". +//! ## App Assets Generation: +//! 1. Builds guest programs (ELF) for specified projects +//! 2. Transpiles ELF files to VM executables (.vmexe) +//! 3. Generates executable and VM commitments +//! 4. Creates verification keys and supporting files +//! +//! ## OpenVM Assets Generation: +//! 1. Generates root verifier assembly code +//! 2. Creates EVM verifier contract (Solidity) and bytecode +//! +//! ## Usage: +//! ```bash +//! cargo run --bin build-guest [OPTIONS] +//! ``` +//! +//! ## Options: +//! - `--mode `: Generation mode (auto|force) +//! - `auto`: Skip generation if output files already exist (default, faster for development) +//! - `force`: Always regenerate all files (use for clean builds or CI) +//! +//! ## Environment Variables: +//! - `BUILD_PROJECT`: Comma-separated list of projects to build (e.g., "chunk,batch"). +//! Defaults to "chunk,batch,bundle". +//! +//! ## Output: +//! - App assets: `releases/dev/{project_name}/` +//! - OpenVM assets: `releases/dev/verifier/` +//! - Commitment files: Written to respective circuit crate directories use std::{ - collections::{BTreeSet, HashMap}, env, fs::read_to_string, path::{Path, PathBuf}, time::Instant, }; +use clap::{Parser, ValueEnum}; use dotenv::dotenv; use eyre::Result; use openvm_build::GuestOptions; @@ -26,15 +47,35 @@ use openvm_native_compiler::ir::DIGEST_SIZE; use openvm_sdk::{ F, Sdk, commit::CommitBytes, - config::{AppConfig, SdkVmConfig}, - fs::write_exe_to_file, + config::{AggStarkConfig, AppConfig, SdkVmConfig}, + fs::write_object_to_file, + keygen::AggStarkProvingKey, }; use openvm_stark_sdk::{openvm_stark_backend::p3_field::PrimeField32, p3_bn254_fr::Bn254Fr}; use snark_verifier_sdk::snark_verifier::loader::evm::compile_solidity; mod verifier; -pub(crate) const LOG_PREFIX: &str = "[build-guest]"; +#[derive(Debug, Clone, ValueEnum)] +enum OutputMode { + /// Skip generation when output file already exists (default) + Auto, + /// Always overwrite existing files + Force, +} + +#[derive(Parser)] +#[command(name = "build-guest")] +#[command(about = "Build script for guest circuits (chunk, batch, bundle)")] +struct Cli { + /// Generation mode for OpenVM assets: + /// - auto: Skip generation if output files already exist (faster for development) + /// - force: Always regenerate all files (use for clean builds or CI) + #[arg(long, value_enum, default_value_t = OutputMode::Auto)] + mode: OutputMode, +} + +const LOG_PREFIX: &str = "[build-guest]"; /// File descriptor for app openvm config. const FD_APP_CONFIG: &str = "openvm.toml"; @@ -48,7 +89,9 @@ fn write_commitment(output_path: &PathBuf, commitment: [u32; DIGEST_SIZE]) -> Re std::fs::create_dir_all(parent)?; } std::fs::write(output_path, content)?; + println!("{LOG_PREFIX} Wrote commitment to {}", output_path.display()); + Ok(()) } @@ -70,100 +113,27 @@ fn write_commitment_as_evm_hex( println!("{LOG_PREFIX} Wrote commitment to {}", output_path.display()); Ok(()) } - /// Compresses an 8-element u32 commitment into a single Fr element. /// Used for generating digests compatible with on-chain verifiers. fn compress_commitment(commitment: &[u32; DIGEST_SIZE]) -> Bn254Fr { CommitBytes::from_u32_digest(commitment).to_bn254() } -/// Stage 1: Generates and writes leaf commitments for each specified project. -fn run_stage1_leaf_commitments( - project_names: &[&str], - workspace_dir: &Path, - release_output_dir: &PathBuf, -) -> Result> { - println!("{LOG_PREFIX} === Stage 1: Generating Leaf Commitments ==="); - let mut leaf_commitments = HashMap::new(); - for &project_name in project_names { - println!("{LOG_PREFIX} Processing project: {project_name}"); - let project_dir = workspace_dir - .join("crates") - .join("circuits") - .join(format!("{project_name}-circuit")); - let path_app_config = Path::new(&project_dir).join(FD_APP_CONFIG); - let app_config: AppConfig = - toml::from_str(&read_to_string(&path_app_config).unwrap()).unwrap(); - - // Generate public key (which includes leaf commitment) - let app_pk = Sdk::new().app_keygen(app_config.clone())?; - let leaf_vm_verifier_commit_f: [F; DIGEST_SIZE] = app_pk - .leaf_committed_exe - .committed_program - .commitment - .into(); - let leaf_vm_verifier_commit_u32 = leaf_vm_verifier_commit_f.map(|f| f.as_canonical_u32()); - leaf_commitments.insert(project_name.to_string(), leaf_vm_verifier_commit_u32); - - // Write the commitment to a .rs file - let output_path = project_dir.join(format!("{project_name}_leaf_commit.rs")); - write_commitment(&output_path, leaf_vm_verifier_commit_u32)?; - - // Special handling for bundle project: generate digest_2 - if project_name == "bundle" { - println!("{LOG_PREFIX} Generating digest_2 for bundle project..."); - let output_path = release_output_dir.join(project_name).join("digest_2.hex"); - write_commitment_as_evm_hex(&output_path, leaf_vm_verifier_commit_u32)?; - } - } - println!("{LOG_PREFIX} === Stage 1 Finished ==="); - Ok(leaf_commitments) -} - -/// Stage 2: Generates the root verifier assembly code. -fn run_stage2_root_verifier(project_names: &[&str], workspace_dir: &Path) -> Result<()> { - println!("{LOG_PREFIX} === Stage 2: Generating Root Verifier ==="); - use openvm_sdk::{config::AggStarkConfig, keygen::AggStarkProvingKey}; - // Only generate if "batch" or "bundle" is being built, as they use recursive verification. - if project_names - .iter() - .any(|&name| name == "batch" || name == "bundle") - { - println!("{LOG_PREFIX} Generating root verifier assembly..."); - let root_verifier_path = workspace_dir - .join("crates") - .join("build-guest") - .join("root_verifier.asm"); - - println!("generating AggStarkProvingKey"); - let agg_stark_pk = AggStarkProvingKey::keygen(AggStarkConfig::default()); +/// Builds guest programs, transpiles them, and generates executable commitments. +fn generate_app_assets(workspace_dir: &Path, release_output_dir: &PathBuf) -> Result<()> { + println!("{LOG_PREFIX} === Generating App Assets ==="); - println!("generating root_verifier.asm"); - let asm = openvm_sdk::Sdk::new().generate_root_verifier_asm(&agg_stark_pk); - std::fs::write(&root_verifier_path, asm).expect("fail to write"); + // Determine which projects to build + let projects_to_build_str = env::var("BUILD_PROJECT"); + let projects_to_build = projects_to_build_str + .as_ref() + .map(|s| s.split(',').filter(|p| !p.is_empty()).collect::>()) + .unwrap_or_else(|_| vec!["chunk", "batch", "bundle"]); // Default projects - println!( - "{LOG_PREFIX} Root verifier generated at: {}", - root_verifier_path.display() - ); - } else { - println!( - "{LOG_PREFIX} Skipping root verifier generation (not needed for selected projects)." - ); - } - println!("{LOG_PREFIX} === Stage 2 Finished ==="); - Ok(()) -} + println!("{LOG_PREFIX} Projects to build: {:?}", projects_to_build); -/// Stage 3: Builds guest programs, transpiles them, and generates executable commitments. -fn run_stage3_exe_commits( - project_names: &[&str], - workspace_dir: &Path, - release_output_dir: &PathBuf, -) -> Result> { - println!("{LOG_PREFIX} === Stage 3: Generating Executable Commitments ==="); - let mut exe_commitments = HashMap::new(); - for &project_name in project_names { + let mut vk_dump: serde_json::Value = serde_json::from_str("{}").unwrap(); + for project_name in projects_to_build { let project_path = workspace_dir .join("crates") .join("circuits") @@ -203,7 +173,8 @@ fn run_stage3_exe_commits( ); let guest_opts = GuestOptions::default(); let guest_opts = guest_opts.with_profile("maxperf".to_string()); - let elf = Sdk::new() + let sdk = Sdk::new(); + let elf = sdk .build( guest_opts, &app_config.app_vm_config, @@ -232,15 +203,12 @@ fn run_stage3_exe_commits( std::fs::create_dir_all(&path_assets)?; // Write exe to disc. let path_app_exe: PathBuf = path_assets.join("app.vmexe"); - write_exe_to_file(app_exe.clone(), &path_app_exe)?; - + write_object_to_file(&path_app_exe, app_exe.clone())?; println!("{LOG_PREFIX} exe written to {path_app_exe:?}"); - // 3. Commit VM Executable + // 3. Compute and Write Executable Commitment let app_committed_exe = Sdk::new().commit_app_exe(app_config.app_fri_params.fri_params, app_exe)?; - - // 4. Compute and Write Executable Commitment use openvm_circuit::arch::VmConfig; let exe_commit_f: [F; DIGEST_SIZE] = app_committed_exe .compute_exe_commit( @@ -248,88 +216,108 @@ fn run_stage3_exe_commits( ) .into(); let exe_commit_u32: [u32; DIGEST_SIZE] = exe_commit_f.map(|f| f.as_canonical_u32()); - exe_commitments.insert(project_name.to_string(), exe_commit_u32); - - let commit_filename = format!("{project_name}_exe_commit.rs"); - - let output_path = Path::new(project_dir).join(&commit_filename); - write_commitment(&output_path, exe_commit_u32)?; - - // Special handling for bundle project: generate digest_1 + let app_pk = Sdk::new().app_keygen(app_config.clone())?; + let vm_commit_f: [F; DIGEST_SIZE] = app_pk + .leaf_committed_exe + .committed_program + .commitment + .into(); + let vm_commit_u32 = vm_commit_f.map(|f| f.as_canonical_u32()); + + write_commitment( + &Path::new(project_dir).join(format!("{project_name}_exe_commit.rs")), + exe_commit_u32, + )?; + write_commitment( + &Path::new(project_dir).join(format!("{project_name}_vm_commit.rs")), + vm_commit_u32, + )?; + + // Special handling for bundle project if project_name == "bundle" { - println!("{LOG_PREFIX} Generating digest_1 for bundle project...",); let output_path = release_output_dir.join(project_name).join("digest_1.hex"); write_commitment_as_evm_hex(&output_path, exe_commit_u32)?; + let output_path = release_output_dir.join(project_name).join("digest_2.hex"); + write_commitment_as_evm_hex(&output_path, vm_commit_u32)?; } + use scroll_zkvm_types::{types_agg::ProgramCommitment, utils::serialize_vk}; + let app_vk = serialize_vk::serialize(&ProgramCommitment { + exe: exe_commit_u32, + vm: vm_commit_u32, + }); + + let app_vk = hex::encode(&app_vk); + println!("{project_name}: {app_vk}"); + + vk_dump[format!("{project_name}_vk")] = serde_json::Value::String(app_vk); + println!( "{LOG_PREFIX} Finished build for config in {:?}", start_time.elapsed() ); } - println!("{LOG_PREFIX} === Stage 3 Finished ==="); - Ok(exe_commitments) + + let output_path = release_output_dir.join("verifier").join("openVmVk.json"); + if let Some(parent) = output_path.parent() { + std::fs::create_dir_all(parent)?; + } + let f = std::fs::File::create(output_path)?; + serde_json::to_writer(f, &vk_dump)?; + println!( + "{LOG_PREFIX} openVmVk.json: {}", + serde_json::to_string_pretty(&vk_dump)? + ); + println!("{LOG_PREFIX} VK data written to openVmVk.json"); + Ok(()) } -/// Stage 4: Dumps VK data to a JSON file if both exe and leaf commitments are available. -fn run_stage4_dump_vk_json( - release_output_dir: &PathBuf, - leaf_commitments: Option>, - exe_commitments: Option>, -) -> Result<()> { - println!("{LOG_PREFIX} === Stage 4: Dumping VK JSON ==="); - - // Only dump VKs when both exe_commitments and leaf_commitments are available - if let (Some(exe_commitments), Some(leaf_commitments)) = (&exe_commitments, &leaf_commitments) { - #[derive(Default, Debug, serde::Serialize)] - struct VKDump { - pub chunk_vk: String, - pub batch_vk: String, - pub bundle_vk: String, - } - let [chunk_vk, batch_vk, bundle_vk] = ["chunk", "batch", "bundle"].map(|circuit| { - if let (Some(exe), Some(leaf)) = - (exe_commitments.get(circuit), leaf_commitments.get(circuit)) - { - use scroll_zkvm_types::{types_agg::ProgramCommitment, utils::serialize_vk}; - let app_vk = serialize_vk::serialize(&ProgramCommitment { - exe: *exe, - vm: *leaf, - }); - - let app_vk = hex::encode(&app_vk); - println!("{circuit}: {app_vk}"); - app_vk - } else { - String::new() // Empty string for circuits that weren't built - } - }); +/// Generates the root verifier assembly code. +fn generate_root_verifier(workspace_dir: &Path, force_overwrite: bool) -> Result<()> { + println!("{LOG_PREFIX} === Generating Root Verifier Assembly ==="); - let dump = VKDump { - chunk_vk, - batch_vk, - bundle_vk, - }; + let root_verifier_path = workspace_dir + .join("crates") + .join("build-guest") + .join("root_verifier.asm"); - let output_path = release_output_dir.join("verifier").join("openVmVk.json"); - if let Some(parent) = output_path.parent() { - std::fs::create_dir_all(parent)?; - } - let f = std::fs::File::create(output_path)?; - serde_json::to_writer(f, &dump)?; + // Check if file exists and skip if in auto mode + if !force_overwrite && root_verifier_path.exists() { println!( - "{LOG_PREFIX} openVmVk.json: {}", - serde_json::to_string_pretty(&dump)? + "{LOG_PREFIX} Root verifier already exists, skipping (use --output-mode force to overwrite)" ); - println!("{LOG_PREFIX} VK data written to openVmVk.json"); + return Ok(()); } + + let agg_stark_pk = AggStarkProvingKey::keygen(AggStarkConfig::default()); + let asm = openvm_sdk::Sdk::new().generate_root_verifier_asm(&agg_stark_pk); + std::fs::write(&root_verifier_path, asm).expect("fail to write"); + + println!( + "{LOG_PREFIX} Root verifier generated at: {}", + root_verifier_path.display() + ); + Ok(()) } -fn run_stage5_dump_evm_verifier(verifier_output_dir: &PathBuf, recompute_mode: bool) -> Result<()> { - println!("{LOG_PREFIX} === Stage 5: Dumping EVM VERIFIER ==="); +fn generate_evm_verifier( + verifier_output_dir: &PathBuf, + recompute_mode: bool, + force_overwrite: bool, +) -> Result<()> { + println!("{LOG_PREFIX} === Dumping EVM VERIFIER ==="); let path_verifier_sol = verifier_output_dir.join("verifier.sol"); let path_verifier_bin = verifier_output_dir.join("verifier.bin"); + + // Check if files exist and skip if in auto mode + if !force_overwrite && path_verifier_sol.exists() && path_verifier_bin.exists() { + println!( + "{LOG_PREFIX} EVM verifier files already exist, skipping (use --output-mode force to overwrite)" + ); + return Ok(()); + } + if let Some(parent) = path_verifier_bin.parent() { std::fs::create_dir_all(parent)?; } @@ -346,11 +334,28 @@ fn run_stage5_dump_evm_verifier(verifier_output_dir: &PathBuf, recompute_mode: b std::fs::write(&path_verifier_bin, &verifier_bin)?; println!("{LOG_PREFIX} verifier_bin written to {path_verifier_bin:?}"); - println!("{LOG_PREFIX} === Stage 5 Finished ==="); + Ok(()) +} + +fn generate_openvm_assets( + workspace_dir: &PathBuf, + release_output_dir: &PathBuf, + force_overwrite: bool, +) -> Result<()> { + // to use the 'foundry.toml' + env::set_current_dir(&workspace_dir)?; + + generate_root_verifier(workspace_dir, force_overwrite)?; + generate_evm_verifier(&release_output_dir.join("verifier"), true, force_overwrite)?; Ok(()) } pub fn main() -> Result<()> { + let cli = Cli::parse(); + + println!("{LOG_PREFIX} Generation mode: {:?}", cli.mode); + println!("{LOG_PREFIX} Will generate both app and openvm assets"); + // Set current directory to the crate's root let manifest_dir = env::var("CARGO_MANIFEST_DIR")?; env::set_current_dir(&manifest_dir)?; @@ -371,71 +376,13 @@ pub fn main() -> Result<()> { release_output_dir.display() ); - // Determine which projects to build - let projects_to_build_str = env::var("BUILD_PROJECT"); - let projects_to_build = projects_to_build_str - .as_ref() - .map(|s| s.split(',').filter(|p| !p.is_empty()).collect::>()) - .unwrap_or_else(|_| vec!["chunk", "batch", "bundle"]); // Default projects - - if projects_to_build.is_empty() { - println!("{LOG_PREFIX} No projects specified in BUILD_PROJECT. Exiting."); - return Ok(()); - } - println!("{LOG_PREFIX} Projects to build: {:?}", projects_to_build); - - // Determine which stages to run - let stages_env = - env::var("BUILD_STAGES").unwrap_or_else(|_| "stage1,stage2,stage3".to_string()); - let stages_to_run: BTreeSet<&str> = if stages_env.trim().is_empty() { - // If empty string is provided, run all stages - ["stage1", "stage2", "stage3"].iter().cloned().collect() - } else { - stages_env.split(',').filter(|s| !s.is_empty()).collect() - }; - - if stages_to_run.is_empty() { - println!("{LOG_PREFIX} No stages specified in BUILD_STAGES. Exiting."); - return Ok(()); - } - println!("{LOG_PREFIX} Stages to run: {:?}", stages_to_run); - - // Execute selected stages - let leaf_commitments = if stages_to_run.contains("stage1") { - Some(run_stage1_leaf_commitments( - &projects_to_build, - &workspace_dir, - &release_output_dir, - )?) - } else { - println!("{LOG_PREFIX} Skipping Stage 1: Leaf Commitments"); - None - }; - - if stages_to_run.contains("stage2") { - run_stage2_root_verifier(&projects_to_build, &workspace_dir)?; - } else { - println!("{LOG_PREFIX} Skipping Stage 2: Root Verifier"); - }; - - let exe_commitments = if stages_to_run.contains("stage3") { - Some(run_stage3_exe_commits( - &projects_to_build, - &workspace_dir, - &release_output_dir, - )?) - } else { - println!("{LOG_PREFIX} Skipping Stage 3: Exe Commits"); - None - }; + println!("{LOG_PREFIX} Generating openvm assets"); + let force_overwrite = matches!(cli.mode, OutputMode::Force); + generate_openvm_assets(&workspace_dir, &release_output_dir, force_overwrite)?; - run_stage4_dump_vk_json(&release_output_dir, leaf_commitments, exe_commitments)?; - - env::set_current_dir(&workspace_dir)?; - run_stage5_dump_evm_verifier( - &release_output_dir.join("verifier"), - stages_to_run.contains("stage5"), - )?; + // Always generate both app and openvm assets + println!("{LOG_PREFIX} Generating app assets (always overwrite)"); + generate_app_assets(&workspace_dir, &release_output_dir)?; println!("{LOG_PREFIX} Build process completed successfully."); Ok(()) diff --git a/crates/circuits/batch-circuit/batch_vm_commit.rs b/crates/circuits/batch-circuit/batch_vm_commit.rs new file mode 100644 index 00000000..44734bac --- /dev/null +++ b/crates/circuits/batch-circuit/batch_vm_commit.rs @@ -0,0 +1,4 @@ +#![cfg_attr(rustfmt, rustfmt_skip)] +//! Generated by crates/build-guest. DO NOT EDIT! + +pub const COMMIT: [u32; 8] = [1143979762, 1252839784, 728295280, 80130475, 1981604375, 1538642995, 55047256, 1521517292]; diff --git a/crates/circuits/batch-circuit/src/child_commitments/chunk_vm_commit.rs b/crates/circuits/batch-circuit/src/child_commitments/chunk_vm_commit.rs new file mode 120000 index 00000000..b9822325 --- /dev/null +++ b/crates/circuits/batch-circuit/src/child_commitments/chunk_vm_commit.rs @@ -0,0 +1 @@ +../../../chunk-circuit/chunk_vm_commit.rs \ No newline at end of file diff --git a/crates/circuits/batch-circuit/src/child_commitments/mod.rs b/crates/circuits/batch-circuit/src/child_commitments/mod.rs index ff4e9186..d5b4271a 100644 --- a/crates/circuits/batch-circuit/src/child_commitments/mod.rs +++ b/crates/circuits/batch-circuit/src/child_commitments/mod.rs @@ -1,5 +1,5 @@ mod chunk_exe_commit; -mod chunk_leaf_commit; +mod chunk_vm_commit; pub const EXE_COMMIT: [u32; 8] = chunk_exe_commit::COMMIT; -pub const LEAF_COMMIT: [u32; 8] = chunk_leaf_commit::COMMIT; +pub const VM_COMMIT: [u32; 8] = chunk_vm_commit::COMMIT; diff --git a/crates/circuits/batch-circuit/src/circuit.rs b/crates/circuits/batch-circuit/src/circuit.rs index 818256de..01210d39 100644 --- a/crates/circuits/batch-circuit/src/circuit.rs +++ b/crates/circuits/batch-circuit/src/circuit.rs @@ -53,9 +53,9 @@ impl AggCircuit for BatchCircuit { fn verify_commitments(commitment: &ProgramCommitment) { assert_eq!( commitment.vm, - child_commitments::LEAF_COMMIT, + child_commitments::VM_COMMIT, "mismatch chunk-proof leaf commitment: expected={:?}, got={:?}", - child_commitments::LEAF_COMMIT, + child_commitments::VM_COMMIT, commitment.vm, ); assert_eq!( diff --git a/crates/circuits/bundle-circuit/bundle_vm_commit.rs b/crates/circuits/bundle-circuit/bundle_vm_commit.rs new file mode 100644 index 00000000..5271f85c --- /dev/null +++ b/crates/circuits/bundle-circuit/bundle_vm_commit.rs @@ -0,0 +1,4 @@ +#![cfg_attr(rustfmt, rustfmt_skip)] +//! Generated by crates/build-guest. DO NOT EDIT! + +pub const COMMIT: [u32; 8] = [702922786, 974900043, 1870917533, 1628966797, 1650497578, 697799835, 298481193, 1937656708]; diff --git a/crates/circuits/bundle-circuit/src/child_commitments/batch_vm_commit.rs b/crates/circuits/bundle-circuit/src/child_commitments/batch_vm_commit.rs new file mode 120000 index 00000000..4bf3d07f --- /dev/null +++ b/crates/circuits/bundle-circuit/src/child_commitments/batch_vm_commit.rs @@ -0,0 +1 @@ +../../../batch-circuit/batch_vm_commit.rs \ No newline at end of file diff --git a/crates/circuits/bundle-circuit/src/child_commitments/mod.rs b/crates/circuits/bundle-circuit/src/child_commitments/mod.rs index bca19d3d..77435dd0 100644 --- a/crates/circuits/bundle-circuit/src/child_commitments/mod.rs +++ b/crates/circuits/bundle-circuit/src/child_commitments/mod.rs @@ -1,4 +1,4 @@ mod batch_exe_commit; -mod batch_leaf_commit; +mod batch_vm_commit; pub const EXE_COMMIT: [u32; 8] = batch_exe_commit::COMMIT; -pub const LEAF_COMMIT: [u32; 8] = batch_leaf_commit::COMMIT; +pub const VM_COMMIT: [u32; 8] = batch_vm_commit::COMMIT; diff --git a/crates/circuits/bundle-circuit/src/circuit.rs b/crates/circuits/bundle-circuit/src/circuit.rs index 9654f5ae..1c14fb46 100644 --- a/crates/circuits/bundle-circuit/src/circuit.rs +++ b/crates/circuits/bundle-circuit/src/circuit.rs @@ -46,9 +46,9 @@ impl AggCircuit for BundleCircuit { fn verify_commitments(commitment: &ProgramCommitment) { assert_eq!( commitment.vm, - child_commitments::LEAF_COMMIT, + child_commitments::VM_COMMIT, "mismatch batch-proof leaf commitment: expected={:?}, got={:?}", - child_commitments::LEAF_COMMIT, + child_commitments::VM_COMMIT, commitment.vm, ); assert_eq!( diff --git a/crates/circuits/chunk-circuit/chunk_vm_commit.rs b/crates/circuits/chunk-circuit/chunk_vm_commit.rs new file mode 100644 index 00000000..739a25bf --- /dev/null +++ b/crates/circuits/chunk-circuit/chunk_vm_commit.rs @@ -0,0 +1,4 @@ +#![cfg_attr(rustfmt, rustfmt_skip)] +//! Generated by crates/build-guest. DO NOT EDIT! + +pub const COMMIT: [u32; 8] = [636098662, 1159240103, 1476249019, 1206808598, 446929719, 1171493582, 43492796, 756143264]; diff --git a/crates/prover/src/prover/mod.rs b/crates/prover/src/prover/mod.rs index cd2d21dc..8940e556 100644 --- a/crates/prover/src/prover/mod.rs +++ b/crates/prover/src/prover/mod.rs @@ -256,6 +256,9 @@ impl Prover { ) .map_err(|e| Error::GenProof(e.to_string()))?; let proving_time_mills = t.elapsed().as_millis() as u64; + let prove_speed = + (total_cycles as f32 / 1000_000.0f32) / (proving_time_mills as f32 / 1000.0f32); // MHz + tracing::info!("proving speed: {:.2}MHz", prove_speed); let stat = StarkProofStat { total_cycles, proving_time_mills, diff --git a/crates/types/base/src/public_inputs/chunk.rs b/crates/types/base/src/public_inputs/chunk.rs index fbb3f952..5981ee59 100644 --- a/crates/types/base/src/public_inputs/chunk.rs +++ b/crates/types/base/src/public_inputs/chunk.rs @@ -127,6 +127,33 @@ pub struct ChunkInfo { #[rkyv()] pub block_ctxs: Vec, } +impl std::fmt::Display for ChunkInfo { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + // Create a wrapper struct that implements Debug + struct DisplayWrapper<'a>(&'a ChunkInfo); + + impl<'a> std::fmt::Debug for DisplayWrapper<'a> { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + f.debug_struct("ChunkInfo") + .field("chain_id", &self.0.chain_id) + .field("prev_state_root", &self.0.prev_state_root) + .field("post_state_root", &self.0.post_state_root) + .field("withdraw_root", &self.0.withdraw_root) + .field("data_hash", &self.0.data_hash) + .field("tx_data_digest", &self.0.tx_data_digest) + .field("prev_msg_queue_hash", &self.0.prev_msg_queue_hash) + .field("post_msg_queue_hash", &self.0.post_msg_queue_hash) + .field("tx_data_length", &self.0.tx_data_length) + .field("initial_block_number", &self.0.initial_block_number) + .field("block_ctxs", &"") + .finish() + } + } + + // Use the Debug implementation with pretty formatting + write!(f, "{:#?}", DisplayWrapper(self)) + } +} impl ChunkInfo { /// Public input hash for a given chunk (euclidv1 or da-codec@v6) is defined as diff --git a/crates/types/chunk/src/execute.rs b/crates/types/chunk/src/execute.rs index 2a37309c..585384f3 100644 --- a/crates/types/chunk/src/execute.rs +++ b/crates/types/chunk/src/execute.rs @@ -75,7 +75,7 @@ pub fn execute(witness: ChunkWitness) -> Result { block_ctxs: blocks.iter().map(block_to_context).collect(), }; - // println!("chunk_info = {}", chunk_info); + println!("chunk_info = {}", chunk_info); Ok(chunk_info) } diff --git a/releases/dev/verifier/verifier.bin b/releases/dev/verifier/verifier.bin new file mode 100644 index 0000000000000000000000000000000000000000..6b35e16d6dd671f2919298047e2ca45462b2d39e GIT binary patch literal 18545 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 literal 0 HcmV?d00001 diff --git a/releases/dev/verifier/verifier.sol b/releases/dev/verifier/verifier.sol new file mode 100644 index 00000000..c0f46233 --- /dev/null +++ b/releases/dev/verifier/verifier.sol @@ -0,0 +1,2036 @@ +// SPDX-License-Identifier: MIT + +pragma solidity 0.8.19; + +contract Halo2Verifier { + fallback(bytes calldata) external returns (bytes memory) { + assembly ("memory-safe") { + // Enforce that Solidity memory layout is respected + let data := mload(0x40) + if iszero(eq(data, 0x80)) { revert(0, 0) } + + let success := true + let f_p := 0x30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47 + let f_q := 0x30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001 + function validate_ec_point(x, y) -> valid { + { + let x_lt_p := lt(x, 0x30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47) + let y_lt_p := lt(y, 0x30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47) + valid := and(x_lt_p, y_lt_p) + } + { + let y_square := mulmod(y, y, 0x30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47) + let x_square := mulmod(x, x, 0x30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47) + let x_cube := + mulmod(x_square, x, 0x30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47) + let x_cube_plus_3 := + addmod(x_cube, 3, 0x30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47) + let is_affine := eq(x_cube_plus_3, y_square) + valid := and(valid, is_affine) + } + } + mstore(0xa0, mod(calldataload(0x0), f_q)) + mstore(0xc0, mod(calldataload(0x20), f_q)) + mstore(0xe0, mod(calldataload(0x40), f_q)) + mstore(0x100, mod(calldataload(0x60), f_q)) + mstore(0x120, mod(calldataload(0x80), f_q)) + mstore(0x140, mod(calldataload(0xa0), f_q)) + mstore(0x160, mod(calldataload(0xc0), f_q)) + mstore(0x180, mod(calldataload(0xe0), f_q)) + mstore(0x1a0, mod(calldataload(0x100), f_q)) + mstore(0x1c0, mod(calldataload(0x120), f_q)) + mstore(0x1e0, mod(calldataload(0x140), f_q)) + mstore(0x200, mod(calldataload(0x160), f_q)) + mstore(0x220, mod(calldataload(0x180), f_q)) + mstore(0x240, mod(calldataload(0x1a0), f_q)) + mstore(0x260, mod(calldataload(0x1c0), f_q)) + mstore(0x280, mod(calldataload(0x1e0), f_q)) + mstore(0x2a0, mod(calldataload(0x200), f_q)) + mstore(0x2c0, mod(calldataload(0x220), f_q)) + mstore(0x2e0, mod(calldataload(0x240), f_q)) + mstore(0x300, mod(calldataload(0x260), f_q)) + mstore(0x320, mod(calldataload(0x280), f_q)) + mstore(0x340, mod(calldataload(0x2a0), f_q)) + mstore(0x360, mod(calldataload(0x2c0), f_q)) + mstore(0x380, mod(calldataload(0x2e0), f_q)) + mstore(0x3a0, mod(calldataload(0x300), f_q)) + mstore(0x3c0, mod(calldataload(0x320), f_q)) + mstore(0x3e0, mod(calldataload(0x340), f_q)) + mstore(0x400, mod(calldataload(0x360), f_q)) + mstore(0x420, mod(calldataload(0x380), f_q)) + mstore(0x440, mod(calldataload(0x3a0), f_q)) + mstore(0x460, mod(calldataload(0x3c0), f_q)) + mstore(0x480, mod(calldataload(0x3e0), f_q)) + mstore(0x4a0, mod(calldataload(0x400), f_q)) + mstore(0x4c0, mod(calldataload(0x420), f_q)) + mstore(0x4e0, mod(calldataload(0x440), f_q)) + mstore(0x500, mod(calldataload(0x460), f_q)) + mstore(0x520, mod(calldataload(0x480), f_q)) + mstore(0x540, mod(calldataload(0x4a0), f_q)) + mstore(0x560, mod(calldataload(0x4c0), f_q)) + mstore(0x580, mod(calldataload(0x4e0), f_q)) + mstore(0x5a0, mod(calldataload(0x500), f_q)) + mstore(0x5c0, mod(calldataload(0x520), f_q)) + mstore(0x5e0, mod(calldataload(0x540), f_q)) + mstore(0x600, mod(calldataload(0x560), f_q)) + mstore(0x620, mod(calldataload(0x580), f_q)) + mstore(0x640, mod(calldataload(0x5a0), f_q)) + mstore(0x80, 390330814115173750526380320564184081440196244988022584520359727231485894627) + + { + let x := calldataload(0x5c0) + mstore(0x660, x) + let y := calldataload(0x5e0) + mstore(0x680, y) + success := and(validate_ec_point(x, y), success) + } + mstore(0x6a0, keccak256(0x80, 1568)) + { + let hash := mload(0x6a0) + mstore(0x6c0, mod(hash, f_q)) + mstore(0x6e0, hash) + } + + { + let x := calldataload(0x600) + mstore(0x700, x) + let y := calldataload(0x620) + mstore(0x720, y) + success := and(validate_ec_point(x, y), success) + } + + { + let x := calldataload(0x640) + mstore(0x740, x) + let y := calldataload(0x660) + mstore(0x760, y) + success := and(validate_ec_point(x, y), success) + } + mstore(0x780, keccak256(0x6e0, 160)) + { + let hash := mload(0x780) + mstore(0x7a0, mod(hash, f_q)) + mstore(0x7c0, hash) + } + mstore8(2016, 1) + mstore(0x7e0, keccak256(0x7c0, 33)) + { + let hash := mload(0x7e0) + mstore(0x800, mod(hash, f_q)) + mstore(0x820, hash) + } + + { + let x := calldataload(0x680) + mstore(0x840, x) + let y := calldataload(0x6a0) + mstore(0x860, y) + success := and(validate_ec_point(x, y), success) + } + + { + let x := calldataload(0x6c0) + mstore(0x880, x) + let y := calldataload(0x6e0) + mstore(0x8a0, y) + success := and(validate_ec_point(x, y), success) + } + + { + let x := calldataload(0x700) + mstore(0x8c0, x) + let y := calldataload(0x720) + mstore(0x8e0, y) + success := and(validate_ec_point(x, y), success) + } + mstore(0x900, keccak256(0x820, 224)) + { + let hash := mload(0x900) + mstore(0x920, mod(hash, f_q)) + mstore(0x940, hash) + } + + { + let x := calldataload(0x740) + mstore(0x960, x) + let y := calldataload(0x760) + mstore(0x980, y) + success := and(validate_ec_point(x, y), success) + } + + { + let x := calldataload(0x780) + mstore(0x9a0, x) + let y := calldataload(0x7a0) + mstore(0x9c0, y) + success := and(validate_ec_point(x, y), success) + } + + { + let x := calldataload(0x7c0) + mstore(0x9e0, x) + let y := calldataload(0x7e0) + mstore(0xa00, y) + success := and(validate_ec_point(x, y), success) + } + + { + let x := calldataload(0x800) + mstore(0xa20, x) + let y := calldataload(0x820) + mstore(0xa40, y) + success := and(validate_ec_point(x, y), success) + } + mstore(0xa60, keccak256(0x940, 288)) + { + let hash := mload(0xa60) + mstore(0xa80, mod(hash, f_q)) + mstore(0xaa0, hash) + } + mstore(0xac0, mod(calldataload(0x840), f_q)) + mstore(0xae0, mod(calldataload(0x860), f_q)) + mstore(0xb00, mod(calldataload(0x880), f_q)) + mstore(0xb20, mod(calldataload(0x8a0), f_q)) + mstore(0xb40, mod(calldataload(0x8c0), f_q)) + mstore(0xb60, mod(calldataload(0x8e0), f_q)) + mstore(0xb80, mod(calldataload(0x900), f_q)) + mstore(0xba0, mod(calldataload(0x920), f_q)) + mstore(0xbc0, mod(calldataload(0x940), f_q)) + mstore(0xbe0, mod(calldataload(0x960), f_q)) + mstore(0xc00, mod(calldataload(0x980), f_q)) + mstore(0xc20, mod(calldataload(0x9a0), f_q)) + mstore(0xc40, mod(calldataload(0x9c0), f_q)) + mstore(0xc60, mod(calldataload(0x9e0), f_q)) + mstore(0xc80, mod(calldataload(0xa00), f_q)) + mstore(0xca0, mod(calldataload(0xa20), f_q)) + mstore(0xcc0, mod(calldataload(0xa40), f_q)) + mstore(0xce0, mod(calldataload(0xa60), f_q)) + mstore(0xd00, mod(calldataload(0xa80), f_q)) + mstore(0xd20, keccak256(0xaa0, 640)) + { + let hash := mload(0xd20) + mstore(0xd40, mod(hash, f_q)) + mstore(0xd60, hash) + } + mstore8(3456, 1) + mstore(0xd80, keccak256(0xd60, 33)) + { + let hash := mload(0xd80) + mstore(0xda0, mod(hash, f_q)) + mstore(0xdc0, hash) + } + + { + let x := calldataload(0xaa0) + mstore(0xde0, x) + let y := calldataload(0xac0) + mstore(0xe00, y) + success := and(validate_ec_point(x, y), success) + } + mstore(0xe20, keccak256(0xdc0, 96)) + { + let hash := mload(0xe20) + mstore(0xe40, mod(hash, f_q)) + mstore(0xe60, hash) + } + + { + let x := calldataload(0xae0) + mstore(0xe80, x) + let y := calldataload(0xb00) + mstore(0xea0, y) + success := and(validate_ec_point(x, y), success) + } + { + let x := mload(0xa0) + x := add(x, shl(88, mload(0xc0))) + x := add(x, shl(176, mload(0xe0))) + mstore(3776, x) + let y := mload(0x100) + y := add(y, shl(88, mload(0x120))) + y := add(y, shl(176, mload(0x140))) + mstore(3808, y) + + success := and(validate_ec_point(x, y), success) + } + { + let x := mload(0x160) + x := add(x, shl(88, mload(0x180))) + x := add(x, shl(176, mload(0x1a0))) + mstore(3840, x) + let y := mload(0x1c0) + y := add(y, shl(88, mload(0x1e0))) + y := add(y, shl(176, mload(0x200))) + mstore(3872, y) + + success := and(validate_ec_point(x, y), success) + } + mstore(0xf40, mulmod(mload(0xa80), mload(0xa80), f_q)) + mstore(0xf60, mulmod(mload(0xf40), mload(0xf40), f_q)) + mstore(0xf80, mulmod(mload(0xf60), mload(0xf60), f_q)) + mstore(0xfa0, mulmod(mload(0xf80), mload(0xf80), f_q)) + mstore(0xfc0, mulmod(mload(0xfa0), mload(0xfa0), f_q)) + mstore(0xfe0, mulmod(mload(0xfc0), mload(0xfc0), f_q)) + mstore(0x1000, mulmod(mload(0xfe0), mload(0xfe0), f_q)) + mstore(0x1020, mulmod(mload(0x1000), mload(0x1000), f_q)) + mstore(0x1040, mulmod(mload(0x1020), mload(0x1020), f_q)) + mstore(0x1060, mulmod(mload(0x1040), mload(0x1040), f_q)) + mstore(0x1080, mulmod(mload(0x1060), mload(0x1060), f_q)) + mstore(0x10a0, mulmod(mload(0x1080), mload(0x1080), f_q)) + mstore(0x10c0, mulmod(mload(0x10a0), mload(0x10a0), f_q)) + mstore(0x10e0, mulmod(mload(0x10c0), mload(0x10c0), f_q)) + mstore(0x1100, mulmod(mload(0x10e0), mload(0x10e0), f_q)) + mstore(0x1120, mulmod(mload(0x1100), mload(0x1100), f_q)) + mstore(0x1140, mulmod(mload(0x1120), mload(0x1120), f_q)) + mstore(0x1160, mulmod(mload(0x1140), mload(0x1140), f_q)) + mstore(0x1180, mulmod(mload(0x1160), mload(0x1160), f_q)) + mstore(0x11a0, mulmod(mload(0x1180), mload(0x1180), f_q)) + mstore(0x11c0, mulmod(mload(0x11a0), mload(0x11a0), f_q)) + mstore(0x11e0, mulmod(mload(0x11c0), mload(0x11c0), f_q)) + mstore(0x1200, mulmod(mload(0x11e0), mload(0x11e0), f_q)) + mstore( + 0x1220, + addmod( + mload(0x1200), 21888242871839275222246405745257275088548364400416034343698204186575808495616, f_q + ) + ) + mstore( + 0x1240, + mulmod( + mload(0x1220), 21888240262557392955334514970720457388010314637169927192662615958087340972065, f_q + ) + ) + mstore( + 0x1260, + mulmod(mload(0x1240), 4506835738822104338668100540817374747935106310012997856968187171738630203507, f_q) + ) + mstore( + 0x1280, + addmod(mload(0xa80), 17381407133017170883578305204439900340613258090403036486730017014837178292110, f_q) + ) + mstore( + 0x12a0, + mulmod( + mload(0x1240), 21710372849001950800533397158415938114909991150039389063546734567764856596059, f_q + ) + ) + mstore( + 0x12c0, + addmod(mload(0xa80), 177870022837324421713008586841336973638373250376645280151469618810951899558, f_q) + ) + mstore( + 0x12e0, + mulmod(mload(0x1240), 1887003188133998471169152042388914354640772748308168868301418279904560637395, f_q) + ) + mstore( + 0x1300, + addmod(mload(0xa80), 20001239683705276751077253702868360733907591652107865475396785906671247858222, f_q) + ) + mstore( + 0x1320, + mulmod(mload(0x1240), 2785514556381676080176937710880804108647911392478702105860685610379369825016, f_q) + ) + mstore( + 0x1340, + addmod(mload(0xa80), 19102728315457599142069468034376470979900453007937332237837518576196438670601, f_q) + ) + mstore( + 0x1360, + mulmod( + mload(0x1240), 14655294445420895451632927078981340937842238432098198055057679026789553137428, f_q + ) + ) + mstore( + 0x1380, + addmod(mload(0xa80), 7232948426418379770613478666275934150706125968317836288640525159786255358189, f_q) + ) + mstore( + 0x13a0, + mulmod(mload(0x1240), 8734126352828345679573237859165904705806588461301144420590422589042130041188, f_q) + ) + mstore( + 0x13c0, + addmod(mload(0xa80), 13154116519010929542673167886091370382741775939114889923107781597533678454429, f_q) + ) + mstore( + 0x13e0, + mulmod(mload(0x1240), 9741553891420464328295280489650144566903017206473301385034033384879943874347, f_q) + ) + mstore( + 0x1400, + addmod(mload(0xa80), 12146688980418810893951125255607130521645347193942732958664170801695864621270, f_q) + ) + mstore(0x1420, mulmod(mload(0x1240), 1, f_q)) + mstore( + 0x1440, + addmod(mload(0xa80), 21888242871839275222246405745257275088548364400416034343698204186575808495616, f_q) + ) + mstore( + 0x1460, + mulmod(mload(0x1240), 8374374965308410102411073611984011876711565317741801500439755773472076597347, f_q) + ) + mstore( + 0x1480, + addmod(mload(0xa80), 13513867906530865119835332133273263211836799082674232843258448413103731898270, f_q) + ) + mstore( + 0x14a0, + mulmod( + mload(0x1240), 11211301017135681023579411905410872569206244553457844956874280139879520583390, f_q + ) + ) + mstore( + 0x14c0, + addmod(mload(0xa80), 10676941854703594198666993839846402519342119846958189386823924046696287912227, f_q) + ) + mstore( + 0x14e0, + mulmod(mload(0x1240), 3615478808282855240548287271348143516886772452944084747768312988864436725401, f_q) + ) + mstore( + 0x1500, + addmod(mload(0xa80), 18272764063556419981698118473909131571661591947471949595929891197711371770216, f_q) + ) + mstore( + 0x1520, + mulmod(mload(0x1240), 1426404432721484388505361748317961535523355871255605456897797744433766488507, f_q) + ) + mstore( + 0x1540, + addmod(mload(0xa80), 20461838439117790833741043996939313553025008529160428886800406442142042007110, f_q) + ) + mstore( + 0x1560, + mulmod(mload(0x1240), 216092043779272773661818549620449970334216366264741118684015851799902419467, f_q) + ) + mstore( + 0x1580, + addmod(mload(0xa80), 21672150828060002448584587195636825118214148034151293225014188334775906076150, f_q) + ) + mstore( + 0x15a0, + mulmod( + mload(0x1240), 12619617507853212586156872920672483948819476989779550311307282715684870266992, f_q + ) + ) + mstore( + 0x15c0, + addmod(mload(0xa80), 9268625363986062636089532824584791139728887410636484032390921470890938228625, f_q) + ) + mstore( + 0x15e0, + mulmod( + mload(0x1240), 18610195890048912503953886742825279624920778288956610528523679659246523534888, f_q + ) + ) + mstore( + 0x1600, + addmod(mload(0xa80), 3278046981790362718292519002431995463627586111459423815174524527329284960729, f_q) + ) + mstore( + 0x1620, + mulmod( + mload(0x1240), 19032961837237948602743626455740240236231119053033140765040043513661803148152, f_q + ) + ) + mstore( + 0x1640, + addmod(mload(0xa80), 2855281034601326619502779289517034852317245347382893578658160672914005347465, f_q) + ) + mstore( + 0x1660, + mulmod( + mload(0x1240), 14875928112196239563830800280253496262679717528621719058794366823499719730250, f_q + ) + ) + mstore( + 0x1680, + addmod(mload(0xa80), 7012314759643035658415605465003778825868646871794315284903837363076088765367, f_q) + ) + mstore( + 0x16a0, + mulmod(mload(0x1240), 915149353520972163646494413843788069594022902357002628455555785223409501882, f_q) + ) + mstore( + 0x16c0, + addmod(mload(0xa80), 20973093518318303058599911331413487018954341498059031715242648401352398993735, f_q) + ) + mstore( + 0x16e0, + mulmod(mload(0x1240), 5522161504810533295870699551020523636289972223872138525048055197429246400245, f_q) + ) + mstore( + 0x1700, + addmod(mload(0xa80), 16366081367028741926375706194236751452258392176543895818650148989146562095372, f_q) + ) + mstore( + 0x1720, + mulmod(mload(0x1240), 3766081621734395783232337525162072736827576297943013392955872170138036189193, f_q) + ) + mstore( + 0x1740, + addmod(mload(0xa80), 18122161250104879439014068220095202351720788102473020950742332016437772306424, f_q) + ) + mstore( + 0x1760, + mulmod(mload(0x1240), 9100833993744738801214480881117348002768153232283708533639316963648253510584, f_q) + ) + mstore( + 0x1780, + addmod(mload(0xa80), 12787408878094536421031924864139927085780211168132325810058887222927554985033, f_q) + ) + mstore( + 0x17a0, + mulmod(mload(0x1240), 4245441013247250116003069945606352967193023389718465410501109428393342802981, f_q) + ) + mstore( + 0x17c0, + addmod(mload(0xa80), 17642801858592025106243335799650922121355341010697568933197094758182465692636, f_q) + ) + mstore( + 0x17e0, + mulmod(mload(0x1240), 6132660129994545119218258312491950835441607143741804980633129304664017206141, f_q) + ) + mstore( + 0x1800, + addmod(mload(0xa80), 15755582741844730103028147432765324253106757256674229363065074881911791289476, f_q) + ) + mstore( + 0x1820, + mulmod(mload(0x1240), 5854133144571823792863860130267644613802765696134002830362054821530146160770, f_q) + ) + mstore( + 0x1840, + addmod(mload(0xa80), 16034109727267451429382545614989630474745598704282031513336149365045662334847, f_q) + ) + mstore( + 0x1860, + mulmod(mload(0x1240), 515148244606945972463850631189471072103916690263705052318085725998468254533, f_q) + ) + mstore( + 0x1880, + addmod(mload(0xa80), 21373094627232329249782555114067804016444447710152329291380118460577340241084, f_q) + ) + mstore( + 0x18a0, + mulmod(mload(0x1240), 5980488956150442207659150513163747165544364597008566989111579977672498964212, f_q) + ) + mstore( + 0x18c0, + addmod(mload(0xa80), 15907753915688833014587255232093527923003999803407467354586624208903309531405, f_q) + ) + mstore( + 0x18e0, + mulmod(mload(0x1240), 5223738580615264174925218065001555728265216895679471490312087802465486318994, f_q) + ) + mstore( + 0x1900, + addmod(mload(0xa80), 16664504291224011047321187680255719360283147504736562853386116384110322176623, f_q) + ) + mstore( + 0x1920, + mulmod( + mload(0x1240), 14557038802599140430182096396825290815503940951075961210638273254419942783582, f_q + ) + ) + mstore( + 0x1940, + addmod(mload(0xa80), 7331204069240134792064309348431984273044423449340073133059930932155865712035, f_q) + ) + mstore( + 0x1960, + mulmod( + mload(0x1240), 16976236069879939850923145256911338076234942200101755618884183331004076579046, f_q + ) + ) + mstore( + 0x1980, + addmod(mload(0xa80), 4912006801959335371323260488345937012313422200314278724814020855571731916571, f_q) + ) + mstore( + 0x19a0, + mulmod( + mload(0x1240), 13553911191894110065493137367144919847521088405945523452288398666974237857208, f_q + ) + ) + mstore( + 0x19c0, + addmod(mload(0xa80), 8334331679945165156753268378112355241027275994470510891409805519601570638409, f_q) + ) + mstore( + 0x19e0, + mulmod( + mload(0x1240), 12222687719926148270818604386979005738180875192307070468454582955273533101023, f_q + ) + ) + mstore( + 0x1a00, + addmod(mload(0xa80), 9665555151913126951427801358278269350367489208108963875243621231302275394594, f_q) + ) + mstore( + 0x1a20, + mulmod(mload(0x1240), 9697063347556872083384215826199993067635178715531258559890418744774301211662, f_q) + ) + mstore( + 0x1a40, + addmod(mload(0xa80), 12191179524282403138862189919057282020913185684884775783807785441801507283955, f_q) + ) + mstore( + 0x1a60, + mulmod( + mload(0x1240), 13783318220968413117070077848579881425001701814458176881760898225529300547844, f_q + ) + ) + mstore( + 0x1a80, + addmod(mload(0xa80), 8104924650870862105176327896677393663546662585957857461937305961046507947773, f_q) + ) + mstore( + 0x1aa0, + mulmod( + mload(0x1240), 10807735674816066981985242612061336605021639643453679977988966079770672437131, f_q + ) + ) + mstore( + 0x1ac0, + addmod(mload(0xa80), 11080507197023208240261163133195938483526724756962354365709238106805136058486, f_q) + ) + mstore( + 0x1ae0, + mulmod( + mload(0x1240), 15487660954688013862248478071816391715224351867581977083810729441220383572585, f_q + ) + ) + mstore( + 0x1b00, + addmod(mload(0xa80), 6400581917151261359997927673440883373324012532834057259887474745355424923032, f_q) + ) + mstore( + 0x1b20, + mulmod( + mload(0x1240), 12459868075641381822485233712013080087763946065665469821362892189399541605692, f_q + ) + ) + mstore( + 0x1b40, + addmod(mload(0xa80), 9428374796197893399761172033244195000784418334750564522335311997176266889925, f_q) + ) + mstore( + 0x1b60, + mulmod( + mload(0x1240), 12562571400845953139885120066983392294851269266041089223701347829190217414825, f_q + ) + ) + mstore( + 0x1b80, + addmod(mload(0xa80), 9325671470993322082361285678273882793697095134374945119996856357385591080792, f_q) + ) + mstore( + 0x1ba0, + mulmod( + mload(0x1240), 16038300751658239075779628684257016433412502747804121525056508685985277092575, f_q + ) + ) + mstore( + 0x1bc0, + addmod(mload(0xa80), 5849942120181036146466777061000258655135861652611912818641695500590531403042, f_q) + ) + mstore( + 0x1be0, + mulmod( + mload(0x1240), 17665522928519859765452767154433594409738037332395989540221744312194874941704, f_q + ) + ) + mstore( + 0x1c00, + addmod(mload(0xa80), 4222719943319415456793638590823680678810327068020044803476459874380933553913, f_q) + ) + mstore( + 0x1c20, + mulmod(mload(0x1240), 6955697244493336113861667751840378876927906302623587437721024018233754910398, f_q) + ) + mstore( + 0x1c40, + addmod(mload(0xa80), 14932545627345939108384737993416896211620458097792446905977180168342053585219, f_q) + ) + mstore( + 0x1c60, + mulmod(mload(0x1240), 1918679275621049296283934091410967415474987212511681231948800935495808101054, f_q) + ) + mstore( + 0x1c80, + addmod(mload(0xa80), 19969563596218225925962471653846307673073377187904353111749403251080000394563, f_q) + ) + mstore( + 0x1ca0, + mulmod( + mload(0x1240), 13498745591877810872211159461644682954739332524336278910448604883789771736885, f_q + ) + ) + mstore( + 0x1cc0, + addmod(mload(0xa80), 8389497279961464350035246283612592133809031876079755433249599302786036758732, f_q) + ) + mstore( + 0x1ce0, + mulmod(mload(0x1240), 6604851689411953560355663038203889299997924520355363678860500374111951937637, f_q) + ) + mstore( + 0x1d00, + addmod(mload(0xa80), 15283391182427321661890742707053385788550439880060670664837703812463856557980, f_q) + ) + mstore( + 0x1d20, + mulmod( + mload(0x1240), 20345677989844117909528750049476969581182118546166966482506114734614108237981, f_q + ) + ) + mstore( + 0x1d40, + addmod(mload(0xa80), 1542564881995157312717655695780305507366245854249067861192089451961700257636, f_q) + ) + mstore( + 0x1d60, + mulmod( + mload(0x1240), 11244009323710436498447061620026171700033960328162115124806024297270121927878, f_q + ) + ) + mstore( + 0x1d80, + addmod(mload(0xa80), 10644233548128838723799344125231103388514404072253919218892179889305686567739, f_q) + ) + mstore( + 0x1da0, + mulmod(mload(0x1240), 790608022292213379425324383664216541739009722347092850716054055768832299157, f_q) + ) + mstore( + 0x1dc0, + addmod(mload(0xa80), 21097634849547061842821081361593058546809354678068941492982150130806976196460, f_q) + ) + mstore( + 0x1de0, + mulmod( + mload(0x1240), 13894403229372218245111098554468346933152618215322268934207074514797092422856, f_q + ) + ) + mstore( + 0x1e00, + addmod(mload(0xa80), 7993839642467056977135307190788928155395746185093765409491129671778716072761, f_q) + ) + mstore( + 0x1e20, + mulmod(mload(0x1240), 5289443209903185443361862148540090689648485914368835830972895623576469023722, f_q) + ) + mstore( + 0x1e40, + addmod(mload(0xa80), 16598799661936089778884543596717184398899878486047198512725308562999339471895, f_q) + ) + mstore( + 0x1e60, + mulmod( + mload(0x1240), 19715528266218439644661892824912275086257866064695767122686506494361332681035, f_q + ) + ) + mstore( + 0x1e80, + addmod(mload(0xa80), 2172714605620835577584512920345000002290498335720267221011697692214475814582, f_q) + ) + mstore( + 0x1ea0, + mulmod( + mload(0x1240), 15161189183906287273290738379431332336600234154579306802151507052820126345529, f_q + ) + ) + mstore( + 0x1ec0, + addmod(mload(0xa80), 6727053687932987948955667365825942751948130245836727541546697133755682150088, f_q) + ) + mstore( + 0x1ee0, + mulmod( + mload(0x1240), 12456424076401232823832128238027368612265814450984711658287606686035629293382, f_q + ) + ) + mstore( + 0x1f00, + addmod(mload(0xa80), 9431818795438042398414277507229906476282549949431322685410597500540179202235, f_q) + ) + mstore( + 0x1f20, + mulmod(mload(0x1240), 557567375339945239933617516585967620814823575807691402619711360028043331811, f_q) + ) + mstore( + 0x1f40, + addmod(mload(0xa80), 21330675496499329982312788228671307467733540824608342941078492826547765163806, f_q) + ) + mstore( + 0x1f60, + mulmod(mload(0x1240), 3675353143102618619098608207619541954347747556257261634661810167705798540391, f_q) + ) + mstore( + 0x1f80, + addmod(mload(0xa80), 18212889728736656603147797537637733134200616844158772709036394018870009955226, f_q) + ) + { + let prod := mload(0x1280) + + prod := mulmod(mload(0x12c0), prod, f_q) + mstore(0x1fa0, prod) + + prod := mulmod(mload(0x1300), prod, f_q) + mstore(0x1fc0, prod) + + prod := mulmod(mload(0x1340), prod, f_q) + mstore(0x1fe0, prod) + + prod := mulmod(mload(0x1380), prod, f_q) + mstore(0x2000, prod) + + prod := mulmod(mload(0x13c0), prod, f_q) + mstore(0x2020, prod) + + prod := mulmod(mload(0x1400), prod, f_q) + mstore(0x2040, prod) + + prod := mulmod(mload(0x1440), prod, f_q) + mstore(0x2060, prod) + + prod := mulmod(mload(0x1480), prod, f_q) + mstore(0x2080, prod) + + prod := mulmod(mload(0x14c0), prod, f_q) + mstore(0x20a0, prod) + + prod := mulmod(mload(0x1500), prod, f_q) + mstore(0x20c0, prod) + + prod := mulmod(mload(0x1540), prod, f_q) + mstore(0x20e0, prod) + + prod := mulmod(mload(0x1580), prod, f_q) + mstore(0x2100, prod) + + prod := mulmod(mload(0x15c0), prod, f_q) + mstore(0x2120, prod) + + prod := mulmod(mload(0x1600), prod, f_q) + mstore(0x2140, prod) + + prod := mulmod(mload(0x1640), prod, f_q) + mstore(0x2160, prod) + + prod := mulmod(mload(0x1680), prod, f_q) + mstore(0x2180, prod) + + prod := mulmod(mload(0x16c0), prod, f_q) + mstore(0x21a0, prod) + + prod := mulmod(mload(0x1700), prod, f_q) + mstore(0x21c0, prod) + + prod := mulmod(mload(0x1740), prod, f_q) + mstore(0x21e0, prod) + + prod := mulmod(mload(0x1780), prod, f_q) + mstore(0x2200, prod) + + prod := mulmod(mload(0x17c0), prod, f_q) + mstore(0x2220, prod) + + prod := mulmod(mload(0x1800), prod, f_q) + mstore(0x2240, prod) + + prod := mulmod(mload(0x1840), prod, f_q) + mstore(0x2260, prod) + + prod := mulmod(mload(0x1880), prod, f_q) + mstore(0x2280, prod) + + prod := mulmod(mload(0x18c0), prod, f_q) + mstore(0x22a0, prod) + + prod := mulmod(mload(0x1900), prod, f_q) + mstore(0x22c0, prod) + + prod := mulmod(mload(0x1940), prod, f_q) + mstore(0x22e0, prod) + + prod := mulmod(mload(0x1980), prod, f_q) + mstore(0x2300, prod) + + prod := mulmod(mload(0x19c0), prod, f_q) + mstore(0x2320, prod) + + prod := mulmod(mload(0x1a00), prod, f_q) + mstore(0x2340, prod) + + prod := mulmod(mload(0x1a40), prod, f_q) + mstore(0x2360, prod) + + prod := mulmod(mload(0x1a80), prod, f_q) + mstore(0x2380, prod) + + prod := mulmod(mload(0x1ac0), prod, f_q) + mstore(0x23a0, prod) + + prod := mulmod(mload(0x1b00), prod, f_q) + mstore(0x23c0, prod) + + prod := mulmod(mload(0x1b40), prod, f_q) + mstore(0x23e0, prod) + + prod := mulmod(mload(0x1b80), prod, f_q) + mstore(0x2400, prod) + + prod := mulmod(mload(0x1bc0), prod, f_q) + mstore(0x2420, prod) + + prod := mulmod(mload(0x1c00), prod, f_q) + mstore(0x2440, prod) + + prod := mulmod(mload(0x1c40), prod, f_q) + mstore(0x2460, prod) + + prod := mulmod(mload(0x1c80), prod, f_q) + mstore(0x2480, prod) + + prod := mulmod(mload(0x1cc0), prod, f_q) + mstore(0x24a0, prod) + + prod := mulmod(mload(0x1d00), prod, f_q) + mstore(0x24c0, prod) + + prod := mulmod(mload(0x1d40), prod, f_q) + mstore(0x24e0, prod) + + prod := mulmod(mload(0x1d80), prod, f_q) + mstore(0x2500, prod) + + prod := mulmod(mload(0x1dc0), prod, f_q) + mstore(0x2520, prod) + + prod := mulmod(mload(0x1e00), prod, f_q) + mstore(0x2540, prod) + + prod := mulmod(mload(0x1e40), prod, f_q) + mstore(0x2560, prod) + + prod := mulmod(mload(0x1e80), prod, f_q) + mstore(0x2580, prod) + + prod := mulmod(mload(0x1ec0), prod, f_q) + mstore(0x25a0, prod) + + prod := mulmod(mload(0x1f00), prod, f_q) + mstore(0x25c0, prod) + + prod := mulmod(mload(0x1f40), prod, f_q) + mstore(0x25e0, prod) + + prod := mulmod(mload(0x1f80), prod, f_q) + mstore(0x2600, prod) + + prod := mulmod(mload(0x1220), prod, f_q) + mstore(0x2620, prod) + } + mstore(0x2660, 32) + mstore(0x2680, 32) + mstore(0x26a0, 32) + mstore(0x26c0, mload(0x2620)) + mstore(0x26e0, 21888242871839275222246405745257275088548364400416034343698204186575808495615) + mstore(0x2700, 21888242871839275222246405745257275088548364400416034343698204186575808495617) + success := and(eq(staticcall(gas(), 0x5, 0x2660, 0xc0, 0x2640, 0x20), 1), success) + { + let inv := mload(0x2640) + let v + + v := mload(0x1220) + mstore(4640, mulmod(mload(0x2600), inv, f_q)) + inv := mulmod(v, inv, f_q) + + v := mload(0x1f80) + mstore(8064, mulmod(mload(0x25e0), inv, f_q)) + inv := mulmod(v, inv, f_q) + + v := mload(0x1f40) + mstore(8000, mulmod(mload(0x25c0), inv, f_q)) + inv := mulmod(v, inv, f_q) + + v := mload(0x1f00) + mstore(7936, mulmod(mload(0x25a0), inv, f_q)) + inv := mulmod(v, inv, f_q) + + v := mload(0x1ec0) + mstore(7872, mulmod(mload(0x2580), inv, f_q)) + inv := mulmod(v, inv, f_q) + + v := mload(0x1e80) + mstore(7808, mulmod(mload(0x2560), inv, f_q)) + inv := mulmod(v, inv, f_q) + + v := mload(0x1e40) + mstore(7744, mulmod(mload(0x2540), inv, f_q)) + inv := mulmod(v, inv, f_q) + + v := mload(0x1e00) + mstore(7680, mulmod(mload(0x2520), inv, f_q)) + inv := mulmod(v, inv, f_q) + + v := mload(0x1dc0) + mstore(7616, mulmod(mload(0x2500), inv, f_q)) + inv := mulmod(v, inv, f_q) + + v := mload(0x1d80) + mstore(7552, mulmod(mload(0x24e0), inv, f_q)) + inv := mulmod(v, inv, f_q) + + v := mload(0x1d40) + mstore(7488, mulmod(mload(0x24c0), inv, f_q)) + inv := mulmod(v, inv, f_q) + + v := mload(0x1d00) + mstore(7424, mulmod(mload(0x24a0), inv, f_q)) + inv := mulmod(v, inv, f_q) + + v := mload(0x1cc0) + mstore(7360, mulmod(mload(0x2480), inv, f_q)) + inv := mulmod(v, inv, f_q) + + v := mload(0x1c80) + mstore(7296, mulmod(mload(0x2460), inv, f_q)) + inv := mulmod(v, inv, f_q) + + v := mload(0x1c40) + mstore(7232, mulmod(mload(0x2440), inv, f_q)) + inv := mulmod(v, inv, f_q) + + v := mload(0x1c00) + mstore(7168, mulmod(mload(0x2420), inv, f_q)) + inv := mulmod(v, inv, f_q) + + v := mload(0x1bc0) + mstore(7104, mulmod(mload(0x2400), inv, f_q)) + inv := mulmod(v, inv, f_q) + + v := mload(0x1b80) + mstore(7040, mulmod(mload(0x23e0), inv, f_q)) + inv := mulmod(v, inv, f_q) + + v := mload(0x1b40) + mstore(6976, mulmod(mload(0x23c0), inv, f_q)) + inv := mulmod(v, inv, f_q) + + v := mload(0x1b00) + mstore(6912, mulmod(mload(0x23a0), inv, f_q)) + inv := mulmod(v, inv, f_q) + + v := mload(0x1ac0) + mstore(6848, mulmod(mload(0x2380), inv, f_q)) + inv := mulmod(v, inv, f_q) + + v := mload(0x1a80) + mstore(6784, mulmod(mload(0x2360), inv, f_q)) + inv := mulmod(v, inv, f_q) + + v := mload(0x1a40) + mstore(6720, mulmod(mload(0x2340), inv, f_q)) + inv := mulmod(v, inv, f_q) + + v := mload(0x1a00) + mstore(6656, mulmod(mload(0x2320), inv, f_q)) + inv := mulmod(v, inv, f_q) + + v := mload(0x19c0) + mstore(6592, mulmod(mload(0x2300), inv, f_q)) + inv := mulmod(v, inv, f_q) + + v := mload(0x1980) + mstore(6528, mulmod(mload(0x22e0), inv, f_q)) + inv := mulmod(v, inv, f_q) + + v := mload(0x1940) + mstore(6464, mulmod(mload(0x22c0), inv, f_q)) + inv := mulmod(v, inv, f_q) + + v := mload(0x1900) + mstore(6400, mulmod(mload(0x22a0), inv, f_q)) + inv := mulmod(v, inv, f_q) + + v := mload(0x18c0) + mstore(6336, mulmod(mload(0x2280), inv, f_q)) + inv := mulmod(v, inv, f_q) + + v := mload(0x1880) + mstore(6272, mulmod(mload(0x2260), inv, f_q)) + inv := mulmod(v, inv, f_q) + + v := mload(0x1840) + mstore(6208, mulmod(mload(0x2240), inv, f_q)) + inv := mulmod(v, inv, f_q) + + v := mload(0x1800) + mstore(6144, mulmod(mload(0x2220), inv, f_q)) + inv := mulmod(v, inv, f_q) + + v := mload(0x17c0) + mstore(6080, mulmod(mload(0x2200), inv, f_q)) + inv := mulmod(v, inv, f_q) + + v := mload(0x1780) + mstore(6016, mulmod(mload(0x21e0), inv, f_q)) + inv := mulmod(v, inv, f_q) + + v := mload(0x1740) + mstore(5952, mulmod(mload(0x21c0), inv, f_q)) + inv := mulmod(v, inv, f_q) + + v := mload(0x1700) + mstore(5888, mulmod(mload(0x21a0), inv, f_q)) + inv := mulmod(v, inv, f_q) + + v := mload(0x16c0) + mstore(5824, mulmod(mload(0x2180), inv, f_q)) + inv := mulmod(v, inv, f_q) + + v := mload(0x1680) + mstore(5760, mulmod(mload(0x2160), inv, f_q)) + inv := mulmod(v, inv, f_q) + + v := mload(0x1640) + mstore(5696, mulmod(mload(0x2140), inv, f_q)) + inv := mulmod(v, inv, f_q) + + v := mload(0x1600) + mstore(5632, mulmod(mload(0x2120), inv, f_q)) + inv := mulmod(v, inv, f_q) + + v := mload(0x15c0) + mstore(5568, mulmod(mload(0x2100), inv, f_q)) + inv := mulmod(v, inv, f_q) + + v := mload(0x1580) + mstore(5504, mulmod(mload(0x20e0), inv, f_q)) + inv := mulmod(v, inv, f_q) + + v := mload(0x1540) + mstore(5440, mulmod(mload(0x20c0), inv, f_q)) + inv := mulmod(v, inv, f_q) + + v := mload(0x1500) + mstore(5376, mulmod(mload(0x20a0), inv, f_q)) + inv := mulmod(v, inv, f_q) + + v := mload(0x14c0) + mstore(5312, mulmod(mload(0x2080), inv, f_q)) + inv := mulmod(v, inv, f_q) + + v := mload(0x1480) + mstore(5248, mulmod(mload(0x2060), inv, f_q)) + inv := mulmod(v, inv, f_q) + + v := mload(0x1440) + mstore(5184, mulmod(mload(0x2040), inv, f_q)) + inv := mulmod(v, inv, f_q) + + v := mload(0x1400) + mstore(5120, mulmod(mload(0x2020), inv, f_q)) + inv := mulmod(v, inv, f_q) + + v := mload(0x13c0) + mstore(5056, mulmod(mload(0x2000), inv, f_q)) + inv := mulmod(v, inv, f_q) + + v := mload(0x1380) + mstore(4992, mulmod(mload(0x1fe0), inv, f_q)) + inv := mulmod(v, inv, f_q) + + v := mload(0x1340) + mstore(4928, mulmod(mload(0x1fc0), inv, f_q)) + inv := mulmod(v, inv, f_q) + + v := mload(0x1300) + mstore(4864, mulmod(mload(0x1fa0), inv, f_q)) + inv := mulmod(v, inv, f_q) + + v := mload(0x12c0) + mstore(4800, mulmod(mload(0x1280), inv, f_q)) + inv := mulmod(v, inv, f_q) + mstore(0x1280, inv) + } + mstore(0x2720, mulmod(mload(0x1260), mload(0x1280), f_q)) + mstore(0x2740, mulmod(mload(0x12a0), mload(0x12c0), f_q)) + mstore(0x2760, mulmod(mload(0x12e0), mload(0x1300), f_q)) + mstore(0x2780, mulmod(mload(0x1320), mload(0x1340), f_q)) + mstore(0x27a0, mulmod(mload(0x1360), mload(0x1380), f_q)) + mstore(0x27c0, mulmod(mload(0x13a0), mload(0x13c0), f_q)) + mstore(0x27e0, mulmod(mload(0x13e0), mload(0x1400), f_q)) + mstore(0x2800, mulmod(mload(0x1420), mload(0x1440), f_q)) + mstore(0x2820, mulmod(mload(0x1460), mload(0x1480), f_q)) + mstore(0x2840, mulmod(mload(0x14a0), mload(0x14c0), f_q)) + mstore(0x2860, mulmod(mload(0x14e0), mload(0x1500), f_q)) + mstore(0x2880, mulmod(mload(0x1520), mload(0x1540), f_q)) + mstore(0x28a0, mulmod(mload(0x1560), mload(0x1580), f_q)) + mstore(0x28c0, mulmod(mload(0x15a0), mload(0x15c0), f_q)) + mstore(0x28e0, mulmod(mload(0x15e0), mload(0x1600), f_q)) + mstore(0x2900, mulmod(mload(0x1620), mload(0x1640), f_q)) + mstore(0x2920, mulmod(mload(0x1660), mload(0x1680), f_q)) + mstore(0x2940, mulmod(mload(0x16a0), mload(0x16c0), f_q)) + mstore(0x2960, mulmod(mload(0x16e0), mload(0x1700), f_q)) + mstore(0x2980, mulmod(mload(0x1720), mload(0x1740), f_q)) + mstore(0x29a0, mulmod(mload(0x1760), mload(0x1780), f_q)) + mstore(0x29c0, mulmod(mload(0x17a0), mload(0x17c0), f_q)) + mstore(0x29e0, mulmod(mload(0x17e0), mload(0x1800), f_q)) + mstore(0x2a00, mulmod(mload(0x1820), mload(0x1840), f_q)) + mstore(0x2a20, mulmod(mload(0x1860), mload(0x1880), f_q)) + mstore(0x2a40, mulmod(mload(0x18a0), mload(0x18c0), f_q)) + mstore(0x2a60, mulmod(mload(0x18e0), mload(0x1900), f_q)) + mstore(0x2a80, mulmod(mload(0x1920), mload(0x1940), f_q)) + mstore(0x2aa0, mulmod(mload(0x1960), mload(0x1980), f_q)) + mstore(0x2ac0, mulmod(mload(0x19a0), mload(0x19c0), f_q)) + mstore(0x2ae0, mulmod(mload(0x19e0), mload(0x1a00), f_q)) + mstore(0x2b00, mulmod(mload(0x1a20), mload(0x1a40), f_q)) + mstore(0x2b20, mulmod(mload(0x1a60), mload(0x1a80), f_q)) + mstore(0x2b40, mulmod(mload(0x1aa0), mload(0x1ac0), f_q)) + mstore(0x2b60, mulmod(mload(0x1ae0), mload(0x1b00), f_q)) + mstore(0x2b80, mulmod(mload(0x1b20), mload(0x1b40), f_q)) + mstore(0x2ba0, mulmod(mload(0x1b60), mload(0x1b80), f_q)) + mstore(0x2bc0, mulmod(mload(0x1ba0), mload(0x1bc0), f_q)) + mstore(0x2be0, mulmod(mload(0x1be0), mload(0x1c00), f_q)) + mstore(0x2c00, mulmod(mload(0x1c20), mload(0x1c40), f_q)) + mstore(0x2c20, mulmod(mload(0x1c60), mload(0x1c80), f_q)) + mstore(0x2c40, mulmod(mload(0x1ca0), mload(0x1cc0), f_q)) + mstore(0x2c60, mulmod(mload(0x1ce0), mload(0x1d00), f_q)) + mstore(0x2c80, mulmod(mload(0x1d20), mload(0x1d40), f_q)) + mstore(0x2ca0, mulmod(mload(0x1d60), mload(0x1d80), f_q)) + mstore(0x2cc0, mulmod(mload(0x1da0), mload(0x1dc0), f_q)) + mstore(0x2ce0, mulmod(mload(0x1de0), mload(0x1e00), f_q)) + mstore(0x2d00, mulmod(mload(0x1e20), mload(0x1e40), f_q)) + mstore(0x2d20, mulmod(mload(0x1e60), mload(0x1e80), f_q)) + mstore(0x2d40, mulmod(mload(0x1ea0), mload(0x1ec0), f_q)) + mstore(0x2d60, mulmod(mload(0x1ee0), mload(0x1f00), f_q)) + mstore(0x2d80, mulmod(mload(0x1f20), mload(0x1f40), f_q)) + mstore(0x2da0, mulmod(mload(0x1f60), mload(0x1f80), f_q)) + { + let result := mulmod(mload(0x2800), mload(0xa0), f_q) + result := addmod(mulmod(mload(0x2820), mload(0xc0), f_q), result, f_q) + result := addmod(mulmod(mload(0x2840), mload(0xe0), f_q), result, f_q) + result := addmod(mulmod(mload(0x2860), mload(0x100), f_q), result, f_q) + result := addmod(mulmod(mload(0x2880), mload(0x120), f_q), result, f_q) + result := addmod(mulmod(mload(0x28a0), mload(0x140), f_q), result, f_q) + result := addmod(mulmod(mload(0x28c0), mload(0x160), f_q), result, f_q) + result := addmod(mulmod(mload(0x28e0), mload(0x180), f_q), result, f_q) + result := addmod(mulmod(mload(0x2900), mload(0x1a0), f_q), result, f_q) + result := addmod(mulmod(mload(0x2920), mload(0x1c0), f_q), result, f_q) + result := addmod(mulmod(mload(0x2940), mload(0x1e0), f_q), result, f_q) + result := addmod(mulmod(mload(0x2960), mload(0x200), f_q), result, f_q) + result := addmod(mulmod(mload(0x2980), mload(0x220), f_q), result, f_q) + result := addmod(mulmod(mload(0x29a0), mload(0x240), f_q), result, f_q) + result := addmod(mulmod(mload(0x29c0), mload(0x260), f_q), result, f_q) + result := addmod(mulmod(mload(0x29e0), mload(0x280), f_q), result, f_q) + result := addmod(mulmod(mload(0x2a00), mload(0x2a0), f_q), result, f_q) + result := addmod(mulmod(mload(0x2a20), mload(0x2c0), f_q), result, f_q) + result := addmod(mulmod(mload(0x2a40), mload(0x2e0), f_q), result, f_q) + result := addmod(mulmod(mload(0x2a60), mload(0x300), f_q), result, f_q) + result := addmod(mulmod(mload(0x2a80), mload(0x320), f_q), result, f_q) + result := addmod(mulmod(mload(0x2aa0), mload(0x340), f_q), result, f_q) + result := addmod(mulmod(mload(0x2ac0), mload(0x360), f_q), result, f_q) + result := addmod(mulmod(mload(0x2ae0), mload(0x380), f_q), result, f_q) + result := addmod(mulmod(mload(0x2b00), mload(0x3a0), f_q), result, f_q) + result := addmod(mulmod(mload(0x2b20), mload(0x3c0), f_q), result, f_q) + result := addmod(mulmod(mload(0x2b40), mload(0x3e0), f_q), result, f_q) + result := addmod(mulmod(mload(0x2b60), mload(0x400), f_q), result, f_q) + result := addmod(mulmod(mload(0x2b80), mload(0x420), f_q), result, f_q) + result := addmod(mulmod(mload(0x2ba0), mload(0x440), f_q), result, f_q) + result := addmod(mulmod(mload(0x2bc0), mload(0x460), f_q), result, f_q) + result := addmod(mulmod(mload(0x2be0), mload(0x480), f_q), result, f_q) + result := addmod(mulmod(mload(0x2c00), mload(0x4a0), f_q), result, f_q) + result := addmod(mulmod(mload(0x2c20), mload(0x4c0), f_q), result, f_q) + result := addmod(mulmod(mload(0x2c40), mload(0x4e0), f_q), result, f_q) + result := addmod(mulmod(mload(0x2c60), mload(0x500), f_q), result, f_q) + result := addmod(mulmod(mload(0x2c80), mload(0x520), f_q), result, f_q) + result := addmod(mulmod(mload(0x2ca0), mload(0x540), f_q), result, f_q) + result := addmod(mulmod(mload(0x2cc0), mload(0x560), f_q), result, f_q) + result := addmod(mulmod(mload(0x2ce0), mload(0x580), f_q), result, f_q) + result := addmod(mulmod(mload(0x2d00), mload(0x5a0), f_q), result, f_q) + result := addmod(mulmod(mload(0x2d20), mload(0x5c0), f_q), result, f_q) + result := addmod(mulmod(mload(0x2d40), mload(0x5e0), f_q), result, f_q) + result := addmod(mulmod(mload(0x2d60), mload(0x600), f_q), result, f_q) + result := addmod(mulmod(mload(0x2d80), mload(0x620), f_q), result, f_q) + result := addmod(mulmod(mload(0x2da0), mload(0x640), f_q), result, f_q) + mstore(11712, result) + } + mstore(0x2de0, mulmod(mload(0xb00), mload(0xae0), f_q)) + mstore(0x2e00, addmod(mload(0xac0), mload(0x2de0), f_q)) + mstore(0x2e20, addmod(mload(0x2e00), sub(f_q, mload(0xb20)), f_q)) + mstore(0x2e40, mulmod(mload(0x2e20), mload(0xb80), f_q)) + mstore(0x2e60, mulmod(mload(0x920), mload(0x2e40), f_q)) + mstore(0x2e80, addmod(1, sub(f_q, mload(0xc40)), f_q)) + mstore(0x2ea0, mulmod(mload(0x2e80), mload(0x2800), f_q)) + mstore(0x2ec0, addmod(mload(0x2e60), mload(0x2ea0), f_q)) + mstore(0x2ee0, mulmod(mload(0x920), mload(0x2ec0), f_q)) + mstore(0x2f00, mulmod(mload(0xc40), mload(0xc40), f_q)) + mstore(0x2f20, addmod(mload(0x2f00), sub(f_q, mload(0xc40)), f_q)) + mstore(0x2f40, mulmod(mload(0x2f20), mload(0x2720), f_q)) + mstore(0x2f60, addmod(mload(0x2ee0), mload(0x2f40), f_q)) + mstore(0x2f80, mulmod(mload(0x920), mload(0x2f60), f_q)) + mstore(0x2fa0, addmod(1, sub(f_q, mload(0x2720)), f_q)) + mstore(0x2fc0, addmod(mload(0x2740), mload(0x2760), f_q)) + mstore(0x2fe0, addmod(mload(0x2fc0), mload(0x2780), f_q)) + mstore(0x3000, addmod(mload(0x2fe0), mload(0x27a0), f_q)) + mstore(0x3020, addmod(mload(0x3000), mload(0x27c0), f_q)) + mstore(0x3040, addmod(mload(0x3020), mload(0x27e0), f_q)) + mstore(0x3060, addmod(mload(0x2fa0), sub(f_q, mload(0x3040)), f_q)) + mstore(0x3080, mulmod(mload(0xbe0), mload(0x7a0), f_q)) + mstore(0x30a0, addmod(mload(0xb40), mload(0x3080), f_q)) + mstore(0x30c0, addmod(mload(0x30a0), mload(0x800), f_q)) + mstore(0x30e0, mulmod(mload(0xc00), mload(0x7a0), f_q)) + mstore(0x3100, addmod(mload(0xac0), mload(0x30e0), f_q)) + mstore(0x3120, addmod(mload(0x3100), mload(0x800), f_q)) + mstore(0x3140, mulmod(mload(0x3120), mload(0x30c0), f_q)) + mstore(0x3160, mulmod(mload(0xc20), mload(0x7a0), f_q)) + mstore(0x3180, addmod(mload(0x2dc0), mload(0x3160), f_q)) + mstore(0x31a0, addmod(mload(0x3180), mload(0x800), f_q)) + mstore(0x31c0, mulmod(mload(0x31a0), mload(0x3140), f_q)) + mstore(0x31e0, mulmod(mload(0x31c0), mload(0xc60), f_q)) + mstore(0x3200, mulmod(1, mload(0x7a0), f_q)) + mstore(0x3220, mulmod(mload(0xa80), mload(0x3200), f_q)) + mstore(0x3240, addmod(mload(0xb40), mload(0x3220), f_q)) + mstore(0x3260, addmod(mload(0x3240), mload(0x800), f_q)) + mstore( + 0x3280, + mulmod(4131629893567559867359510883348571134090853742863529169391034518566172092834, mload(0x7a0), f_q) + ) + mstore(0x32a0, mulmod(mload(0xa80), mload(0x3280), f_q)) + mstore(0x32c0, addmod(mload(0xac0), mload(0x32a0), f_q)) + mstore(0x32e0, addmod(mload(0x32c0), mload(0x800), f_q)) + mstore(0x3300, mulmod(mload(0x32e0), mload(0x3260), f_q)) + mstore( + 0x3320, + mulmod(8910878055287538404433155982483128285667088683464058436815641868457422632747, mload(0x7a0), f_q) + ) + mstore(0x3340, mulmod(mload(0xa80), mload(0x3320), f_q)) + mstore(0x3360, addmod(mload(0x2dc0), mload(0x3340), f_q)) + mstore(0x3380, addmod(mload(0x3360), mload(0x800), f_q)) + mstore(0x33a0, mulmod(mload(0x3380), mload(0x3300), f_q)) + mstore(0x33c0, mulmod(mload(0x33a0), mload(0xc40), f_q)) + mstore(0x33e0, addmod(mload(0x31e0), sub(f_q, mload(0x33c0)), f_q)) + mstore(0x3400, mulmod(mload(0x33e0), mload(0x3060), f_q)) + mstore(0x3420, addmod(mload(0x2f80), mload(0x3400), f_q)) + mstore(0x3440, mulmod(mload(0x920), mload(0x3420), f_q)) + mstore(0x3460, addmod(1, sub(f_q, mload(0xc80)), f_q)) + mstore(0x3480, mulmod(mload(0x3460), mload(0x2800), f_q)) + mstore(0x34a0, addmod(mload(0x3440), mload(0x3480), f_q)) + mstore(0x34c0, mulmod(mload(0x920), mload(0x34a0), f_q)) + mstore(0x34e0, mulmod(mload(0xc80), mload(0xc80), f_q)) + mstore(0x3500, addmod(mload(0x34e0), sub(f_q, mload(0xc80)), f_q)) + mstore(0x3520, mulmod(mload(0x3500), mload(0x2720), f_q)) + mstore(0x3540, addmod(mload(0x34c0), mload(0x3520), f_q)) + mstore(0x3560, mulmod(mload(0x920), mload(0x3540), f_q)) + mstore(0x3580, addmod(mload(0xcc0), mload(0x7a0), f_q)) + mstore(0x35a0, mulmod(mload(0x3580), mload(0xca0), f_q)) + mstore(0x35c0, addmod(mload(0xd00), mload(0x800), f_q)) + mstore(0x35e0, mulmod(mload(0x35c0), mload(0x35a0), f_q)) + mstore(0x3600, mulmod(mload(0xac0), mload(0xba0), f_q)) + mstore(0x3620, addmod(mload(0x3600), mload(0x7a0), f_q)) + mstore(0x3640, mulmod(mload(0x3620), mload(0xc80), f_q)) + mstore(0x3660, addmod(mload(0xb60), mload(0x800), f_q)) + mstore(0x3680, mulmod(mload(0x3660), mload(0x3640), f_q)) + mstore(0x36a0, addmod(mload(0x35e0), sub(f_q, mload(0x3680)), f_q)) + mstore(0x36c0, mulmod(mload(0x36a0), mload(0x3060), f_q)) + mstore(0x36e0, addmod(mload(0x3560), mload(0x36c0), f_q)) + mstore(0x3700, mulmod(mload(0x920), mload(0x36e0), f_q)) + mstore(0x3720, addmod(mload(0xcc0), sub(f_q, mload(0xd00)), f_q)) + mstore(0x3740, mulmod(mload(0x3720), mload(0x2800), f_q)) + mstore(0x3760, addmod(mload(0x3700), mload(0x3740), f_q)) + mstore(0x3780, mulmod(mload(0x920), mload(0x3760), f_q)) + mstore(0x37a0, mulmod(mload(0x3720), mload(0x3060), f_q)) + mstore(0x37c0, addmod(mload(0xcc0), sub(f_q, mload(0xce0)), f_q)) + mstore(0x37e0, mulmod(mload(0x37c0), mload(0x37a0), f_q)) + mstore(0x3800, addmod(mload(0x3780), mload(0x37e0), f_q)) + mstore(0x3820, mulmod(mload(0x1200), mload(0x1200), f_q)) + mstore(0x3840, mulmod(mload(0x3820), mload(0x1200), f_q)) + mstore(0x3860, mulmod(mload(0x3840), mload(0x1200), f_q)) + mstore(0x3880, mulmod(1, mload(0x1200), f_q)) + mstore(0x38a0, mulmod(1, mload(0x3820), f_q)) + mstore(0x38c0, mulmod(1, mload(0x3840), f_q)) + mstore(0x38e0, mulmod(mload(0x3800), mload(0x1220), f_q)) + mstore(0x3900, mulmod(mload(0xf40), mload(0xa80), f_q)) + mstore(0x3920, mulmod(mload(0x3900), mload(0xa80), f_q)) + mstore( + 0x3940, + mulmod(mload(0xa80), 9741553891420464328295280489650144566903017206473301385034033384879943874347, f_q) + ) + mstore(0x3960, addmod(mload(0xe40), sub(f_q, mload(0x3940)), f_q)) + mstore(0x3980, mulmod(mload(0xa80), 1, f_q)) + mstore(0x39a0, addmod(mload(0xe40), sub(f_q, mload(0x3980)), f_q)) + mstore( + 0x39c0, + mulmod(mload(0xa80), 8374374965308410102411073611984011876711565317741801500439755773472076597347, f_q) + ) + mstore(0x39e0, addmod(mload(0xe40), sub(f_q, mload(0x39c0)), f_q)) + mstore( + 0x3a00, + mulmod(mload(0xa80), 11211301017135681023579411905410872569206244553457844956874280139879520583390, f_q) + ) + mstore(0x3a20, addmod(mload(0xe40), sub(f_q, mload(0x3a00)), f_q)) + mstore( + 0x3a40, + mulmod(mload(0xa80), 3615478808282855240548287271348143516886772452944084747768312988864436725401, f_q) + ) + mstore(0x3a60, addmod(mload(0xe40), sub(f_q, mload(0x3a40)), f_q)) + mstore( + 0x3a80, + mulmod( + 13213688729882003894512633350385593288217014177373218494356903340348818451480, mload(0x3900), f_q + ) + ) + mstore(0x3aa0, mulmod(mload(0x3a80), 1, f_q)) + { + let result := mulmod(mload(0xe40), mload(0x3a80), f_q) + result := addmod(mulmod(mload(0xa80), sub(f_q, mload(0x3aa0)), f_q), result, f_q) + mstore(15040, result) + } + mstore( + 0x3ae0, + mulmod(8207090019724696496350398458716998472718344609680392612601596849934418295470, mload(0x3900), f_q) + ) + mstore( + 0x3b00, + mulmod(mload(0x3ae0), 8374374965308410102411073611984011876711565317741801500439755773472076597347, f_q) + ) + { + let result := mulmod(mload(0xe40), mload(0x3ae0), f_q) + result := addmod(mulmod(mload(0xa80), sub(f_q, mload(0x3b00)), f_q), result, f_q) + mstore(15136, result) + } + mstore( + 0x3b40, + mulmod(7391709068497399131897422873231908718558236401035363928063603272120120747483, mload(0x3900), f_q) + ) + mstore( + 0x3b60, + mulmod( + mload(0x3b40), 11211301017135681023579411905410872569206244553457844956874280139879520583390, f_q + ) + ) + { + let result := mulmod(mload(0xe40), mload(0x3b40), f_q) + result := addmod(mulmod(mload(0xa80), sub(f_q, mload(0x3b60)), f_q), result, f_q) + mstore(15232, result) + } + mstore( + 0x3ba0, + mulmod( + 19036273796805830823244991598792794567595348772040298280440552631112242221017, mload(0x3900), f_q + ) + ) + mstore( + 0x3bc0, + mulmod(mload(0x3ba0), 3615478808282855240548287271348143516886772452944084747768312988864436725401, f_q) + ) + { + let result := mulmod(mload(0xe40), mload(0x3ba0), f_q) + result := addmod(mulmod(mload(0xa80), sub(f_q, mload(0x3bc0)), f_q), result, f_q) + mstore(15328, result) + } + mstore(0x3c00, mulmod(1, mload(0x39a0), f_q)) + mstore(0x3c20, mulmod(mload(0x3c00), mload(0x39e0), f_q)) + mstore(0x3c40, mulmod(mload(0x3c20), mload(0x3a20), f_q)) + mstore(0x3c60, mulmod(mload(0x3c40), mload(0x3a60), f_q)) + mstore( + 0x3c80, + mulmod(13513867906530865119835332133273263211836799082674232843258448413103731898271, mload(0xa80), f_q) + ) + mstore(0x3ca0, mulmod(mload(0x3c80), 1, f_q)) + { + let result := mulmod(mload(0xe40), mload(0x3c80), f_q) + result := addmod(mulmod(mload(0xa80), sub(f_q, mload(0x3ca0)), f_q), result, f_q) + mstore(15552, result) + } + mstore( + 0x3ce0, + mulmod(8374374965308410102411073611984011876711565317741801500439755773472076597346, mload(0xa80), f_q) + ) + mstore( + 0x3d00, + mulmod(mload(0x3ce0), 8374374965308410102411073611984011876711565317741801500439755773472076597347, f_q) + ) + { + let result := mulmod(mload(0xe40), mload(0x3ce0), f_q) + result := addmod(mulmod(mload(0xa80), sub(f_q, mload(0x3d00)), f_q), result, f_q) + mstore(15648, result) + } + mstore( + 0x3d40, + mulmod(12146688980418810893951125255607130521645347193942732958664170801695864621271, mload(0xa80), f_q) + ) + mstore(0x3d60, mulmod(mload(0x3d40), 1, f_q)) + { + let result := mulmod(mload(0xe40), mload(0x3d40), f_q) + result := addmod(mulmod(mload(0xa80), sub(f_q, mload(0x3d60)), f_q), result, f_q) + mstore(15744, result) + } + mstore( + 0x3da0, + mulmod(9741553891420464328295280489650144566903017206473301385034033384879943874346, mload(0xa80), f_q) + ) + mstore( + 0x3dc0, + mulmod(mload(0x3da0), 9741553891420464328295280489650144566903017206473301385034033384879943874347, f_q) + ) + { + let result := mulmod(mload(0xe40), mload(0x3da0), f_q) + result := addmod(mulmod(mload(0xa80), sub(f_q, mload(0x3dc0)), f_q), result, f_q) + mstore(15840, result) + } + mstore(0x3e00, mulmod(mload(0x3c00), mload(0x3960), f_q)) + { + let result := mulmod(mload(0xe40), 1, f_q) + result := + addmod( + mulmod( + mload(0xa80), 21888242871839275222246405745257275088548364400416034343698204186575808495616, f_q + ), + result, + f_q + ) + mstore(15904, result) + } + { + let prod := mload(0x3ac0) + + prod := mulmod(mload(0x3b20), prod, f_q) + mstore(0x3e40, prod) + + prod := mulmod(mload(0x3b80), prod, f_q) + mstore(0x3e60, prod) + + prod := mulmod(mload(0x3be0), prod, f_q) + mstore(0x3e80, prod) + + prod := mulmod(mload(0x3cc0), prod, f_q) + mstore(0x3ea0, prod) + + prod := mulmod(mload(0x3d20), prod, f_q) + mstore(0x3ec0, prod) + + prod := mulmod(mload(0x3c20), prod, f_q) + mstore(0x3ee0, prod) + + prod := mulmod(mload(0x3d80), prod, f_q) + mstore(0x3f00, prod) + + prod := mulmod(mload(0x3de0), prod, f_q) + mstore(0x3f20, prod) + + prod := mulmod(mload(0x3e00), prod, f_q) + mstore(0x3f40, prod) + + prod := mulmod(mload(0x3e20), prod, f_q) + mstore(0x3f60, prod) + + prod := mulmod(mload(0x3c00), prod, f_q) + mstore(0x3f80, prod) + } + mstore(0x3fc0, 32) + mstore(0x3fe0, 32) + mstore(0x4000, 32) + mstore(0x4020, mload(0x3f80)) + mstore(0x4040, 21888242871839275222246405745257275088548364400416034343698204186575808495615) + mstore(0x4060, 21888242871839275222246405745257275088548364400416034343698204186575808495617) + success := and(eq(staticcall(gas(), 0x5, 0x3fc0, 0xc0, 0x3fa0, 0x20), 1), success) + { + let inv := mload(0x3fa0) + let v + + v := mload(0x3c00) + mstore(15360, mulmod(mload(0x3f60), inv, f_q)) + inv := mulmod(v, inv, f_q) + + v := mload(0x3e20) + mstore(15904, mulmod(mload(0x3f40), inv, f_q)) + inv := mulmod(v, inv, f_q) + + v := mload(0x3e00) + mstore(15872, mulmod(mload(0x3f20), inv, f_q)) + inv := mulmod(v, inv, f_q) + + v := mload(0x3de0) + mstore(15840, mulmod(mload(0x3f00), inv, f_q)) + inv := mulmod(v, inv, f_q) + + v := mload(0x3d80) + mstore(15744, mulmod(mload(0x3ee0), inv, f_q)) + inv := mulmod(v, inv, f_q) + + v := mload(0x3c20) + mstore(15392, mulmod(mload(0x3ec0), inv, f_q)) + inv := mulmod(v, inv, f_q) + + v := mload(0x3d20) + mstore(15648, mulmod(mload(0x3ea0), inv, f_q)) + inv := mulmod(v, inv, f_q) + + v := mload(0x3cc0) + mstore(15552, mulmod(mload(0x3e80), inv, f_q)) + inv := mulmod(v, inv, f_q) + + v := mload(0x3be0) + mstore(15328, mulmod(mload(0x3e60), inv, f_q)) + inv := mulmod(v, inv, f_q) + + v := mload(0x3b80) + mstore(15232, mulmod(mload(0x3e40), inv, f_q)) + inv := mulmod(v, inv, f_q) + + v := mload(0x3b20) + mstore(15136, mulmod(mload(0x3ac0), inv, f_q)) + inv := mulmod(v, inv, f_q) + mstore(0x3ac0, inv) + } + { + let result := mload(0x3ac0) + result := addmod(mload(0x3b20), result, f_q) + result := addmod(mload(0x3b80), result, f_q) + result := addmod(mload(0x3be0), result, f_q) + mstore(16512, result) + } + mstore(0x40a0, mulmod(mload(0x3c60), mload(0x3c20), f_q)) + { + let result := mload(0x3cc0) + result := addmod(mload(0x3d20), result, f_q) + mstore(16576, result) + } + mstore(0x40e0, mulmod(mload(0x3c60), mload(0x3e00), f_q)) + { + let result := mload(0x3d80) + result := addmod(mload(0x3de0), result, f_q) + mstore(16640, result) + } + mstore(0x4120, mulmod(mload(0x3c60), mload(0x3c00), f_q)) + { + let result := mload(0x3e20) + mstore(16704, result) + } + { + let prod := mload(0x4080) + + prod := mulmod(mload(0x40c0), prod, f_q) + mstore(0x4160, prod) + + prod := mulmod(mload(0x4100), prod, f_q) + mstore(0x4180, prod) + + prod := mulmod(mload(0x4140), prod, f_q) + mstore(0x41a0, prod) + } + mstore(0x41e0, 32) + mstore(0x4200, 32) + mstore(0x4220, 32) + mstore(0x4240, mload(0x41a0)) + mstore(0x4260, 21888242871839275222246405745257275088548364400416034343698204186575808495615) + mstore(0x4280, 21888242871839275222246405745257275088548364400416034343698204186575808495617) + success := and(eq(staticcall(gas(), 0x5, 0x41e0, 0xc0, 0x41c0, 0x20), 1), success) + { + let inv := mload(0x41c0) + let v + + v := mload(0x4140) + mstore(16704, mulmod(mload(0x4180), inv, f_q)) + inv := mulmod(v, inv, f_q) + + v := mload(0x4100) + mstore(16640, mulmod(mload(0x4160), inv, f_q)) + inv := mulmod(v, inv, f_q) + + v := mload(0x40c0) + mstore(16576, mulmod(mload(0x4080), inv, f_q)) + inv := mulmod(v, inv, f_q) + mstore(0x4080, inv) + } + mstore(0x42a0, mulmod(mload(0x40a0), mload(0x40c0), f_q)) + mstore(0x42c0, mulmod(mload(0x40e0), mload(0x4100), f_q)) + mstore(0x42e0, mulmod(mload(0x4120), mload(0x4140), f_q)) + mstore(0x4300, mulmod(mload(0xd40), mload(0xd40), f_q)) + mstore(0x4320, mulmod(mload(0x4300), mload(0xd40), f_q)) + mstore(0x4340, mulmod(mload(0x4320), mload(0xd40), f_q)) + mstore(0x4360, mulmod(mload(0x4340), mload(0xd40), f_q)) + mstore(0x4380, mulmod(mload(0x4360), mload(0xd40), f_q)) + mstore(0x43a0, mulmod(mload(0x4380), mload(0xd40), f_q)) + mstore(0x43c0, mulmod(mload(0x43a0), mload(0xd40), f_q)) + mstore(0x43e0, mulmod(mload(0x43c0), mload(0xd40), f_q)) + mstore(0x4400, mulmod(mload(0x43e0), mload(0xd40), f_q)) + mstore(0x4420, mulmod(mload(0xda0), mload(0xda0), f_q)) + mstore(0x4440, mulmod(mload(0x4420), mload(0xda0), f_q)) + mstore(0x4460, mulmod(mload(0x4440), mload(0xda0), f_q)) + { + let result := mulmod(mload(0xac0), mload(0x3ac0), f_q) + result := addmod(mulmod(mload(0xae0), mload(0x3b20), f_q), result, f_q) + result := addmod(mulmod(mload(0xb00), mload(0x3b80), f_q), result, f_q) + result := addmod(mulmod(mload(0xb20), mload(0x3be0), f_q), result, f_q) + mstore(17536, result) + } + mstore(0x44a0, mulmod(mload(0x4480), mload(0x4080), f_q)) + mstore(0x44c0, mulmod(sub(f_q, mload(0x44a0)), 1, f_q)) + mstore(0x44e0, mulmod(mload(0x44c0), 1, f_q)) + mstore(0x4500, mulmod(1, mload(0x40a0), f_q)) + { + let result := mulmod(mload(0xc40), mload(0x3cc0), f_q) + result := addmod(mulmod(mload(0xc60), mload(0x3d20), f_q), result, f_q) + mstore(17696, result) + } + mstore(0x4540, mulmod(mload(0x4520), mload(0x42a0), f_q)) + mstore(0x4560, mulmod(sub(f_q, mload(0x4540)), 1, f_q)) + mstore(0x4580, mulmod(mload(0x4500), 1, f_q)) + { + let result := mulmod(mload(0xc80), mload(0x3cc0), f_q) + result := addmod(mulmod(mload(0xca0), mload(0x3d20), f_q), result, f_q) + mstore(17824, result) + } + mstore(0x45c0, mulmod(mload(0x45a0), mload(0x42a0), f_q)) + mstore(0x45e0, mulmod(sub(f_q, mload(0x45c0)), mload(0xd40), f_q)) + mstore(0x4600, mulmod(mload(0x4500), mload(0xd40), f_q)) + mstore(0x4620, addmod(mload(0x4560), mload(0x45e0), f_q)) + mstore(0x4640, mulmod(mload(0x4620), mload(0xda0), f_q)) + mstore(0x4660, mulmod(mload(0x4580), mload(0xda0), f_q)) + mstore(0x4680, mulmod(mload(0x4600), mload(0xda0), f_q)) + mstore(0x46a0, addmod(mload(0x44e0), mload(0x4640), f_q)) + mstore(0x46c0, mulmod(1, mload(0x40e0), f_q)) + { + let result := mulmod(mload(0xcc0), mload(0x3d80), f_q) + result := addmod(mulmod(mload(0xce0), mload(0x3de0), f_q), result, f_q) + mstore(18144, result) + } + mstore(0x4700, mulmod(mload(0x46e0), mload(0x42c0), f_q)) + mstore(0x4720, mulmod(sub(f_q, mload(0x4700)), 1, f_q)) + mstore(0x4740, mulmod(mload(0x46c0), 1, f_q)) + mstore(0x4760, mulmod(mload(0x4720), mload(0x4420), f_q)) + mstore(0x4780, mulmod(mload(0x4740), mload(0x4420), f_q)) + mstore(0x47a0, addmod(mload(0x46a0), mload(0x4760), f_q)) + mstore(0x47c0, mulmod(1, mload(0x4120), f_q)) + { + let result := mulmod(mload(0xd00), mload(0x3e20), f_q) + mstore(18400, result) + } + mstore(0x4800, mulmod(mload(0x47e0), mload(0x42e0), f_q)) + mstore(0x4820, mulmod(sub(f_q, mload(0x4800)), 1, f_q)) + mstore(0x4840, mulmod(mload(0x47c0), 1, f_q)) + { + let result := mulmod(mload(0xb40), mload(0x3e20), f_q) + mstore(18528, result) + } + mstore(0x4880, mulmod(mload(0x4860), mload(0x42e0), f_q)) + mstore(0x48a0, mulmod(sub(f_q, mload(0x4880)), mload(0xd40), f_q)) + mstore(0x48c0, mulmod(mload(0x47c0), mload(0xd40), f_q)) + mstore(0x48e0, addmod(mload(0x4820), mload(0x48a0), f_q)) + { + let result := mulmod(mload(0xb60), mload(0x3e20), f_q) + mstore(18688, result) + } + mstore(0x4920, mulmod(mload(0x4900), mload(0x42e0), f_q)) + mstore(0x4940, mulmod(sub(f_q, mload(0x4920)), mload(0x4300), f_q)) + mstore(0x4960, mulmod(mload(0x47c0), mload(0x4300), f_q)) + mstore(0x4980, addmod(mload(0x48e0), mload(0x4940), f_q)) + { + let result := mulmod(mload(0xb80), mload(0x3e20), f_q) + mstore(18848, result) + } + mstore(0x49c0, mulmod(mload(0x49a0), mload(0x42e0), f_q)) + mstore(0x49e0, mulmod(sub(f_q, mload(0x49c0)), mload(0x4320), f_q)) + mstore(0x4a00, mulmod(mload(0x47c0), mload(0x4320), f_q)) + mstore(0x4a20, addmod(mload(0x4980), mload(0x49e0), f_q)) + { + let result := mulmod(mload(0xba0), mload(0x3e20), f_q) + mstore(19008, result) + } + mstore(0x4a60, mulmod(mload(0x4a40), mload(0x42e0), f_q)) + mstore(0x4a80, mulmod(sub(f_q, mload(0x4a60)), mload(0x4340), f_q)) + mstore(0x4aa0, mulmod(mload(0x47c0), mload(0x4340), f_q)) + mstore(0x4ac0, addmod(mload(0x4a20), mload(0x4a80), f_q)) + { + let result := mulmod(mload(0xbe0), mload(0x3e20), f_q) + mstore(19168, result) + } + mstore(0x4b00, mulmod(mload(0x4ae0), mload(0x42e0), f_q)) + mstore(0x4b20, mulmod(sub(f_q, mload(0x4b00)), mload(0x4360), f_q)) + mstore(0x4b40, mulmod(mload(0x47c0), mload(0x4360), f_q)) + mstore(0x4b60, addmod(mload(0x4ac0), mload(0x4b20), f_q)) + { + let result := mulmod(mload(0xc00), mload(0x3e20), f_q) + mstore(19328, result) + } + mstore(0x4ba0, mulmod(mload(0x4b80), mload(0x42e0), f_q)) + mstore(0x4bc0, mulmod(sub(f_q, mload(0x4ba0)), mload(0x4380), f_q)) + mstore(0x4be0, mulmod(mload(0x47c0), mload(0x4380), f_q)) + mstore(0x4c00, addmod(mload(0x4b60), mload(0x4bc0), f_q)) + { + let result := mulmod(mload(0xc20), mload(0x3e20), f_q) + mstore(19488, result) + } + mstore(0x4c40, mulmod(mload(0x4c20), mload(0x42e0), f_q)) + mstore(0x4c60, mulmod(sub(f_q, mload(0x4c40)), mload(0x43a0), f_q)) + mstore(0x4c80, mulmod(mload(0x47c0), mload(0x43a0), f_q)) + mstore(0x4ca0, addmod(mload(0x4c00), mload(0x4c60), f_q)) + mstore(0x4cc0, mulmod(mload(0x3880), mload(0x4120), f_q)) + mstore(0x4ce0, mulmod(mload(0x38a0), mload(0x4120), f_q)) + mstore(0x4d00, mulmod(mload(0x38c0), mload(0x4120), f_q)) + { + let result := mulmod(mload(0x38e0), mload(0x3e20), f_q) + mstore(19744, result) + } + mstore(0x4d40, mulmod(mload(0x4d20), mload(0x42e0), f_q)) + mstore(0x4d60, mulmod(sub(f_q, mload(0x4d40)), mload(0x43c0), f_q)) + mstore(0x4d80, mulmod(mload(0x47c0), mload(0x43c0), f_q)) + mstore(0x4da0, mulmod(mload(0x4cc0), mload(0x43c0), f_q)) + mstore(0x4dc0, mulmod(mload(0x4ce0), mload(0x43c0), f_q)) + mstore(0x4de0, mulmod(mload(0x4d00), mload(0x43c0), f_q)) + mstore(0x4e00, addmod(mload(0x4ca0), mload(0x4d60), f_q)) + { + let result := mulmod(mload(0xbc0), mload(0x3e20), f_q) + mstore(20000, result) + } + mstore(0x4e40, mulmod(mload(0x4e20), mload(0x42e0), f_q)) + mstore(0x4e60, mulmod(sub(f_q, mload(0x4e40)), mload(0x43e0), f_q)) + mstore(0x4e80, mulmod(mload(0x47c0), mload(0x43e0), f_q)) + mstore(0x4ea0, addmod(mload(0x4e00), mload(0x4e60), f_q)) + mstore(0x4ec0, mulmod(mload(0x4ea0), mload(0x4440), f_q)) + mstore(0x4ee0, mulmod(mload(0x4840), mload(0x4440), f_q)) + mstore(0x4f00, mulmod(mload(0x48c0), mload(0x4440), f_q)) + mstore(0x4f20, mulmod(mload(0x4960), mload(0x4440), f_q)) + mstore(0x4f40, mulmod(mload(0x4a00), mload(0x4440), f_q)) + mstore(0x4f60, mulmod(mload(0x4aa0), mload(0x4440), f_q)) + mstore(0x4f80, mulmod(mload(0x4b40), mload(0x4440), f_q)) + mstore(0x4fa0, mulmod(mload(0x4be0), mload(0x4440), f_q)) + mstore(0x4fc0, mulmod(mload(0x4c80), mload(0x4440), f_q)) + mstore(0x4fe0, mulmod(mload(0x4d80), mload(0x4440), f_q)) + mstore(0x5000, mulmod(mload(0x4da0), mload(0x4440), f_q)) + mstore(0x5020, mulmod(mload(0x4dc0), mload(0x4440), f_q)) + mstore(0x5040, mulmod(mload(0x4de0), mload(0x4440), f_q)) + mstore(0x5060, mulmod(mload(0x4e80), mload(0x4440), f_q)) + mstore(0x5080, addmod(mload(0x47a0), mload(0x4ec0), f_q)) + mstore(0x50a0, mulmod(1, mload(0x3c60), f_q)) + mstore(0x50c0, mulmod(1, mload(0xe40), f_q)) + mstore(0x50e0, 0x0000000000000000000000000000000000000000000000000000000000000001) + mstore(0x5100, 0x0000000000000000000000000000000000000000000000000000000000000002) + mstore(0x5120, mload(0x5080)) + success := and(eq(staticcall(gas(), 0x7, 0x50e0, 0x60, 0x50e0, 0x40), 1), success) + mstore(0x5140, mload(0x50e0)) + mstore(0x5160, mload(0x5100)) + mstore(0x5180, mload(0x660)) + mstore(0x51a0, mload(0x680)) + success := and(eq(staticcall(gas(), 0x6, 0x5140, 0x80, 0x5140, 0x40), 1), success) + mstore(0x51c0, mload(0x840)) + mstore(0x51e0, mload(0x860)) + mstore(0x5200, mload(0x4660)) + success := and(eq(staticcall(gas(), 0x7, 0x51c0, 0x60, 0x51c0, 0x40), 1), success) + mstore(0x5220, mload(0x5140)) + mstore(0x5240, mload(0x5160)) + mstore(0x5260, mload(0x51c0)) + mstore(0x5280, mload(0x51e0)) + success := and(eq(staticcall(gas(), 0x6, 0x5220, 0x80, 0x5220, 0x40), 1), success) + mstore(0x52a0, mload(0x880)) + mstore(0x52c0, mload(0x8a0)) + mstore(0x52e0, mload(0x4680)) + success := and(eq(staticcall(gas(), 0x7, 0x52a0, 0x60, 0x52a0, 0x40), 1), success) + mstore(0x5300, mload(0x5220)) + mstore(0x5320, mload(0x5240)) + mstore(0x5340, mload(0x52a0)) + mstore(0x5360, mload(0x52c0)) + success := and(eq(staticcall(gas(), 0x6, 0x5300, 0x80, 0x5300, 0x40), 1), success) + mstore(0x5380, mload(0x700)) + mstore(0x53a0, mload(0x720)) + mstore(0x53c0, mload(0x4780)) + success := and(eq(staticcall(gas(), 0x7, 0x5380, 0x60, 0x5380, 0x40), 1), success) + mstore(0x53e0, mload(0x5300)) + mstore(0x5400, mload(0x5320)) + mstore(0x5420, mload(0x5380)) + mstore(0x5440, mload(0x53a0)) + success := and(eq(staticcall(gas(), 0x6, 0x53e0, 0x80, 0x53e0, 0x40), 1), success) + mstore(0x5460, mload(0x740)) + mstore(0x5480, mload(0x760)) + mstore(0x54a0, mload(0x4ee0)) + success := and(eq(staticcall(gas(), 0x7, 0x5460, 0x60, 0x5460, 0x40), 1), success) + mstore(0x54c0, mload(0x53e0)) + mstore(0x54e0, mload(0x5400)) + mstore(0x5500, mload(0x5460)) + mstore(0x5520, mload(0x5480)) + success := and(eq(staticcall(gas(), 0x6, 0x54c0, 0x80, 0x54c0, 0x40), 1), success) + mstore(0x5540, 0x04633090806662534335356654f3ee6430f215f4f010ae32ae068a900596d598) + mstore(0x5560, 0x2559e379146d41a440431d5bcb5ebdf2f978e08999ccf6cfff2586402050780f) + mstore(0x5580, mload(0x4f00)) + success := and(eq(staticcall(gas(), 0x7, 0x5540, 0x60, 0x5540, 0x40), 1), success) + mstore(0x55a0, mload(0x54c0)) + mstore(0x55c0, mload(0x54e0)) + mstore(0x55e0, mload(0x5540)) + mstore(0x5600, mload(0x5560)) + success := and(eq(staticcall(gas(), 0x6, 0x55a0, 0x80, 0x55a0, 0x40), 1), success) + mstore(0x5620, 0x2eb40e2b0c13a6f4b989cffa9dbc452447bfd9f04a79f6379aefea8c9850a550) + mstore(0x5640, 0x0efe5496541e2bd648d490f11ad542e1dec3127f818b8065843d0dd81358416c) + mstore(0x5660, mload(0x4f20)) + success := and(eq(staticcall(gas(), 0x7, 0x5620, 0x60, 0x5620, 0x40), 1), success) + mstore(0x5680, mload(0x55a0)) + mstore(0x56a0, mload(0x55c0)) + mstore(0x56c0, mload(0x5620)) + mstore(0x56e0, mload(0x5640)) + success := and(eq(staticcall(gas(), 0x6, 0x5680, 0x80, 0x5680, 0x40), 1), success) + mstore(0x5700, 0x18dca54423b6fa7932c92beff56ce260a3c726e3613c92fe0843d86b92199bfd) + mstore(0x5720, 0x0f6641ca942a4541625b14adb25ab0fd978060c98d01eb1b036fcdb1b8f77be1) + mstore(0x5740, mload(0x4f40)) + success := and(eq(staticcall(gas(), 0x7, 0x5700, 0x60, 0x5700, 0x40), 1), success) + mstore(0x5760, mload(0x5680)) + mstore(0x5780, mload(0x56a0)) + mstore(0x57a0, mload(0x5700)) + mstore(0x57c0, mload(0x5720)) + success := and(eq(staticcall(gas(), 0x6, 0x5760, 0x80, 0x5760, 0x40), 1), success) + mstore(0x57e0, 0x23809cc9d17a8cb32381764c6234d3038148b8bec5d8573fb3470486feedd968) + mstore(0x5800, 0x1debabb870ec20dc2c4df55cbd88205b6dd234ad5805faf3a72e14b6f934f238) + mstore(0x5820, mload(0x4f60)) + success := and(eq(staticcall(gas(), 0x7, 0x57e0, 0x60, 0x57e0, 0x40), 1), success) + mstore(0x5840, mload(0x5760)) + mstore(0x5860, mload(0x5780)) + mstore(0x5880, mload(0x57e0)) + mstore(0x58a0, mload(0x5800)) + success := and(eq(staticcall(gas(), 0x6, 0x5840, 0x80, 0x5840, 0x40), 1), success) + mstore(0x58c0, 0x10ff9174af9a7540d6335a6dad3dd0fe0c3943b24b706ba111c73534218c8d99) + mstore(0x58e0, 0x07769bf2a7e819b8b069c49481451ca34b9cfe9cf4ab6c03709a3b33aa9f25f9) + mstore(0x5900, mload(0x4f80)) + success := and(eq(staticcall(gas(), 0x7, 0x58c0, 0x60, 0x58c0, 0x40), 1), success) + mstore(0x5920, mload(0x5840)) + mstore(0x5940, mload(0x5860)) + mstore(0x5960, mload(0x58c0)) + mstore(0x5980, mload(0x58e0)) + success := and(eq(staticcall(gas(), 0x6, 0x5920, 0x80, 0x5920, 0x40), 1), success) + mstore(0x59a0, 0x2347cc725aa8ab0c70557e7effada9a02cba0277f8aca1785f986430d8b63ad4) + mstore(0x59c0, 0x2f7f8f66561183dd0a7c6cf12a1fa248b80509334c8e87dbdcf192301a3c6a4d) + mstore(0x59e0, mload(0x4fa0)) + success := and(eq(staticcall(gas(), 0x7, 0x59a0, 0x60, 0x59a0, 0x40), 1), success) + mstore(0x5a00, mload(0x5920)) + mstore(0x5a20, mload(0x5940)) + mstore(0x5a40, mload(0x59a0)) + mstore(0x5a60, mload(0x59c0)) + success := and(eq(staticcall(gas(), 0x6, 0x5a00, 0x80, 0x5a00, 0x40), 1), success) + mstore(0x5a80, 0x23eb59f4643a8f86f1bb54ebc274b4810126c9c2fae5d8de472ef0566afaa14c) + mstore(0x5aa0, 0x13b28c9220c717cac368247913075f4bb8da09cd9d0145c1292810854089c39c) + mstore(0x5ac0, mload(0x4fc0)) + success := and(eq(staticcall(gas(), 0x7, 0x5a80, 0x60, 0x5a80, 0x40), 1), success) + mstore(0x5ae0, mload(0x5a00)) + mstore(0x5b00, mload(0x5a20)) + mstore(0x5b20, mload(0x5a80)) + mstore(0x5b40, mload(0x5aa0)) + success := and(eq(staticcall(gas(), 0x6, 0x5ae0, 0x80, 0x5ae0, 0x40), 1), success) + mstore(0x5b60, mload(0x960)) + mstore(0x5b80, mload(0x980)) + mstore(0x5ba0, mload(0x4fe0)) + success := and(eq(staticcall(gas(), 0x7, 0x5b60, 0x60, 0x5b60, 0x40), 1), success) + mstore(0x5bc0, mload(0x5ae0)) + mstore(0x5be0, mload(0x5b00)) + mstore(0x5c00, mload(0x5b60)) + mstore(0x5c20, mload(0x5b80)) + success := and(eq(staticcall(gas(), 0x6, 0x5bc0, 0x80, 0x5bc0, 0x40), 1), success) + mstore(0x5c40, mload(0x9a0)) + mstore(0x5c60, mload(0x9c0)) + mstore(0x5c80, mload(0x5000)) + success := and(eq(staticcall(gas(), 0x7, 0x5c40, 0x60, 0x5c40, 0x40), 1), success) + mstore(0x5ca0, mload(0x5bc0)) + mstore(0x5cc0, mload(0x5be0)) + mstore(0x5ce0, mload(0x5c40)) + mstore(0x5d00, mload(0x5c60)) + success := and(eq(staticcall(gas(), 0x6, 0x5ca0, 0x80, 0x5ca0, 0x40), 1), success) + mstore(0x5d20, mload(0x9e0)) + mstore(0x5d40, mload(0xa00)) + mstore(0x5d60, mload(0x5020)) + success := and(eq(staticcall(gas(), 0x7, 0x5d20, 0x60, 0x5d20, 0x40), 1), success) + mstore(0x5d80, mload(0x5ca0)) + mstore(0x5da0, mload(0x5cc0)) + mstore(0x5dc0, mload(0x5d20)) + mstore(0x5de0, mload(0x5d40)) + success := and(eq(staticcall(gas(), 0x6, 0x5d80, 0x80, 0x5d80, 0x40), 1), success) + mstore(0x5e00, mload(0xa20)) + mstore(0x5e20, mload(0xa40)) + mstore(0x5e40, mload(0x5040)) + success := and(eq(staticcall(gas(), 0x7, 0x5e00, 0x60, 0x5e00, 0x40), 1), success) + mstore(0x5e60, mload(0x5d80)) + mstore(0x5e80, mload(0x5da0)) + mstore(0x5ea0, mload(0x5e00)) + mstore(0x5ec0, mload(0x5e20)) + success := and(eq(staticcall(gas(), 0x6, 0x5e60, 0x80, 0x5e60, 0x40), 1), success) + mstore(0x5ee0, mload(0x8c0)) + mstore(0x5f00, mload(0x8e0)) + mstore(0x5f20, mload(0x5060)) + success := and(eq(staticcall(gas(), 0x7, 0x5ee0, 0x60, 0x5ee0, 0x40), 1), success) + mstore(0x5f40, mload(0x5e60)) + mstore(0x5f60, mload(0x5e80)) + mstore(0x5f80, mload(0x5ee0)) + mstore(0x5fa0, mload(0x5f00)) + success := and(eq(staticcall(gas(), 0x6, 0x5f40, 0x80, 0x5f40, 0x40), 1), success) + mstore(0x5fc0, mload(0xde0)) + mstore(0x5fe0, mload(0xe00)) + mstore(0x6000, sub(f_q, mload(0x50a0))) + success := and(eq(staticcall(gas(), 0x7, 0x5fc0, 0x60, 0x5fc0, 0x40), 1), success) + mstore(0x6020, mload(0x5f40)) + mstore(0x6040, mload(0x5f60)) + mstore(0x6060, mload(0x5fc0)) + mstore(0x6080, mload(0x5fe0)) + success := and(eq(staticcall(gas(), 0x6, 0x6020, 0x80, 0x6020, 0x40), 1), success) + mstore(0x60a0, mload(0xe80)) + mstore(0x60c0, mload(0xea0)) + mstore(0x60e0, mload(0x50c0)) + success := and(eq(staticcall(gas(), 0x7, 0x60a0, 0x60, 0x60a0, 0x40), 1), success) + mstore(0x6100, mload(0x6020)) + mstore(0x6120, mload(0x6040)) + mstore(0x6140, mload(0x60a0)) + mstore(0x6160, mload(0x60c0)) + success := and(eq(staticcall(gas(), 0x6, 0x6100, 0x80, 0x6100, 0x40), 1), success) + mstore(0x6180, mload(0x6100)) + mstore(0x61a0, mload(0x6120)) + mstore(0x61c0, mload(0xe80)) + mstore(0x61e0, mload(0xea0)) + mstore(0x6200, mload(0xec0)) + mstore(0x6220, mload(0xee0)) + mstore(0x6240, mload(0xf00)) + mstore(0x6260, mload(0xf20)) + mstore(0x6280, keccak256(0x6180, 256)) + mstore(25248, mod(mload(25216), f_q)) + mstore(0x62c0, mulmod(mload(0x62a0), mload(0x62a0), f_q)) + mstore(0x62e0, mulmod(1, mload(0x62a0), f_q)) + mstore(0x6300, mload(0x6200)) + mstore(0x6320, mload(0x6220)) + mstore(0x6340, mload(0x62e0)) + success := and(eq(staticcall(gas(), 0x7, 0x6300, 0x60, 0x6300, 0x40), 1), success) + mstore(0x6360, mload(0x6180)) + mstore(0x6380, mload(0x61a0)) + mstore(0x63a0, mload(0x6300)) + mstore(0x63c0, mload(0x6320)) + success := and(eq(staticcall(gas(), 0x6, 0x6360, 0x80, 0x6360, 0x40), 1), success) + mstore(0x63e0, mload(0x6240)) + mstore(0x6400, mload(0x6260)) + mstore(0x6420, mload(0x62e0)) + success := and(eq(staticcall(gas(), 0x7, 0x63e0, 0x60, 0x63e0, 0x40), 1), success) + mstore(0x6440, mload(0x61c0)) + mstore(0x6460, mload(0x61e0)) + mstore(0x6480, mload(0x63e0)) + mstore(0x64a0, mload(0x6400)) + success := and(eq(staticcall(gas(), 0x6, 0x6440, 0x80, 0x6440, 0x40), 1), success) + mstore(0x64c0, mload(0x6360)) + mstore(0x64e0, mload(0x6380)) + mstore(0x6500, 0x198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c2) + mstore(0x6520, 0x1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed) + mstore(0x6540, 0x090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b) + mstore(0x6560, 0x12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa) + mstore(0x6580, mload(0x6440)) + mstore(0x65a0, mload(0x6460)) + mstore(0x65c0, 0x172aa93c41f16e1e04d62ac976a5d945f4be0acab990c6dc19ac4a7cf68bf77b) + mstore(0x65e0, 0x2ae0c8c3a090f7200ff398ee9845bbae8f8c1445ae7b632212775f60a0e21600) + mstore(0x6600, 0x190fa476a5b352809ed41d7a0d7fe12b8f685e3c12a6d83855dba27aaf469643) + mstore(0x6620, 0x1c0a500618907df9e4273d5181e31088deb1f05132de037cbfe73888f97f77c9) + success := and(eq(staticcall(gas(), 0x8, 0x64c0, 0x180, 0x64c0, 0x20), 1), success) + success := and(eq(mload(0x64c0), 1), success) + + // Revert if anything fails + if iszero(success) { revert(0, 0) } + + // Return empty bytes on success + return(0, 0) + } + } +} From 544bbbfd9644519880840767f2e87d38d5c07b2b Mon Sep 17 00:00:00 2001 From: Zhang Zhuo Date: Wed, 27 Aug 2025 08:39:42 +0800 Subject: [PATCH 2/9] add --output to build-guest --- crates/build-guest/src/main.rs | 13 ++++++++----- crates/circuits/batch-circuit/batch_leaf_commit.rs | 4 ---- .../src/child_commitments/chunk_leaf_commit.rs | 1 - .../circuits/bundle-circuit/bundle_leaf_commit.rs | 4 ---- .../src/child_commitments/batch_leaf_commit.rs | 1 - crates/circuits/chunk-circuit/chunk_leaf_commit.rs | 4 ---- 6 files changed, 8 insertions(+), 19 deletions(-) delete mode 100644 crates/circuits/batch-circuit/batch_leaf_commit.rs delete mode 120000 crates/circuits/batch-circuit/src/child_commitments/chunk_leaf_commit.rs delete mode 100644 crates/circuits/bundle-circuit/bundle_leaf_commit.rs delete mode 120000 crates/circuits/bundle-circuit/src/child_commitments/batch_leaf_commit.rs delete mode 100644 crates/circuits/chunk-circuit/chunk_leaf_commit.rs diff --git a/crates/build-guest/src/main.rs b/crates/build-guest/src/main.rs index ee573d7d..3c654f05 100644 --- a/crates/build-guest/src/main.rs +++ b/crates/build-guest/src/main.rs @@ -73,6 +73,10 @@ struct Cli { /// - force: Always regenerate all files (use for clean builds or CI) #[arg(long, value_enum, default_value_t = OutputMode::Auto)] mode: OutputMode, + + /// Output directory name under releases/ (default: "dev") + #[arg(long, default_value = "dev")] + output: String, } const LOG_PREFIX: &str = "[build-guest]"; @@ -369,21 +373,20 @@ pub fn main() -> Result<()> { let workspace_dir = metadata.workspace_root.into_std_path_buf(); println!("{LOG_PREFIX} Workspace root: {}", workspace_dir.display()); - let release_output_dir: std::path::PathBuf = workspace_dir.join("releases").join("dev"); + let release_output_dir: std::path::PathBuf = workspace_dir.join("releases").join(&cli.output); std::fs::create_dir_all(&release_output_dir)?; println!( "{LOG_PREFIX} Release output directory: {}", release_output_dir.display() ); + println!("{LOG_PREFIX} Generating app assets (always overwrite)"); + generate_app_assets(&workspace_dir, &release_output_dir)?; + println!("{LOG_PREFIX} Generating openvm assets"); let force_overwrite = matches!(cli.mode, OutputMode::Force); generate_openvm_assets(&workspace_dir, &release_output_dir, force_overwrite)?; - // Always generate both app and openvm assets - println!("{LOG_PREFIX} Generating app assets (always overwrite)"); - generate_app_assets(&workspace_dir, &release_output_dir)?; - println!("{LOG_PREFIX} Build process completed successfully."); Ok(()) } diff --git a/crates/circuits/batch-circuit/batch_leaf_commit.rs b/crates/circuits/batch-circuit/batch_leaf_commit.rs deleted file mode 100644 index 44734bac..00000000 --- a/crates/circuits/batch-circuit/batch_leaf_commit.rs +++ /dev/null @@ -1,4 +0,0 @@ -#![cfg_attr(rustfmt, rustfmt_skip)] -//! Generated by crates/build-guest. DO NOT EDIT! - -pub const COMMIT: [u32; 8] = [1143979762, 1252839784, 728295280, 80130475, 1981604375, 1538642995, 55047256, 1521517292]; diff --git a/crates/circuits/batch-circuit/src/child_commitments/chunk_leaf_commit.rs b/crates/circuits/batch-circuit/src/child_commitments/chunk_leaf_commit.rs deleted file mode 120000 index b6dfaa45..00000000 --- a/crates/circuits/batch-circuit/src/child_commitments/chunk_leaf_commit.rs +++ /dev/null @@ -1 +0,0 @@ -../../../chunk-circuit/chunk_leaf_commit.rs \ No newline at end of file diff --git a/crates/circuits/bundle-circuit/bundle_leaf_commit.rs b/crates/circuits/bundle-circuit/bundle_leaf_commit.rs deleted file mode 100644 index 5271f85c..00000000 --- a/crates/circuits/bundle-circuit/bundle_leaf_commit.rs +++ /dev/null @@ -1,4 +0,0 @@ -#![cfg_attr(rustfmt, rustfmt_skip)] -//! Generated by crates/build-guest. DO NOT EDIT! - -pub const COMMIT: [u32; 8] = [702922786, 974900043, 1870917533, 1628966797, 1650497578, 697799835, 298481193, 1937656708]; diff --git a/crates/circuits/bundle-circuit/src/child_commitments/batch_leaf_commit.rs b/crates/circuits/bundle-circuit/src/child_commitments/batch_leaf_commit.rs deleted file mode 120000 index 3e440334..00000000 --- a/crates/circuits/bundle-circuit/src/child_commitments/batch_leaf_commit.rs +++ /dev/null @@ -1 +0,0 @@ -../../../batch-circuit/batch_leaf_commit.rs \ No newline at end of file diff --git a/crates/circuits/chunk-circuit/chunk_leaf_commit.rs b/crates/circuits/chunk-circuit/chunk_leaf_commit.rs deleted file mode 100644 index 739a25bf..00000000 --- a/crates/circuits/chunk-circuit/chunk_leaf_commit.rs +++ /dev/null @@ -1,4 +0,0 @@ -#![cfg_attr(rustfmt, rustfmt_skip)] -//! Generated by crates/build-guest. DO NOT EDIT! - -pub const COMMIT: [u32; 8] = [636098662, 1159240103, 1476249019, 1206808598, 446929719, 1171493582, 43492796, 756143264]; From 1e3f682a7c751bdf59c1f1e54614900febaef9e1 Mon Sep 17 00:00:00 2001 From: Zhang Zhuo Date: Wed, 27 Aug 2025 09:06:18 +0800 Subject: [PATCH 3/9] update release scripts --- build-guest.sh | 54 +++++++++++------------------- download-release.sh | 4 ++- release.sh | 80 +++++++++++++++++++++++++-------------------- 3 files changed, 66 insertions(+), 72 deletions(-) diff --git a/build-guest.sh b/build-guest.sh index 2c6a6f26..1ac63697 100755 --- a/build-guest.sh +++ b/build-guest.sh @@ -2,14 +2,7 @@ set -ex mkdir -p releases -rm -rf releases/* - -[ -f "crates/build-guest/.env" ] && . crates/build-guest/.env - -# if BUILD_STAGES if empty, set it to stage1,stage2,stage3 -if [ -z "${BUILD_STAGES}" ]; then - BUILD_STAGES="stage1,stage2,stage3" -fi +#rm -rf releases/* # build docker image docker build --platform linux/amd64 -t build-guest:local . @@ -21,41 +14,32 @@ cleanup() { docker rm -f $(cat ./build-guest.cid) 2>/dev/null || true fi rm -f ./build-guest.cid - + } # set trap to cleanup on exit trap cleanup EXIT # run docker image -docker run --cidfile ./build-guest.cid --platform linux/amd64\ - -e BUILD_STAGES=${BUILD_STAGES}\ - build-guest:local\ - make build-guest-local +docker run --cidfile ./build-guest.cid --platform linux/amd64 build-guest:local make build-guest-local container_id=$(cat ./build-guest.cid) -if [ -n "$(echo ${BUILD_STAGES} | grep stage1)" ]; then - # copy leaf commitments from container to local - for f in chunk-circuit/chunk_leaf_commit.rs \ - batch-circuit/batch_leaf_commit.rs \ - bundle-circuit/bundle_leaf_commit.rs; do - docker cp ${container_id}:/app/crates/circuits/${f} crates/circuits/${f} - done -fi - -if [ -n "$(echo ${BUILD_STAGES} | grep stage2)" ]; then - # copy root verifier - docker cp ${container_id}:/app/crates/build-guest/root_verifier.asm crates/build-guest/root_verifier.asm -fi - -if [ -n "$(echo ${BUILD_STAGES} | grep stage3)" ]; then - # copy exe commitments from container to local - for f in chunk-circuit/chunk_exe_commit.rs \ - batch-circuit/batch_exe_commit.rs \ - bundle-circuit/bundle_exe_commit.rs; do - docker cp ${container_id}:/app/crates/circuits/${f} crates/circuits/${f} - done -fi +# copy vm commitments from container to local +for f in chunk-circuit/chunk_vm_commit.rs \ + batch-circuit/batch_vm_commit.rs \ + bundle-circuit/bundle_vm_commit.rs; do + docker cp ${container_id}:/app/crates/circuits/${f} crates/circuits/${f} +done + +# copy root verifier +docker cp ${container_id}:/app/crates/build-guest/root_verifier.asm crates/build-guest/root_verifier.asm + +# copy exe commitments from container to local +for f in chunk-circuit/chunk_exe_commit.rs \ + batch-circuit/batch_exe_commit.rs \ + bundle-circuit/bundle_exe_commit.rs; do + docker cp ${container_id}:/app/crates/circuits/${f} crates/circuits/${f} +done # copy release files from container to local docker cp ${container_id}:/app/releases/dev releases/dev diff --git a/download-release.sh b/download-release.sh index 83330965..f4768868 100644 --- a/download-release.sh +++ b/download-release.sh @@ -23,7 +23,9 @@ function download_by_http() { bundle/openvm.toml \ batch/app.vmexe \ batch/openvm.toml; do - wget https://circuit-release.s3.us-west-2.amazonaws.com/scroll-zkvm/releases/$SCROLL_ZKVM_VERSION/$f -O releases/$SCROLL_ZKVM_VERSION/$f + output_path="releases/$SCROLL_ZKVM_VERSION/$f" + mkdir -p "$(dirname "$output_path")" + wget https://circuit-release.s3.us-west-2.amazonaws.com/scroll-zkvm/releases/$SCROLL_ZKVM_VERSION/$f -O "$output_path" done } diff --git a/release.sh b/release.sh index 5d0bea3c..ca68d63c 100644 --- a/release.sh +++ b/release.sh @@ -1,5 +1,5 @@ #!/bin/bash -set -ue +set -uex if [ -z "${SCROLL_ZKVM_VERSION}" ]; then echo "SCROLL_ZKVM_VERSION not set" @@ -8,44 +8,52 @@ else VERIFIER_RELEASES_DIR="releases/${SCROLL_ZKVM_VERSION}" fi +DEV_DIR="releases/dev" +# Output sha256 checksums +find $DEV_DIR -type f ! -name sha256sums.txt -exec sha256sum {} \; >$DEV_DIR/sha256sums.txt + # Read FORKNAME from release-fork file FORKNAME=$(head -n 1 release-fork) -DEV_DIR="releases/dev" -VK_JSON="$DEV_DIR/verifier/openVmVk.json" -RELEASES_DIR="releases/$FORKNAME" - -# Output sha256 checksums -find $DEV_DIR -type f ! -name sha256sums.txt -exec sha256sum {} \; > $DEV_DIR/sha256sums.txt +function release_new() { + VK_JSON="$DEV_DIR/verifier/openVmVk.json" + RELEASES_DIR="releases/$FORKNAME" -# Check if openVmVk.json exists -if [ ! -f "$VK_JSON" ]; then + # Check if openVmVk.json exists + if [ ! -f "$VK_JSON" ]; then echo "Error: openVmVk.json not found in $DEV_DIR/" exit 1 -fi - -# Read verification keys from JSON file -chunk_vk=$(jq -r '.chunk_vk' "$VK_JSON") -batch_vk=$(jq -r '.batch_vk' "$VK_JSON") -bundle_vk=$(jq -r '.bundle_vk' "$VK_JSON") - -# Create directories and copy files -mkdir -p "$RELEASES_DIR/chunk/$chunk_vk" -mkdir -p "$RELEASES_DIR/batch/$batch_vk" -mkdir -p "$RELEASES_DIR/bundle/$bundle_vk" - -# Copy files from releases/dev to the new directories -cp -r "$DEV_DIR/chunk"/* "$RELEASES_DIR/chunk/$chunk_vk/" -cp -r "$DEV_DIR/batch"/* "$RELEASES_DIR/batch/$batch_vk/" -cp -r "$DEV_DIR/bundle"/* "$RELEASES_DIR/bundle/$bundle_vk/" -mkdir -p $VERIFIER_RELEASES_DIR -mv $DEV_DIR/* $VERIFIER_RELEASES_DIR - -echo "Files organized for release successfully:" -echo " chunk files -> $RELEASES_DIR/chunk/$chunk_vk" -echo " batch files -> $RELEASES_DIR/batch/$batch_vk" -echo " bundle files -> $RELEASES_DIR/bundle/$bundle_vk" -echo " verifier files -> $VERIFIER_RELEASES_DIR" -echo " recursivly upload releases directory" - -#aws --profile default s3 cp releases s3://circuit-release/scroll-zkvm --recursive + fi + + # Read verification keys from JSON file + chunk_vk=$(jq -r '.chunk_vk' "$VK_JSON") + batch_vk=$(jq -r '.batch_vk' "$VK_JSON") + bundle_vk=$(jq -r '.bundle_vk' "$VK_JSON") + + # Create directories and copy files + mkdir -p "$RELEASES_DIR/chunk/$chunk_vk" + mkdir -p "$RELEASES_DIR/batch/$batch_vk" + mkdir -p "$RELEASES_DIR/bundle/$bundle_vk" + + # Copy files from releases/dev to the new directories + cp -r "$DEV_DIR/chunk"/* "$RELEASES_DIR/chunk/$chunk_vk/" + cp -r "$DEV_DIR/batch"/* "$RELEASES_DIR/batch/$batch_vk/" + cp -r "$DEV_DIR/bundle"/* "$RELEASES_DIR/bundle/$bundle_vk/" + mkdir -p $VERIFIER_RELEASES_DIR + mv $DEV_DIR/* $VERIFIER_RELEASES_DIR + + echo "Files organized for release successfully:" + echo " chunk files -> $RELEASES_DIR/chunk/$chunk_vk" + echo " batch files -> $RELEASES_DIR/batch/$batch_vk" + echo " bundle files -> $RELEASES_DIR/bundle/$bundle_vk" + echo " verifier files -> $VERIFIER_RELEASES_DIR" + echo " recursivly upload releases directory" + + #aws --profile default s3 cp releases s3://circuit-release/scroll-zkvm --recursive +} + +function release_old() { + aws --profile default s3 cp $DEV_DIR s3://circuit-release/scroll-zkvm/$VERIFIER_RELEASES_DIR --recursive +} + +release_new \ No newline at end of file From c7e9070017078026317ec1ac129bc7aa8443e1d8 Mon Sep 17 00:00:00 2001 From: Zhang Zhuo Date: Wed, 27 Aug 2025 09:19:31 +0800 Subject: [PATCH 4/9] support gpu! --- Cargo.toml.gpu | 44 +++++++++++++++++++++++++++++++++++++++++ Makefile | 53 +++++++++++++++++++++++--------------------------- 2 files changed, 68 insertions(+), 29 deletions(-) create mode 100644 Cargo.toml.gpu diff --git a/Cargo.toml.gpu b/Cargo.toml.gpu new file mode 100644 index 00000000..f0968c63 --- /dev/null +++ b/Cargo.toml.gpu @@ -0,0 +1,44 @@ +[patch."https://github.com/openvm-org/openvm.git"] +openvm-build = { git = "ssh://git@github.com/scroll-tech/openvm-gpu.git", branch = "patch-v1.4.0-c033e18-pipe", default-features = false } +openvm-circuit = { git = "ssh://git@github.com/scroll-tech/openvm-gpu.git", branch = "patch-v1.4.0-c033e18-pipe", default-features = false } +openvm-continuations = { git = "ssh://git@github.com/scroll-tech/openvm-gpu.git", branch = "patch-v1.4.0-c033e18-pipe", default-features = false } +openvm-instructions ={ git = "ssh://git@github.com/scroll-tech/openvm-gpu.git", branch = "patch-v1.4.0-c033e18-pipe", default-features = false } +openvm-native-circuit = { git = "ssh://git@github.com/scroll-tech/openvm-gpu.git", branch = "patch-v1.4.0-c033e18-pipe", default-features = false } +openvm-native-compiler = { git = "ssh://git@github.com/scroll-tech/openvm-gpu.git", branch = "patch-v1.4.0-c033e18-pipe", default-features = false } +openvm-native-recursion = { git = "ssh://git@github.com/scroll-tech/openvm-gpu.git", branch = "patch-v1.4.0-c033e18-pipe", default-features = false } +openvm-native-transpiler = { git = "ssh://git@github.com/scroll-tech/openvm-gpu.git", branch = "patch-v1.4.0-c033e18-pipe", default-features = false } +openvm-rv32im-transpiler = { git = "ssh://git@github.com/scroll-tech/openvm-gpu.git", branch = "patch-v1.4.0-c033e18-pipe", default-features = false } +openvm-sdk = { git = "ssh://git@github.com/scroll-tech/openvm-gpu.git", branch = "patch-v1.4.0-c033e18-pipe", default-features = false, features = ["parallel", "bench-metrics", "evm-prove"] } +openvm-transpiler = { git = "ssh://git@github.com/scroll-tech/openvm-gpu.git", branch = "patch-v1.4.0-c033e18-pipe", default-features = false } + +[patch."https://github.com/openvm-org/stark-backend.git"] +openvm-stark-backend = { git = "ssh://git@github.com/scroll-tech/openvm-stark-gpu.git", branch = "main", features = ["gpu"] } +openvm-stark-sdk = { git = "ssh://git@github.com/scroll-tech/openvm-stark-gpu.git", branch = "main", features = ["gpu"] } + +[patch."https://github.com/Plonky3/Plonky3.git"] +p3-air = { git = "ssh://git@github.com/scroll-tech/plonky3-gpu.git", tag = "v0.2.1" } +p3-field = { git = "ssh://git@github.com/scroll-tech/plonky3-gpu.git", tag = "v0.2.1" } +p3-commit = { git = "ssh://git@github.com/scroll-tech/plonky3-gpu.git", tag = "v0.2.1" } +p3-matrix = { git = "ssh://git@github.com/scroll-tech/plonky3-gpu.git", tag = "v0.2.1" } +p3-baby-bear = { git = "ssh://git@github.com/scroll-tech/plonky3-gpu.git", features = [ + "nightly-features", +], tag = "v0.2.1" } +p3-koala-bear = { git = "ssh://git@github.com/scroll-tech/plonky3-gpu.git", tag = "v0.2.1" } +p3-util = { git = "ssh://git@github.com/scroll-tech/plonky3-gpu.git", tag = "v0.2.1" } +p3-challenger = { git = "ssh://git@github.com/scroll-tech/plonky3-gpu.git", tag = "v0.2.1" } +p3-dft = { git = "ssh://git@github.com/scroll-tech/plonky3-gpu.git", tag = "v0.2.1" } +p3-fri = { git = "ssh://git@github.com/scroll-tech/plonky3-gpu.git", tag = "v0.2.1" } +p3-goldilocks = { git = "ssh://git@github.com/scroll-tech/plonky3-gpu.git", tag = "v0.2.1" } +p3-keccak = { git = "ssh://git@github.com/scroll-tech/plonky3-gpu.git", tag = "v0.2.1" } +p3-keccak-air = { git = "ssh://git@github.com/scroll-tech/plonky3-gpu.git", tag = "v0.2.1" } +p3-blake3 = { git = "ssh://git@github.com/scroll-tech/plonky3-gpu.git", tag = "v0.2.1" } +p3-mds = { git = "ssh://git@github.com/scroll-tech/plonky3-gpu.git", tag = "v0.2.1" } +p3-merkle-tree = { git = "ssh://git@github.com/scroll-tech/plonky3-gpu.git", tag = "v0.2.1" } +p3-monty-31 = { git = "ssh://git@github.com/scroll-tech/plonky3-gpu.git", tag = "v0.2.1" } +p3-poseidon = { git = "ssh://git@github.com/scroll-tech/plonky3-gpu.git", tag = "v0.2.1" } +p3-poseidon2 = { git = "ssh://git@github.com/scroll-tech/plonky3-gpu.git", tag = "v0.2.1" } +p3-poseidon2-air = { git = "ssh://git@github.com/scroll-tech/plonky3-gpu.git", tag = "v0.2.1" } +p3-symmetric = { git = "ssh://git@github.com/scroll-tech/plonky3-gpu.git", tag = "v0.2.1" } +p3-uni-stark = { git = "ssh://git@github.com/scroll-tech/plonky3-gpu.git", tag = "v0.2.1" } +p3-maybe-rayon = { git = "ssh://git@github.com/scroll-tech/plonky3-gpu.git", tag = "v0.2.1" } # the "parallel" feature is NOT on by default to allow single-threaded benchmarking +p3-bn254-fr = { git = "ssh://git@github.com/scroll-tech/plonky3-gpu.git", tag = "v0.2.1" } diff --git a/Makefile b/Makefile index 1d5b19e7..1b0218be 100644 --- a/Makefile +++ b/Makefile @@ -10,10 +10,12 @@ export RUST_LOG OPENVM_RUST_TOOLCHAIN ?= nightly-2025-08-18 export OPENVM_RUST_TOOLCHAIN -TESTDATA_PATH := crates/integration/testdata/phase2 -CHUNK_PROOF := 1-4 - -$(info TESTDATA_PATH set to: $(TESTDATA_PATH)) +# Set GPU config if GPU=1 is set +ifeq ($(GPU),1) +CARGO_CONFIG_FLAG = --config Cargo.toml.gpu +else +CARGO_CONFIG_FLAG = +endif download-release: sh download-release.sh @@ -40,54 +42,47 @@ build-guest-local: clean-build-guest: clean-guest build-guest -clean-test-cache: - @rm -f $(TESTDATA_PATH)/proofs/*.json - -$(TESTDATA_PATH)/proofs/chunk-%.json: - @OUTPUT_DIR=$(realpath $(TESTDATA_PATH)/proofs) $(MAKE) test-single-chunk - cp -f $(TESTDATA_PATH)/proofs/chunk/proofs/*.json $(TESTDATA_PATH)/proofs - profile-chunk: - @GUEST_PROFILING=true cargo test --release -p scroll-zkvm-integration --test chunk_circuit guest_profiling -- --exact --nocapture + @GUEST_PROFILING=true cargo test $(CARGO_CONFIG_FLAG) --release -p scroll-zkvm-integration --test chunk_circuit guest_profiling -- --exact --nocapture export-onchain-verifier: - @cargo test --release -p scroll-zkvm-integration --test onchain_verifier export_onchain_verifier -- --exact --nocapture + @cargo test $(CARGO_CONFIG_FLAG) --release -p scroll-zkvm-integration --test onchain_verifier export_onchain_verifier -- --exact --nocapture test-execute-chunk: - @cargo test --release -p scroll-zkvm-integration --test chunk_circuit test_execute -- --exact --nocapture + @cargo test $(CARGO_CONFIG_FLAG) --release -p scroll-zkvm-integration --test chunk_circuit test_execute -- --exact --nocapture test-execute-chunk-multi: - @cargo test --release -p scroll-zkvm-integration --test chunk_circuit test_execute_multi -- --exact --nocapture + @cargo test $(CARGO_CONFIG_FLAG) --release -p scroll-zkvm-integration --test chunk_circuit test_execute_multi -- --exact --nocapture test-cycle: - @cargo test --release -p scroll-zkvm-integration --test chunk_circuit test_cycle -- --exact --nocapture + @cargo test $(CARGO_CONFIG_FLAG) --release -p scroll-zkvm-integration --test chunk_circuit test_cycle -- --exact --nocapture -test-execute-batch: $(TESTDATA_PATH)/proofs/chunk-$(CHUNK_PROOF).json - @cargo test --release -p scroll-zkvm-integration --test batch_circuit test_e2e_execute -- --exact --nocapture +test-execute-batch: + @cargo test $(CARGO_CONFIG_FLAG) --release -p scroll-zkvm-integration --test batch_circuit test_e2e_execute -- --exact --nocapture -test-execute-batch-fast: $(TESTDATA_PATH)/tasks/batch-task.json - @cargo test --release -p scroll-zkvm-integration --test batch_circuit test_execute -- --exact --nocapture +test-execute-batch-fast: + @cargo test $(CARGO_CONFIG_FLAG) --release -p scroll-zkvm-integration --test batch_circuit test_execute -- --exact --nocapture test-execute-bundle: - @cargo test --release -p scroll-zkvm-integration --test bundle_circuit test_execute -- --exact --nocapture + @cargo test $(CARGO_CONFIG_FLAG) --release -p scroll-zkvm-integration --test bundle_circuit test_execute -- --exact --nocapture test-single-chunk: - @cargo test --release -p scroll-zkvm-integration --test chunk_circuit setup_prove_verify_single -- --exact --nocapture + @cargo test $(CARGO_CONFIG_FLAG) --release -p scroll-zkvm-integration --test chunk_circuit setup_prove_verify_single -- --exact --nocapture test-multi-chunk: - @cargo test --release -p scroll-zkvm-integration --test chunk_circuit setup_prove_verify_multi -- --exact --nocapture + @cargo test $(CARGO_CONFIG_FLAG) --release -p scroll-zkvm-integration --test chunk_circuit setup_prove_verify_multi -- --exact --nocapture -test-single-batch: $(TESTDATA_PATH)/tasks/batch-task.json - @cargo test --release -p scroll-zkvm-integration --test batch_circuit setup_prove_verify_single -- --exact --nocapture +test-single-batch: + @cargo test $(CARGO_CONFIG_FLAG) --release -p scroll-zkvm-integration --test batch_circuit setup_prove_verify_single -- --exact --nocapture test-e2e-batch: - @cargo test --release -p scroll-zkvm-integration --test batch_circuit e2e -- --exact --nocapture + @cargo test $(CARGO_CONFIG_FLAG) --release -p scroll-zkvm-integration --test batch_circuit e2e -- --exact --nocapture test-bundle: - @cargo test --release -p scroll-zkvm-integration --test bundle_circuit setup_prove_verify -- --exact --nocapture + @cargo test $(CARGO_CONFIG_FLAG) --release -p scroll-zkvm-integration --test bundle_circuit setup_prove_verify -- --exact --nocapture test-bundle-local: - @cargo test --release -p scroll-zkvm-integration --test bundle_circuit setup_prove_verify_local_task -- --exact --nocapture + @cargo test $(CARGO_CONFIG_FLAG) --release -p scroll-zkvm-integration --test bundle_circuit setup_prove_verify_local_task -- --exact --nocapture test-e2e-bundle: - @cargo test --release -p scroll-zkvm-integration --test bundle_circuit e2e -- --exact --nocapture + @cargo test $(CARGO_CONFIG_FLAG) --release -p scroll-zkvm-integration --test bundle_circuit e2e -- --exact --nocapture \ No newline at end of file From 4bccc59e1f905cb8b1e7e23a0890d6c36c53fc26 Mon Sep 17 00:00:00 2001 From: Velaciela Date: Wed, 27 Aug 2025 13:34:40 +0800 Subject: [PATCH 5/9] fix build --- crates/build-guest/src/main.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/crates/build-guest/src/main.rs b/crates/build-guest/src/main.rs index 3c654f05..34347dee 100644 --- a/crates/build-guest/src/main.rs +++ b/crates/build-guest/src/main.rs @@ -380,13 +380,13 @@ pub fn main() -> Result<()> { release_output_dir.display() ); - println!("{LOG_PREFIX} Generating app assets (always overwrite)"); - generate_app_assets(&workspace_dir, &release_output_dir)?; - println!("{LOG_PREFIX} Generating openvm assets"); let force_overwrite = matches!(cli.mode, OutputMode::Force); generate_openvm_assets(&workspace_dir, &release_output_dir, force_overwrite)?; + println!("{LOG_PREFIX} Generating app assets (always overwrite)"); + generate_app_assets(&workspace_dir, &release_output_dir)?; + println!("{LOG_PREFIX} Build process completed successfully."); Ok(()) } From dab3b80b2ffda1b83d0f13df46bc51d29b570696 Mon Sep 17 00:00:00 2001 From: Velaciela Date: Wed, 27 Aug 2025 19:14:57 +0800 Subject: [PATCH 6/9] upgrade plonky3-gpu v0.2.2 --- Cargo.toml.gpu | 52 +++++++++++++++++++++++++------------------------- 1 file changed, 26 insertions(+), 26 deletions(-) diff --git a/Cargo.toml.gpu b/Cargo.toml.gpu index f0968c63..0b985869 100644 --- a/Cargo.toml.gpu +++ b/Cargo.toml.gpu @@ -12,33 +12,33 @@ openvm-sdk = { git = "ssh://git@github.com/scroll-tech/openvm-gpu.git", branch = openvm-transpiler = { git = "ssh://git@github.com/scroll-tech/openvm-gpu.git", branch = "patch-v1.4.0-c033e18-pipe", default-features = false } [patch."https://github.com/openvm-org/stark-backend.git"] -openvm-stark-backend = { git = "ssh://git@github.com/scroll-tech/openvm-stark-gpu.git", branch = "main", features = ["gpu"] } -openvm-stark-sdk = { git = "ssh://git@github.com/scroll-tech/openvm-stark-gpu.git", branch = "main", features = ["gpu"] } +openvm-stark-backend = { git = "ssh://git@github.com/scroll-tech/openvm-stark-gpu.git", branch = "update-p3-gpu-v0.2.2", features = ["gpu"] } +openvm-stark-sdk = { git = "ssh://git@github.com/scroll-tech/openvm-stark-gpu.git", branch = "update-p3-gpu-v0.2.2", features = ["gpu"] } [patch."https://github.com/Plonky3/Plonky3.git"] -p3-air = { git = "ssh://git@github.com/scroll-tech/plonky3-gpu.git", tag = "v0.2.1" } -p3-field = { git = "ssh://git@github.com/scroll-tech/plonky3-gpu.git", tag = "v0.2.1" } -p3-commit = { git = "ssh://git@github.com/scroll-tech/plonky3-gpu.git", tag = "v0.2.1" } -p3-matrix = { git = "ssh://git@github.com/scroll-tech/plonky3-gpu.git", tag = "v0.2.1" } +p3-air = { git = "ssh://git@github.com/scroll-tech/plonky3-gpu.git", tag = "v0.2.2" } +p3-field = { git = "ssh://git@github.com/scroll-tech/plonky3-gpu.git", tag = "v0.2.2" } +p3-commit = { git = "ssh://git@github.com/scroll-tech/plonky3-gpu.git", tag = "v0.2.2" } +p3-matrix = { git = "ssh://git@github.com/scroll-tech/plonky3-gpu.git", tag = "v0.2.2" } p3-baby-bear = { git = "ssh://git@github.com/scroll-tech/plonky3-gpu.git", features = [ "nightly-features", -], tag = "v0.2.1" } -p3-koala-bear = { git = "ssh://git@github.com/scroll-tech/plonky3-gpu.git", tag = "v0.2.1" } -p3-util = { git = "ssh://git@github.com/scroll-tech/plonky3-gpu.git", tag = "v0.2.1" } -p3-challenger = { git = "ssh://git@github.com/scroll-tech/plonky3-gpu.git", tag = "v0.2.1" } -p3-dft = { git = "ssh://git@github.com/scroll-tech/plonky3-gpu.git", tag = "v0.2.1" } -p3-fri = { git = "ssh://git@github.com/scroll-tech/plonky3-gpu.git", tag = "v0.2.1" } -p3-goldilocks = { git = "ssh://git@github.com/scroll-tech/plonky3-gpu.git", tag = "v0.2.1" } -p3-keccak = { git = "ssh://git@github.com/scroll-tech/plonky3-gpu.git", tag = "v0.2.1" } -p3-keccak-air = { git = "ssh://git@github.com/scroll-tech/plonky3-gpu.git", tag = "v0.2.1" } -p3-blake3 = { git = "ssh://git@github.com/scroll-tech/plonky3-gpu.git", tag = "v0.2.1" } -p3-mds = { git = "ssh://git@github.com/scroll-tech/plonky3-gpu.git", tag = "v0.2.1" } -p3-merkle-tree = { git = "ssh://git@github.com/scroll-tech/plonky3-gpu.git", tag = "v0.2.1" } -p3-monty-31 = { git = "ssh://git@github.com/scroll-tech/plonky3-gpu.git", tag = "v0.2.1" } -p3-poseidon = { git = "ssh://git@github.com/scroll-tech/plonky3-gpu.git", tag = "v0.2.1" } -p3-poseidon2 = { git = "ssh://git@github.com/scroll-tech/plonky3-gpu.git", tag = "v0.2.1" } -p3-poseidon2-air = { git = "ssh://git@github.com/scroll-tech/plonky3-gpu.git", tag = "v0.2.1" } -p3-symmetric = { git = "ssh://git@github.com/scroll-tech/plonky3-gpu.git", tag = "v0.2.1" } -p3-uni-stark = { git = "ssh://git@github.com/scroll-tech/plonky3-gpu.git", tag = "v0.2.1" } -p3-maybe-rayon = { git = "ssh://git@github.com/scroll-tech/plonky3-gpu.git", tag = "v0.2.1" } # the "parallel" feature is NOT on by default to allow single-threaded benchmarking -p3-bn254-fr = { git = "ssh://git@github.com/scroll-tech/plonky3-gpu.git", tag = "v0.2.1" } +], tag = "v0.2.2" } +p3-koala-bear = { git = "ssh://git@github.com/scroll-tech/plonky3-gpu.git", tag = "v0.2.2" } +p3-util = { git = "ssh://git@github.com/scroll-tech/plonky3-gpu.git", tag = "v0.2.2" } +p3-challenger = { git = "ssh://git@github.com/scroll-tech/plonky3-gpu.git", tag = "v0.2.2" } +p3-dft = { git = "ssh://git@github.com/scroll-tech/plonky3-gpu.git", tag = "v0.2.2" } +p3-fri = { git = "ssh://git@github.com/scroll-tech/plonky3-gpu.git", tag = "v0.2.2" } +p3-goldilocks = { git = "ssh://git@github.com/scroll-tech/plonky3-gpu.git", tag = "v0.2.2" } +p3-keccak = { git = "ssh://git@github.com/scroll-tech/plonky3-gpu.git", tag = "v0.2.2" } +p3-keccak-air = { git = "ssh://git@github.com/scroll-tech/plonky3-gpu.git", tag = "v0.2.2" } +p3-blake3 = { git = "ssh://git@github.com/scroll-tech/plonky3-gpu.git", tag = "v0.2.2" } +p3-mds = { git = "ssh://git@github.com/scroll-tech/plonky3-gpu.git", tag = "v0.2.2" } +p3-merkle-tree = { git = "ssh://git@github.com/scroll-tech/plonky3-gpu.git", tag = "v0.2.2" } +p3-monty-31 = { git = "ssh://git@github.com/scroll-tech/plonky3-gpu.git", tag = "v0.2.2" } +p3-poseidon = { git = "ssh://git@github.com/scroll-tech/plonky3-gpu.git", tag = "v0.2.2" } +p3-poseidon2 = { git = "ssh://git@github.com/scroll-tech/plonky3-gpu.git", tag = "v0.2.2" } +p3-poseidon2-air = { git = "ssh://git@github.com/scroll-tech/plonky3-gpu.git", tag = "v0.2.2" } +p3-symmetric = { git = "ssh://git@github.com/scroll-tech/plonky3-gpu.git", tag = "v0.2.2" } +p3-uni-stark = { git = "ssh://git@github.com/scroll-tech/plonky3-gpu.git", tag = "v0.2.2" } +p3-maybe-rayon = { git = "ssh://git@github.com/scroll-tech/plonky3-gpu.git", tag = "v0.2.2" } # the "parallel" feature is NOT on by default to allow single-threaded benchmarking +p3-bn254-fr = { git = "ssh://git@github.com/scroll-tech/plonky3-gpu.git", tag = "v0.2.2" } From 9d8736f10a1849f16cb905f013dcf390275f8696 Mon Sep 17 00:00:00 2001 From: Velaciela Date: Wed, 27 Aug 2025 19:26:28 +0800 Subject: [PATCH 7/9] revert --- crates/types/base/src/public_inputs/chunk.rs | 27 -------------------- crates/types/chunk/src/execute.rs | 2 +- 2 files changed, 1 insertion(+), 28 deletions(-) diff --git a/crates/types/base/src/public_inputs/chunk.rs b/crates/types/base/src/public_inputs/chunk.rs index 5981ee59..fbb3f952 100644 --- a/crates/types/base/src/public_inputs/chunk.rs +++ b/crates/types/base/src/public_inputs/chunk.rs @@ -127,33 +127,6 @@ pub struct ChunkInfo { #[rkyv()] pub block_ctxs: Vec, } -impl std::fmt::Display for ChunkInfo { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - // Create a wrapper struct that implements Debug - struct DisplayWrapper<'a>(&'a ChunkInfo); - - impl<'a> std::fmt::Debug for DisplayWrapper<'a> { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - f.debug_struct("ChunkInfo") - .field("chain_id", &self.0.chain_id) - .field("prev_state_root", &self.0.prev_state_root) - .field("post_state_root", &self.0.post_state_root) - .field("withdraw_root", &self.0.withdraw_root) - .field("data_hash", &self.0.data_hash) - .field("tx_data_digest", &self.0.tx_data_digest) - .field("prev_msg_queue_hash", &self.0.prev_msg_queue_hash) - .field("post_msg_queue_hash", &self.0.post_msg_queue_hash) - .field("tx_data_length", &self.0.tx_data_length) - .field("initial_block_number", &self.0.initial_block_number) - .field("block_ctxs", &"") - .finish() - } - } - - // Use the Debug implementation with pretty formatting - write!(f, "{:#?}", DisplayWrapper(self)) - } -} impl ChunkInfo { /// Public input hash for a given chunk (euclidv1 or da-codec@v6) is defined as diff --git a/crates/types/chunk/src/execute.rs b/crates/types/chunk/src/execute.rs index 585384f3..2a37309c 100644 --- a/crates/types/chunk/src/execute.rs +++ b/crates/types/chunk/src/execute.rs @@ -75,7 +75,7 @@ pub fn execute(witness: ChunkWitness) -> Result { block_ctxs: blocks.iter().map(block_to_context).collect(), }; - println!("chunk_info = {}", chunk_info); + // println!("chunk_info = {}", chunk_info); Ok(chunk_info) } From dd8acea526ed1b9a8cc288f99368d6e70f3795be Mon Sep 17 00:00:00 2001 From: Velaciela Date: Wed, 27 Aug 2025 20:33:52 +0800 Subject: [PATCH 8/9] lint --- .dockerignore | 3 +-- crates/build-guest/src/main.rs | 2 +- crates/integration/Cargo.toml | 2 +- crates/prover/src/prover/mod.rs | 4 ++-- 4 files changed, 5 insertions(+), 6 deletions(-) diff --git a/.dockerignore b/.dockerignore index fa702ca3..e3bbdc56 100644 --- a/.dockerignore +++ b/.dockerignore @@ -11,12 +11,11 @@ Dockerfile.backup docs -releases +#releases *.yml *.sh -!build-guest-actions-entrypoint.sh *.log *.md diff --git a/crates/build-guest/src/main.rs b/crates/build-guest/src/main.rs index 34347dee..a9d6bc9e 100644 --- a/crates/build-guest/src/main.rs +++ b/crates/build-guest/src/main.rs @@ -347,7 +347,7 @@ fn generate_openvm_assets( force_overwrite: bool, ) -> Result<()> { // to use the 'foundry.toml' - env::set_current_dir(&workspace_dir)?; + env::set_current_dir(workspace_dir)?; generate_root_verifier(workspace_dir, force_overwrite)?; generate_evm_verifier(&release_output_dir.join("verifier"), true, force_overwrite)?; diff --git a/crates/integration/Cargo.toml b/crates/integration/Cargo.toml index 11b42750..264a5ec1 100644 --- a/crates/integration/Cargo.toml +++ b/crates/integration/Cargo.toml @@ -43,5 +43,5 @@ regex = "1.11.1" glob = "0.3" [features] -default = [] +default = ["limit-logs"] limit-logs = [] diff --git a/crates/prover/src/prover/mod.rs b/crates/prover/src/prover/mod.rs index 8940e556..b4db3686 100644 --- a/crates/prover/src/prover/mod.rs +++ b/crates/prover/src/prover/mod.rs @@ -257,8 +257,8 @@ impl Prover { .map_err(|e| Error::GenProof(e.to_string()))?; let proving_time_mills = t.elapsed().as_millis() as u64; let prove_speed = - (total_cycles as f32 / 1000_000.0f32) / (proving_time_mills as f32 / 1000.0f32); // MHz - tracing::info!("proving speed: {:.2}MHz", prove_speed); + (total_cycles as f32 / 1_000_000.0f32) / (proving_time_mills as f32 / 1000.0f32); // MHz + tracing::info!("{} proving speed: {:.2}MHz", self.prover_name, prove_speed); let stat = StarkProofStat { total_cycles, proving_time_mills, From 26ac2775329c31ce8a140d8366a9c8e200924467 Mon Sep 17 00:00:00 2001 From: Zhang Zhuo Date: Wed, 27 Aug 2025 12:55:30 +0000 Subject: [PATCH 9/9] fix verifier --- releases/dev/verifier/verifier.bin | Bin 18545 -> 18530 bytes releases/dev/verifier/verifier.sol | 1947 ++++++++++++++-------------- 2 files changed, 978 insertions(+), 969 deletions(-) diff --git a/releases/dev/verifier/verifier.bin b/releases/dev/verifier/verifier.bin index 6b35e16d6dd671f2919298047e2ca45462b2d39e..a5a2680ccd05250b09d4683a7fc51fa3d670b784 100644 GIT binary patch literal 18530 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 literal 18545 zcmb`PcXSn1_x>j&q(BHEJ%ofIfe;7~Ak-9?Kng98dnuuYGa(>NMVcTbCjkVd7ZH#$ zG!>98ND&z6O_3g?c#x)o(yIc$XV0Cvk?*_K>-)#gwQ~3VoU@;2pP4zgWVn%Wrr7K8 zKvnY1W)gqdElX`-c*K= z-<@f8&SXR#Q9%@ltiHSIA|c_F$VfCw6eKz&42htG+c^p;((b<}OjjDU&JFC{yfXFWt_Wv7uJ?`xj#E@`{Fu zlfN1@*1qV;^GV}Z@Ay;nyvDd4cJ;aH&X5R7xP83p+N*H9D!tpOThJWr1z0jJtL~Z| zKemDbIMWK;g&k88G#(OWWJ+WbYj27bnov-|C}C8w_n#F^gO#j$a65hsdk+ov9=bh? zxu_nZJ*xyjfk1&U3Owm(J!R_8Vd_cl8YSfJCjZkNYo!U8y9-J*s%Z8`g@;5FI^1PS z1Xbkyvw{gUlT|Otjvr$IUUZVZ6fD3)fyRqL%qZa`Uiwcl4vHo;RA`jwRI%^P3Y{hd z9UhWW5>?!Iqry|73E7TyP@p;POw{PV;yhC*5OfxC~x-G|(L;I5Vuq=9W|i4u*( zW8M&JHm2KH=dc2o8Cgu&*ajm*t!`IcB%A6YTeGT*@{egjR)_y-rMfVb^Wt)?xV)?c zHyzW$IbA~f$FvMLkD!0L(do0%kC$4O4yUYQqaP3>LM!}$I1wuG1JZ~zkVd2v=^&j* z5DAa~`AQ&P$wogQnMel7L<*4tQivE412G~_#6g@$Bho+`kxrz8bRt0{Kmt@w0+o|& z^aGNKWROgx5Gf#qh!HUmBjQ9H#ECQ_4Wtq2L^?<(5<~(dKz@>)|Hpgp|M^fLp~~i| z`pJ$`zmPdQ-s)KPL7I4cyK9wkHJ_FH_2)$=rPJOu0*Wf3id+?xdObPRVc_eS=vjNp zjp^{X(p@e2uk)ifMP3tk&u^+2`{fW+Q7J=d^xG37hSnY7T4iRv#x-5ppF7HRKi=T15^0}<@3GsJ$Sr?vttXZ2`g!8X1-JgV6=1qDl$L$@b=6;2jF8)073G5@mkw$hc@=jnb@sv3;F8&U4sIL&TcsRTsJwheB(UR zRYPfbz*GCnUvA~P-?|kS-Oe{DeL?l2ywuBG4wYUoWZ8{_i%eG?rGX!PSfj$jXItiX zc)uk-K3hG|_uDlWj*ao`e5G&poHOsonyvz+<$pSyzCZbkp%H)m@V4~z{=agM#V%a( z$HPgtU8g2>i=A}N;Tj;})0T@v79d0Re?Rd4$JRA=PJn_^zi~U>Z9S^|@Ex+}tHL@l zyH~8;9=&kS`TZ3l6K{4q=-JD3Whf07b6h{!I$_hR+DYHM&Wc++?!&lBm!8l2zUrRs zYv(k6y4YL{M`_5Bp5<@a+Ll|ox$OB_jWZ6s{^3Bq{Gi{$GS77g8W+9$is`DMG=(iw611rPmAfr`KaJ@f<^N*Y#9>cLFC8=RLQ0hBs-x87Rm-0`_FYkX(1niTl;4F; zS6_d;E9Hw`hZ_DeYq!YgGv9O-D2?gkHgEFbzn*6dzk7E5JNfSE^?FQhu?Q}Q0iJW>)FG-Et5TC4#o5+(fR7GqbqtnO08}mI;#8JUUR$bbhrk}D6N_F za^xTHcDl2n>ey+O$G#rbzhCp~6NaTXInig{%PIXnPd8l^Jk37H+^4$F&pLnHCHd>! zaep2S`EYjM&pYpUS#fdQzOgS#o2Cq=alcFJd8~Vp7@s=g_`aBTa>CRt<@|%srSHvF zC!Q(!#5Cn74ZAs{&9UB-&Xq}Dba%kL4G$MQ8MUSF@~ur84!L%@_5f{=>8hbLV9dqn zz~jN~*LZz#C~(FX{iY@loLw$(M|)owt4LhR5&q+45pV+ZfYTpwy#jJKwaPn?oy>O9^CN4-0&AO`@}w+ za;^8mjjtESzIe}e@%xJJ=e06j8A{9YGhK5IN0qC0p>>t8j(I<({?K~v2VtpmPt6ED z_~WF{zA;@nN=uY{bU3VN&)TA~4d1(@UjOLm{bf%ozWZBhs2c0r_?i0-(^W%ht(-2a z4|Eozem>=sy0YSs(>(q-fjxkzQ+m*|H?)vFR#MTDjKG8#X5Ud6h|@dv|r@gdsyG4iij#^Ymy@#>NEp zo43O?SVF01`wvf7P44G<^XTkJt2Qkz$ZP!m*{F-}zP<6~fv=wT-bQaTcmoNRQ5xfW zXvy|R4Xd1-u&L(xAGTlI_hQhHj#pfwW?qlG`D8)HGt*T;X+XratUo}K+|-i4ht zU;aL9XP@lI8wbW#sA9TmD6Q%; z;`GK0kD>`pPkEQT`Cxs!m3u!}9r1M1<&RITt6p&JlIg0Ww9K?8@9Yk=KZ*aSi_clU zCB50+H47GX`)u^;xt^!$xBF|1=_*hfdA74#RE5m=@dxjG@s+eZ=*D|VYcKUU8!*51 zo$q#Ra2xM%4Utglec#@H^^1c$j%^)NZiUAP_l;3c-@3kGQgXm?m)V`B>xB;25E-RW zga7ty(BQ&5cjg~nae1WZ^nTfU;uFtbJH!P(lI9O;ns2%)D0PXNk>2xQT8Hq_JaOR3 zr5R&?nKF9D)G71wR~Mxne7AL)>B>+Vr|hm#Fre$%1*Z>;3RwS5;3`|UW52~-d$zw} zc-v|-zW&y9ddeheM^C^0fBF4zF>7D9 zugW)U)@c6PKQmsOpOpId`I@s#SAo*X=MN5!J~egsuH@ktYw!AdW0}7{FDptHwrpAI z?Y0kNPQB}J4V6$T*LwM2$u2$lVXNF0Zf!gDvv!vwPs}dy!*?@>@2u2deCJsor7bsI6_i$)RDaU2X_^80}08CBNUCU0q1G}d!xLf=mZ^!lN2 ze3L)c4~eQ8X1a2ehCfZdJ$J>3p1n48_~<~T5ob0(&q+DC^xV3GBTo0IDSu)<3qm!N z`n~NtvDMV7M>{OKU*p@JKTjH(@Ui=s!SjC^(=W2Y-kH729Y3Y_3(HG%%;|^Ex@bcR#K6_?>SbZ<^NjjJJDE z|I@2#OiO01(+5U6)>>Yo(m~lbD}Fvjz8CoI@#S3y|Fkl(+M1KL6HA+ypH*V<58Ztn zuH|KvmVfwU%6F3kJP#*K`t3^ejl#lbyBB`>mUd4%)N7`#&hm$*tAf&qkpZ_F&8qR$ zn#>awR^?64e6A=f*LB|*yroy~L+`H~>1Mhzl$N{Qc=DG^hKwmwV)*=`3P;M;dice% zW8L?RoHlm)@ey4=d}+FJlm=gaQlrl(IV3u!O}~&6KQ75GpL=i7-^wR@LX3eK$_rbux59_Qh|%-}(2??T1AF`0H@fRYz%L^4Ifr%(s71 zd#AQ9`}nXA*Y`;HlTDly@ySZ9R_=kqex|EHsZaF$pQ7hw&Y3u8#lvb}|8j1`xwTzG z>-;)+T~f#1QxnF_bGU{{C=Hw9RnBA7hiS_$o%Bt;^T*wglk>lvefD8NyAiYO>u29c za=3=cC=Dn|Q!i`{y&gDZ=;uju`oB{)x9yS}*T$56)UQ{HGO+vs(^VnYgVoLluI*i^ zTF#K1%s>4e`8|oM{@&2w&Jn+VK09W~wpFGpBiF^1KRY%)(R14UQ=Q{yr}Ya=J`mxV z)}?Xfr|qOeETgmO%266MtXtZHdTUP40q4r#hEh;eSoEsDpH02^ zYPZ9+f{fBit`mk{u5e~O8SyP;o~ zo^WzNY+gp0$;;+?$8?xGGOSDX;D?QmR_U+xcgW){hbokw zy-8Xe-1x^ocOE&qrlaM`Q5s(4_Q&2K`!>hSd3y5k+U%qe-P|XQ`zExi+Vb1Kca5G{ z-(0JPQokuJCq(SJG<^Eb%!&^BR3xcif2M=2~@>`YdR$Hmu;{ zy?eLwV#W_Un6PqupLJTD>of4c=_#uRO-jAD z$l)3;qtvxu+3BMidSz{WnWsFvIHS$fk)N(CwZ`?>ppLDh-r89<&vaE#8glWM%&%T*zoM2G7bIuya(lga`zDX)0S8T2hSK0k1M3fa&^~5Y+1^9n&GdiR?sxBX zNdq=dNo}5Z^;h@XiKZ(@smq@CujaYg=Y2A~WsgoHN3Xm3WdCyeq7TlUSmHi;S<|df zOjix1wN{*)Ii_aj%*YFWcZv15xGp_8YGu{1$2*2LyX%>$uODc->L`u)=22K&-!At` zd{TYjlDS`$&8*+O$AF-Ijk`=pY;x(x)WfE$Kxw(Jx@K=YlHPdB&ajqOf8Ut-)2qq1 zeU^J<|K5E^NB_8;jUBEL5=u*N+$M>?$K)~ zhiin4(#o6W4wmY3{|!;?yALWc=)K$!@8)+l)IOCmu73H|t2zXmt_n(H=YIMy*mmH{ z%XK5at^BCY%YdbyJV}1GFRyS^x&9^Vc(pcN8A{#0-}0_v(+*nG`*C@}}XfKdU>SS)*^h zxx4+l+Ud(i?^kv@Tq{Z_bxE8xK<%-1-A9K8{+7I}^~mp=uAQb-P2Cz;e&o;bf3>*g zaIGk#G%n^_kNndQM%9{B^nLUF-q*T5O4!kOR_w)Ehemz}OkVUVe-BpGDtD#=7armm7=kg2Q046=0GAWNqa z1zS4ZAWJ69|3bP9qAnbh<&7P8ekBq9lV%U6f2z z-qb}Y2AR4jW{{=h23b0dD9qC723a~`kg2OI8D#1z%S07SU1h}}Q&*W8Wa+p;mQEuI zw{*HemQEOC>Z(WvnYt=6QG}_hq8McAsxX5r9XH6*X+#w*ooOXo-mKNz&ep zmT@CpR->7n9=Y+T*)eQWqjmd#y_ax%&V zJ1E%3a4S`|&B!V&RHLzafW5G=&}(LvT9G@3s|XBN%I?Sl*0=o!%8JZ-s`P-q^MdZ<&Uj-eH!vgyAr!cbMrN zC1}{`9cFq*=``&0##71gj?!q@>0RFRj^Y?D@ANKjc{3VzdY8An6&iMW$sreUXdu;ndbIN0eOYcaZ5_iDNj( z=^bQwGa7b!2U*?<4LiN@cH!`rY1ruFsZNR}?ht^!7Ks zE9x}t^!7KsD{3_C^v34_qa{8a;I+!~#_K7!XW``(!>S*{R8@S0!90lcRq-hWCLlqC z4<8#+M*T>$A~BqHbnNEag$K^H)}7zGpvT>$A~ z7!h=VhK>_K7ij1-BIp7Qoem0uF3`{kBItrhS4|>iy&Q1Mg(0&L&u4r zt7zyn`nHb^yU*rTP%w_^NKxfEBa29Y6pM_11CN2oF-iX%uEy|URDfDBGN4|J94LxW zvta`kqYjjdQ2-Su;-AN{2a8b#@?ungS}`)9UW^d+G3r3M7zI#qqPqlS#V7-LF)BdK zK(5xr*Ff-f2Zw0l? z1(h5WBcYO0rACz+h>?p?ljguUNj&am6P6k(%ZAfTV0mUis5j4k$nCTP8 z9hHv$aT*ckswz~e6LGlcM1n{IkxOlfNVg#&l8FRJCQ?AP>6p|wjhKNwpe!x0n%bOZ zIY^;74df|7X;kWFrME>C+mN8Lj$-KyVxT$iC%r?@H_8y>-o{NoViV_O!Vor^G5t{%V5gMhFhi@k!BuVUEMOJMb{NH$IwDx zVet|O3(NQ4%+CB8_gmnrldQmX`n7Ns&u<7Kl&yh5ay zXCj_~Xx;G)E#f)N5pimvfv}g55a~3h(-o{Es8)b$GtAO*>Pet_P{wi0)su;2b3fHn zK;GQk&-EB629@;~={Qw#kU~0*NV9ahLq}Rv3J0NoJ?dXy0@Hr3FJZR645|;Rr_-E5 zq?kVS8Ho0pw=u^--k|#AT3-Xv@t2WEr<0E6bea>O(je?LFSUULB9{hK*+2$iT}Wt7 z0g+2-Msp0*K*1cNIZi}J4?~*Oz;xakXf&(Std5R`QVh3w@yj-i>r^A#U`q-CD#h{DF48xaOlnMXjb+?0``7QQK#Woa z!o~_6j*o&RH)h6{QXF%f=8Ti=nA2eUuirdzNOh9x#kK;{fBkxiAx)4VO^}?@1R2tQ z{SJvks*tq!U=kRuLbBzDH&}Np^hKS*TcZ}0nbSAKZ(fnh`^SFy!!P^6;Gl*5?u2-$ z3EVjD1Ue@P8rk5~;;8Af5(aD&T85+|7k88YWdNP6>4ge;rvTkEUKujPHnY+w0-lMCOfVvGp}P4$yl*@?Em$aCGJK_#ZSN{ zI4yV<(rx}k*>O9xi9$C=6S+yuAYl?GO43czh>|UxZp>LEj5+S8Y$_QfOp=M3NG2%; znYyNoh&Cs^J~YMI#XZxeI^C3QD(F$ccY&L7o2tnF{jRHVYgSSIdy#Q#R$=C?*`^w9 z%{JAYw`QB-DI?KZjN2Ve8SQT8U63ZSIjmq9r_sFGilcH=<9Kk0)^M^ghjCykE}mJP z%pJo`1Pya*7|%w-q=}AUJV&i+YgnUd=P)jZqncB-ZdE4=bC_W`Q8y&EY734W~~I z*C;R@QY6E{DoBy-D$X!hQxt4a#VA#^bnBu*P9MKMV;HcX1KRhmh(VVc1z zMYE~R{$(#18>SiiA2v)goHgTKeu|C_lOmiOCPk+WgS8mfBZcEsVEyLR!-5^djD{s^ z7)NCc;}~(`baS}CIHh!Eb!>GFQ_b+=0U1aT(dz>msVOp%0F?pZ$4hOF7XyQuOGL6o zRM}jy$f#r%F`DBRaU#tkjYzjhClVG3P^v_vp*vNk$|j}CM2bZU5d&c_sikzs$ALr{ zxp4m8ihX7Ll4@+OaoDs#xEMPqmD2{nSyEFuS!u>AUaDpr=L*st1Y0##pb1VHeb7sj zkYgvR-io7PvW%RWmT59sHq&fsnhar@Vwj{UhGiOakVG@wvf=-*(JUM6InxG1YMPE> zx)^D?!$??6R_PKbO<yD6 z1`iF*Gc*wP9W~F;k>iO*&VOdWo+hOPxORta4T zMzb8VbP8K=W1THDlQRsh4r-xcR>o>t2+IjduC|mcr6+u+FBwdvmr5@TFWLIPOTMCYZ*>DoLV!}$y*|) z*4%Px&B;k4CAzlO98S8)4ktlQI%XN1+DMj@OipcN%c%`mZKIGa;g;QHP z&bAsTRRL+F)JW>RZ~h+8CxG?UtJBHg4+gM>vI z=CUM?lNJ^aqlN9FattDY7Yyql&qkB2NXAI{pxliiI67lQz|k zcT>C}E0{nBJXjrUD7MS!Kt&3oj>r%NA~!{L86EK8?7%Upp@W8~qXV(9iZyhwYt9aK z*`~Ia>~Kev5g}@?AnJ(B6t$Po0S{IO4+)c;{@xN%v#S{#QMZaYI<)7`4(+K}*x_zd zJ4lEq?jR#-h>9f=)Ik(?P%z2pk1`Rt9lH!sGmASgbijjkmfF*#ZihRfK!m8Hgvb$P zOQfSi2i@wB@7AmK4BjWVee?SD`*e8tXI||GfsgL_uB*Gw{o@%W=boLXcEsncDqXIP z40t8Pt} zwv4r*O}1jT$(FD-JXmY%#4*XR77dZxF@>lh%80rpVpv-?bFM9lFFbPcgDIP%3Wm4I zt#{hBpvAV`2a2+rZq9J~@YNp|`l{K&o*#aD&9*^z2maR5|)+U^5%ce;MYvG6tQ6O?Vgov6c>a1XGcrc$c`M$4b z4qd-sm~t+@>)UISe|+WLxcR2mg9a=ucc^~7N>irJS3B$We2?LuJ^13+&}|#~?VnSS zR$+PTg|8MqS~Jjf(1OJH)k~^8S33)=4Q;zfRvR5_>#RH1)>*-%jI}UC1yM(2hyszD zqAoJlh6ihHQ5nYvcl~mW_n?kr$G%>>N~^J>#QV>_S~{ZVyu8{)TNBQxT{L@sT>kVv zoyv{7Tx#^d`_(HhYq71QSA3gk6E9x6KdW~6r2d&|7aeQU&_-BoG_0+Q=3HAB*`{`t z>{u6~jELf{3Zjn4Oi@<}Yr}(cZMVBT%1fC3;r*Q*ZtorXb%9Itk-aZ&6kW-vb+1$Z z7faiyUAaBqf76s%@}c0P`}$TM>F?3A^|qh9zF*{$_Fc6Y-wDb``xdHQHLQ)==vEt! zwRPprwRM#+DePF6P3*+qHc*8I^-~C2TvW7 z0`GXjruLN3fg#FPv7ipZ*&&A}6*zK4hDaiAhY(RSMLiXCz=QRUSB8po{E0ag33SkG z1+FTSta2Sadg{&|Jr$eEWOy<}1yM(2hyszDA||5;9;_Zd9FrP)Xoxy`kVsg?8agn| z*@4M6Rh8^;N0bpEQWZpqRA!1)2_5iYbxAwu3uMihvOxwc*s z4hRp{g;zNy(L>b`xgAr88lsG-TOzvfy^1eh9I*Jr@ z5Qq%U6uBKjM9mcC(S^r@b;^1%OzJ4+hvv~g6e%|q)eA~KC{GiR#9(Mfdr%NXzKkcUWR_ytHhjUh5obvYV zR%_nlQ;#XrubsTr&%62QQEhG>cj@zD%xbka4kS;pslDkyu-4w1JwLems-%?r??kwr ztA1qo$_r_ac9%N3ea68{p)EpW7DR}5dd+0GZA3ICu>{?*v&eRGohJ}+w2@#3-%)~C;HuJ)1a z`4viKxrfXc^Za_%WLv>C-$_?C-m}%c;yQZItwxic=f8hM?c=y2GEOA^4+(f=o{kU0 z_|OZo(f3FT)fPeK|L;fQ4___I>o=&+kj{~Qa*6McueuPiVdlbCiGJM{RK9&>PF3GU c$A&E(;B(gX(&jGB@`k)Suvc@*(_f1Je+%#)uK)l5 diff --git a/releases/dev/verifier/verifier.sol b/releases/dev/verifier/verifier.sol index c0f46233..1e874311 100644 --- a/releases/dev/verifier/verifier.sol +++ b/releases/dev/verifier/verifier.sol @@ -75,7 +75,7 @@ contract Halo2Verifier { mstore(0x600, mod(calldataload(0x560), f_q)) mstore(0x620, mod(calldataload(0x580), f_q)) mstore(0x640, mod(calldataload(0x5a0), f_q)) - mstore(0x80, 390330814115173750526380320564184081440196244988022584520359727231485894627) + mstore(0x80, 9514323097321245931419041477139106601771148851610395955023397192525359125626) { let x := calldataload(0x5c0) @@ -287,1203 +287,1212 @@ contract Halo2Verifier { mstore(0x11a0, mulmod(mload(0x1180), mload(0x1180), f_q)) mstore(0x11c0, mulmod(mload(0x11a0), mload(0x11a0), f_q)) mstore(0x11e0, mulmod(mload(0x11c0), mload(0x11c0), f_q)) - mstore(0x1200, mulmod(mload(0x11e0), mload(0x11e0), f_q)) mstore( - 0x1220, + 0x1200, addmod( - mload(0x1200), 21888242871839275222246405745257275088548364400416034343698204186575808495616, f_q + mload(0x11e0), 21888242871839275222246405745257275088548364400416034343698204186575808495616, f_q + ) + ) + mstore( + 0x1220, + mulmod( + mload(0x1200), 21888237653275510688422624196183639687472264873923820041627027729598873448513, f_q ) ) mstore( 0x1240, mulmod( - mload(0x1220), 21888240262557392955334514970720457388010314637169927192662615958087340972065, f_q + mload(0x1220), 13225785879531581993054172815365636627224369411478295502904397545373139154045, f_q ) ) mstore( 0x1260, - mulmod(mload(0x1240), 4506835738822104338668100540817374747935106310012997856968187171738630203507, f_q) + addmod(mload(0xa80), 8662456992307693229192232929891638461323994988937738840793806641202669341572, f_q) ) mstore( 0x1280, - addmod(mload(0xa80), 17381407133017170883578305204439900340613258090403036486730017014837178292110, f_q) + mulmod( + mload(0x1220), 10939663269433627367777756708678102241564365262857670666700619874077960926249, f_q + ) ) mstore( 0x12a0, - mulmod( - mload(0x1240), 21710372849001950800533397158415938114909991150039389063546734567764856596059, f_q - ) + addmod(mload(0xa80), 10948579602405647854468649036579172846983999137558363676997584312497847569368, f_q) ) mstore( 0x12c0, - addmod(mload(0xa80), 177870022837324421713008586841336973638373250376645280151469618810951899558, f_q) + mulmod( + mload(0x1220), 11016257578652593686382655500910603527869149377564754001549454008164059876499, f_q + ) ) mstore( 0x12e0, - mulmod(mload(0x1240), 1887003188133998471169152042388914354640772748308168868301418279904560637395, f_q) + addmod(mload(0xa80), 10871985293186681535863750244346671560679215022851280342148750178411748619118, f_q) ) mstore( 0x1300, - addmod(mload(0xa80), 20001239683705276751077253702868360733907591652107865475396785906671247858222, f_q) + mulmod( + mload(0x1220), 15402826414547299628414612080036060696555554914079673875872749760617770134879, f_q + ) ) mstore( 0x1320, - mulmod(mload(0x1240), 2785514556381676080176937710880804108647911392478702105860685610379369825016, f_q) + addmod(mload(0xa80), 6485416457291975593831793665221214391992809486336360467825454425958038360738, f_q) ) mstore( 0x1340, - addmod(mload(0xa80), 19102728315457599142069468034376470979900453007937332237837518576196438670601, f_q) + mulmod( + mload(0x1220), 21710372849001950800533397158415938114909991150039389063546734567764856596059, f_q + ) ) mstore( 0x1360, - mulmod( - mload(0x1240), 14655294445420895451632927078981340937842238432098198055057679026789553137428, f_q - ) + addmod(mload(0xa80), 177870022837324421713008586841336973638373250376645280151469618810951899558, f_q) ) mstore( 0x1380, - addmod(mload(0xa80), 7232948426418379770613478666275934150706125968317836288640525159786255358189, f_q) + mulmod(mload(0x1220), 2785514556381676080176937710880804108647911392478702105860685610379369825016, f_q) ) mstore( 0x13a0, - mulmod(mload(0x1240), 8734126352828345679573237859165904705806588461301144420590422589042130041188, f_q) + addmod(mload(0xa80), 19102728315457599142069468034376470979900453007937332237837518576196438670601, f_q) ) mstore( 0x13c0, - addmod(mload(0xa80), 13154116519010929542673167886091370382741775939114889923107781597533678454429, f_q) + mulmod(mload(0x1220), 8734126352828345679573237859165904705806588461301144420590422589042130041188, f_q) ) mstore( 0x13e0, - mulmod(mload(0x1240), 9741553891420464328295280489650144566903017206473301385034033384879943874347, f_q) + addmod(mload(0xa80), 13154116519010929542673167886091370382741775939114889923107781597533678454429, f_q) ) + mstore(0x1400, mulmod(mload(0x1220), 1, f_q)) mstore( - 0x1400, - addmod(mload(0xa80), 12146688980418810893951125255607130521645347193942732958664170801695864621270, f_q) + 0x1420, + addmod(mload(0xa80), 21888242871839275222246405745257275088548364400416034343698204186575808495616, f_q) ) - mstore(0x1420, mulmod(mload(0x1240), 1, f_q)) mstore( 0x1440, - addmod(mload(0xa80), 21888242871839275222246405745257275088548364400416034343698204186575808495616, f_q) + mulmod( + mload(0x1220), 11211301017135681023579411905410872569206244553457844956874280139879520583390, f_q + ) ) mstore( 0x1460, - mulmod(mload(0x1240), 8374374965308410102411073611984011876711565317741801500439755773472076597347, f_q) + addmod(mload(0xa80), 10676941854703594198666993839846402519342119846958189386823924046696287912227, f_q) ) mstore( 0x1480, - addmod(mload(0xa80), 13513867906530865119835332133273263211836799082674232843258448413103731898270, f_q) + mulmod(mload(0x1220), 1426404432721484388505361748317961535523355871255605456897797744433766488507, f_q) ) mstore( 0x14a0, - mulmod( - mload(0x1240), 11211301017135681023579411905410872569206244553457844956874280139879520583390, f_q - ) + addmod(mload(0xa80), 20461838439117790833741043996939313553025008529160428886800406442142042007110, f_q) ) mstore( 0x14c0, - addmod(mload(0xa80), 10676941854703594198666993839846402519342119846958189386823924046696287912227, f_q) + mulmod( + mload(0x1220), 12619617507853212586156872920672483948819476989779550311307282715684870266992, f_q + ) ) mstore( 0x14e0, - mulmod(mload(0x1240), 3615478808282855240548287271348143516886772452944084747768312988864436725401, f_q) + addmod(mload(0xa80), 9268625363986062636089532824584791139728887410636484032390921470890938228625, f_q) ) mstore( 0x1500, - addmod(mload(0xa80), 18272764063556419981698118473909131571661591947471949595929891197711371770216, f_q) + mulmod( + mload(0x1220), 19032961837237948602743626455740240236231119053033140765040043513661803148152, f_q + ) ) mstore( 0x1520, - mulmod(mload(0x1240), 1426404432721484388505361748317961535523355871255605456897797744433766488507, f_q) + addmod(mload(0xa80), 2855281034601326619502779289517034852317245347382893578658160672914005347465, f_q) ) mstore( 0x1540, - addmod(mload(0xa80), 20461838439117790833741043996939313553025008529160428886800406442142042007110, f_q) + mulmod(mload(0x1220), 915149353520972163646494413843788069594022902357002628455555785223409501882, f_q) ) mstore( 0x1560, - mulmod(mload(0x1240), 216092043779272773661818549620449970334216366264741118684015851799902419467, f_q) + addmod(mload(0xa80), 20973093518318303058599911331413487018954341498059031715242648401352398993735, f_q) ) mstore( 0x1580, - addmod(mload(0xa80), 21672150828060002448584587195636825118214148034151293225014188334775906076150, f_q) + mulmod(mload(0x1220), 3766081621734395783232337525162072736827576297943013392955872170138036189193, f_q) ) mstore( 0x15a0, - mulmod( - mload(0x1240), 12619617507853212586156872920672483948819476989779550311307282715684870266992, f_q - ) + addmod(mload(0xa80), 18122161250104879439014068220095202351720788102473020950742332016437772306424, f_q) ) mstore( 0x15c0, - addmod(mload(0xa80), 9268625363986062636089532824584791139728887410636484032390921470890938228625, f_q) + mulmod(mload(0x1220), 4245441013247250116003069945606352967193023389718465410501109428393342802981, f_q) ) mstore( 0x15e0, - mulmod( - mload(0x1240), 18610195890048912503953886742825279624920778288956610528523679659246523534888, f_q - ) + addmod(mload(0xa80), 17642801858592025106243335799650922121355341010697568933197094758182465692636, f_q) ) mstore( 0x1600, - addmod(mload(0xa80), 3278046981790362718292519002431995463627586111459423815174524527329284960729, f_q) + mulmod(mload(0x1220), 5854133144571823792863860130267644613802765696134002830362054821530146160770, f_q) ) mstore( 0x1620, - mulmod( - mload(0x1240), 19032961837237948602743626455740240236231119053033140765040043513661803148152, f_q - ) + addmod(mload(0xa80), 16034109727267451429382545614989630474745598704282031513336149365045662334847, f_q) ) mstore( 0x1640, - addmod(mload(0xa80), 2855281034601326619502779289517034852317245347382893578658160672914005347465, f_q) + mulmod(mload(0x1220), 5980488956150442207659150513163747165544364597008566989111579977672498964212, f_q) ) mstore( 0x1660, - mulmod( - mload(0x1240), 14875928112196239563830800280253496262679717528621719058794366823499719730250, f_q - ) + addmod(mload(0xa80), 15907753915688833014587255232093527923003999803407467354586624208903309531405, f_q) ) mstore( 0x1680, - addmod(mload(0xa80), 7012314759643035658415605465003778825868646871794315284903837363076088765367, f_q) + mulmod( + mload(0x1220), 14557038802599140430182096396825290815503940951075961210638273254419942783582, f_q + ) ) mstore( 0x16a0, - mulmod(mload(0x1240), 915149353520972163646494413843788069594022902357002628455555785223409501882, f_q) + addmod(mload(0xa80), 7331204069240134792064309348431984273044423449340073133059930932155865712035, f_q) ) mstore( 0x16c0, - addmod(mload(0xa80), 20973093518318303058599911331413487018954341498059031715242648401352398993735, f_q) + mulmod( + mload(0x1220), 13553911191894110065493137367144919847521088405945523452288398666974237857208, f_q + ) ) mstore( 0x16e0, - mulmod(mload(0x1240), 5522161504810533295870699551020523636289972223872138525048055197429246400245, f_q) + addmod(mload(0xa80), 8334331679945165156753268378112355241027275994470510891409805519601570638409, f_q) ) mstore( 0x1700, - addmod(mload(0xa80), 16366081367028741926375706194236751452258392176543895818650148989146562095372, f_q) + mulmod(mload(0x1220), 9697063347556872083384215826199993067635178715531258559890418744774301211662, f_q) ) mstore( 0x1720, - mulmod(mload(0x1240), 3766081621734395783232337525162072736827576297943013392955872170138036189193, f_q) + addmod(mload(0xa80), 12191179524282403138862189919057282020913185684884775783807785441801507283955, f_q) ) mstore( 0x1740, - addmod(mload(0xa80), 18122161250104879439014068220095202351720788102473020950742332016437772306424, f_q) + mulmod( + mload(0x1220), 10807735674816066981985242612061336605021639643453679977988966079770672437131, f_q + ) ) mstore( 0x1760, - mulmod(mload(0x1240), 9100833993744738801214480881117348002768153232283708533639316963648253510584, f_q) + addmod(mload(0xa80), 11080507197023208240261163133195938483526724756962354365709238106805136058486, f_q) ) mstore( 0x1780, - addmod(mload(0xa80), 12787408878094536421031924864139927085780211168132325810058887222927554985033, f_q) + mulmod( + mload(0x1220), 12459868075641381822485233712013080087763946065665469821362892189399541605692, f_q + ) ) mstore( 0x17a0, - mulmod(mload(0x1240), 4245441013247250116003069945606352967193023389718465410501109428393342802981, f_q) + addmod(mload(0xa80), 9428374796197893399761172033244195000784418334750564522335311997176266889925, f_q) ) mstore( 0x17c0, - addmod(mload(0xa80), 17642801858592025106243335799650922121355341010697568933197094758182465692636, f_q) + mulmod( + mload(0x1220), 16038300751658239075779628684257016433412502747804121525056508685985277092575, f_q + ) ) mstore( 0x17e0, - mulmod(mload(0x1240), 6132660129994545119218258312491950835441607143741804980633129304664017206141, f_q) + addmod(mload(0xa80), 5849942120181036146466777061000258655135861652611912818641695500590531403042, f_q) ) mstore( 0x1800, - addmod(mload(0xa80), 15755582741844730103028147432765324253106757256674229363065074881911791289476, f_q) + mulmod(mload(0x1220), 6955697244493336113861667751840378876927906302623587437721024018233754910398, f_q) ) mstore( 0x1820, - mulmod(mload(0x1240), 5854133144571823792863860130267644613802765696134002830362054821530146160770, f_q) + addmod(mload(0xa80), 14932545627345939108384737993416896211620458097792446905977180168342053585219, f_q) ) mstore( 0x1840, - addmod(mload(0xa80), 16034109727267451429382545614989630474745598704282031513336149365045662334847, f_q) + mulmod( + mload(0x1220), 13498745591877810872211159461644682954739332524336278910448604883789771736885, f_q + ) ) mstore( 0x1860, - mulmod(mload(0x1240), 515148244606945972463850631189471072103916690263705052318085725998468254533, f_q) + addmod(mload(0xa80), 8389497279961464350035246283612592133809031876079755433249599302786036758732, f_q) ) mstore( 0x1880, - addmod(mload(0xa80), 21373094627232329249782555114067804016444447710152329291380118460577340241084, f_q) + mulmod( + mload(0x1220), 20345677989844117909528750049476969581182118546166966482506114734614108237981, f_q + ) ) mstore( 0x18a0, - mulmod(mload(0x1240), 5980488956150442207659150513163747165544364597008566989111579977672498964212, f_q) + addmod(mload(0xa80), 1542564881995157312717655695780305507366245854249067861192089451961700257636, f_q) ) mstore( 0x18c0, - addmod(mload(0xa80), 15907753915688833014587255232093527923003999803407467354586624208903309531405, f_q) + mulmod(mload(0x1220), 790608022292213379425324383664216541739009722347092850716054055768832299157, f_q) ) mstore( 0x18e0, - mulmod(mload(0x1240), 5223738580615264174925218065001555728265216895679471490312087802465486318994, f_q) + addmod(mload(0xa80), 21097634849547061842821081361593058546809354678068941492982150130806976196460, f_q) ) mstore( 0x1900, - addmod(mload(0xa80), 16664504291224011047321187680255719360283147504736562853386116384110322176623, f_q) + mulmod(mload(0x1220), 5289443209903185443361862148540090689648485914368835830972895623576469023722, f_q) ) mstore( 0x1920, - mulmod( - mload(0x1240), 14557038802599140430182096396825290815503940951075961210638273254419942783582, f_q - ) + addmod(mload(0xa80), 16598799661936089778884543596717184398899878486047198512725308562999339471895, f_q) ) mstore( 0x1940, - addmod(mload(0xa80), 7331204069240134792064309348431984273044423449340073133059930932155865712035, f_q) + mulmod( + mload(0x1220), 15161189183906287273290738379431332336600234154579306802151507052820126345529, f_q + ) ) mstore( 0x1960, - mulmod( - mload(0x1240), 16976236069879939850923145256911338076234942200101755618884183331004076579046, f_q - ) + addmod(mload(0xa80), 6727053687932987948955667365825942751948130245836727541546697133755682150088, f_q) ) mstore( 0x1980, - addmod(mload(0xa80), 4912006801959335371323260488345937012313422200314278724814020855571731916571, f_q) + mulmod(mload(0x1220), 557567375339945239933617516585967620814823575807691402619711360028043331811, f_q) ) mstore( 0x19a0, - mulmod( - mload(0x1240), 13553911191894110065493137367144919847521088405945523452288398666974237857208, f_q - ) + addmod(mload(0xa80), 21330675496499329982312788228671307467733540824608342941078492826547765163806, f_q) ) mstore( 0x19c0, - addmod(mload(0xa80), 8334331679945165156753268378112355241027275994470510891409805519601570638409, f_q) + mulmod( + mload(0x1220), 16611719114775828483319365659907682366622074960672212059891361227499450055959, f_q + ) ) mstore( 0x19e0, - mulmod( - mload(0x1240), 12222687719926148270818604386979005738180875192307070468454582955273533101023, f_q - ) + addmod(mload(0xa80), 5276523757063446738927040085349592721926289439743822283806842959076358439658, f_q) ) mstore( 0x1a00, - addmod(mload(0xa80), 9665555151913126951427801358278269350367489208108963875243621231302275394594, f_q) + mulmod(mload(0x1220), 4509404676247677387317362072810231899718070082381452255950861037254608304934, f_q) ) mstore( 0x1a20, - mulmod(mload(0x1240), 9697063347556872083384215826199993067635178715531258559890418744774301211662, f_q) + addmod(mload(0xa80), 17378838195591597834929043672447043188830294318034582087747343149321200190683, f_q) ) mstore( 0x1a40, - addmod(mload(0xa80), 12191179524282403138862189919057282020913185684884775783807785441801507283955, f_q) + mulmod(mload(0x1220), 6866457077948847028333856457654941632900463970069876241424363695212127143359, f_q) ) mstore( 0x1a60, - mulmod( - mload(0x1240), 13783318220968413117070077848579881425001701814458176881760898225529300547844, f_q - ) + addmod(mload(0xa80), 15021785793890428193912549287602333455647900430346158102273840491363681352258, f_q) ) mstore( 0x1a80, - addmod(mload(0xa80), 8104924650870862105176327896677393663546662585957857461937305961046507947773, f_q) + mulmod( + mload(0x1220), 20169013865622130318472103510465966222180994822334426398191891983290742724178, f_q + ) ) mstore( 0x1aa0, - mulmod( - mload(0x1240), 10807735674816066981985242612061336605021639643453679977988966079770672437131, f_q - ) + addmod(mload(0xa80), 1719229006217144903774302234791308866367369578081607945506312203285065771439, f_q) ) mstore( 0x1ac0, - addmod(mload(0xa80), 11080507197023208240261163133195938483526724756962354365709238106805136058486, f_q) + mulmod( + mload(0x1220), 14874205783542236433261764022044465911656512639684999678853651860683757650009, f_q + ) ) mstore( 0x1ae0, - mulmod( - mload(0x1240), 15487660954688013862248478071816391715224351867581977083810729441220383572585, f_q - ) + addmod(mload(0xa80), 7014037088297038788984641723212809176891851760731034664844552325892050845608, f_q) ) mstore( 0x1b00, - addmod(mload(0xa80), 6400581917151261359997927673440883373324012532834057259887474745355424923032, f_q) + mulmod(mload(0x1220), 2579947959091681244170407980400327834520881737801886423874592072501514087543, f_q) ) mstore( 0x1b20, - mulmod( - mload(0x1240), 12459868075641381822485233712013080087763946065665469821362892189399541605692, f_q - ) + addmod(mload(0xa80), 19308294912747593978075997764856947254027482662614147919823612114074294408074, f_q) ) mstore( 0x1b40, - addmod(mload(0xa80), 9428374796197893399761172033244195000784418334750564522335311997176266889925, f_q) + mulmod( + mload(0x1220), 17011225028452114973964561549541821925778010085385130152192105634715080939230, f_q + ) ) mstore( 0x1b60, - mulmod( - mload(0x1240), 12562571400845953139885120066983392294851269266041089223701347829190217414825, f_q - ) + addmod(mload(0xa80), 4877017843387160248281844195715453162770354315030904191506098551860727556387, f_q) ) mstore( 0x1b80, - addmod(mload(0xa80), 9325671470993322082361285678273882793697095134374945119996856357385591080792, f_q) + mulmod(mload(0x1220), 1881761935718519990121799628252273658786792458106649887437395059872945867717, f_q) ) mstore( 0x1ba0, - mulmod( - mload(0x1240), 16038300751658239075779628684257016433412502747804121525056508685985277092575, f_q - ) + addmod(mload(0xa80), 20006480936120755232124606117005001429761571942309384456260809126702862627900, f_q) ) mstore( 0x1bc0, - addmod(mload(0xa80), 5849942120181036146466777061000258655135861652611912818641695500590531403042, f_q) + mulmod( + mload(0x1220), 21662285561588145310352318480822402603888953131447478827940284064946709915517, f_q + ) ) mstore( 0x1be0, - mulmod( - mload(0x1240), 17665522928519859765452767154433594409738037332395989540221744312194874941704, f_q - ) + addmod(mload(0xa80), 225957310251129911894087264434872484659411268968555515757920121629098580100, f_q) ) mstore( 0x1c00, - addmod(mload(0xa80), 4222719943319415456793638590823680678810327068020044803476459874380933553913, f_q) + mulmod( + mload(0x1220), 21846745818185811051373434299876022191132089169516983080959277716660228899818, f_q + ) ) mstore( 0x1c20, - mulmod(mload(0x1240), 6955697244493336113861667751840378876927906302623587437721024018233754910398, f_q) + addmod(mload(0xa80), 41497053653464170872971445381252897416275230899051262738926469915579595799, f_q) ) mstore( 0x1c40, - addmod(mload(0xa80), 14932545627345939108384737993416896211620458097792446905977180168342053585219, f_q) + mulmod( + mload(0x1220), 11770617947510597378885200406447716404126404817511323735042103519754393416137, f_q + ) ) mstore( 0x1c60, - mulmod(mload(0x1240), 1918679275621049296283934091410967415474987212511681231948800935495808101054, f_q) + addmod(mload(0xa80), 10117624924328677843361205338809558684421959582904710608656100666821415079480, f_q) ) mstore( 0x1c80, - addmod(mload(0xa80), 19969563596218225925962471653846307673073377187904353111749403251080000394563, f_q) + mulmod( + mload(0x1220), 13018529307372270489258244406856841315962482733096074798317807775255504614069, f_q + ) ) mstore( 0x1ca0, - mulmod( - mload(0x1240), 13498745591877810872211159461644682954739332524336278910448604883789771736885, f_q - ) + addmod(mload(0xa80), 8869713564467004732988161338400433772585881667319959545380396411320303881548, f_q) ) mstore( 0x1cc0, - addmod(mload(0xa80), 8389497279961464350035246283612592133809031876079755433249599302786036758732, f_q) + mulmod(mload(0x1220), 5276270562549512946272803945594037128265390012927669941530122528135796334063, f_q) ) mstore( 0x1ce0, - mulmod(mload(0x1240), 6604851689411953560355663038203889299997924520355363678860500374111951937637, f_q) + addmod(mload(0xa80), 16611972309289762275973601799663237960282974387488364402168081658440012161554, f_q) ) mstore( 0x1d00, - addmod(mload(0xa80), 15283391182427321661890742707053385788550439880060670664837703812463856557980, f_q) + mulmod(mload(0x1220), 1459528961030896569807206253631725410868595642414057264270714861278164633285, f_q) ) mstore( 0x1d20, - mulmod( - mload(0x1240), 20345677989844117909528750049476969581182118546166966482506114734614108237981, f_q - ) + addmod(mload(0xa80), 20428713910808378652439199491625549677679768758001977079427489325297643862332, f_q) ) mstore( 0x1d40, - addmod(mload(0xa80), 1542564881995157312717655695780305507366245854249067861192089451961700257636, f_q) + mulmod(mload(0x1220), 3194789416964050406424265110350613664596286587119568977604859939037397011192, f_q) ) mstore( 0x1d60, - mulmod( - mload(0x1240), 11244009323710436498447061620026171700033960328162115124806024297270121927878, f_q - ) + addmod(mload(0xa80), 18693453454875224815822140634906661423952077813296465366093344247538411484425, f_q) ) mstore( 0x1d80, - addmod(mload(0xa80), 10644233548128838723799344125231103388514404072253919218892179889305686567739, f_q) + mulmod(mload(0x1220), 3090451643741879200285099477849831179472024364989630500355756836624424014697, f_q) ) mstore( 0x1da0, - mulmod(mload(0x1240), 790608022292213379425324383664216541739009722347092850716054055768832299157, f_q) + addmod(mload(0xa80), 18797791228097396021961306267407443909076340035426403843342447349951384480920, f_q) ) mstore( 0x1dc0, - addmod(mload(0xa80), 21097634849547061842821081361593058546809354678068941492982150130806976196460, f_q) + mulmod( + mload(0x1220), 15927748781034921005593027077824543133423706442106451156060388409950986747549, f_q + ) ) mstore( 0x1de0, - mulmod( - mload(0x1240), 13894403229372218245111098554468346933152618215322268934207074514797092422856, f_q - ) + addmod(mload(0xa80), 5960494090804354216653378667432731955124657958309583187637815776624821748068, f_q) ) mstore( 0x1e00, - addmod(mload(0xa80), 7993839642467056977135307190788928155395746185093765409491129671778716072761, f_q) + mulmod( + mload(0x1220), 21594472933355353940227302948201802990541640451776958309590170926766063614527, f_q + ) ) mstore( 0x1e20, - mulmod(mload(0x1240), 5289443209903185443361862148540090689648485914368835830972895623576469023722, f_q) + addmod(mload(0xa80), 293769938483921282019102797055472098006723948639076034108033259809744881090, f_q) ) mstore( 0x1e40, - addmod(mload(0xa80), 16598799661936089778884543596717184398899878486047198512725308562999339471895, f_q) + mulmod( + mload(0x1220), 18627493688178473377890450102960302362510276568110871848038317193719995024144, f_q + ) ) mstore( 0x1e60, - mulmod( - mload(0x1240), 19715528266218439644661892824912275086257866064695767122686506494361332681035, f_q - ) + addmod(mload(0xa80), 3260749183660801844355955642296972726038087832305162495659886992855813471473, f_q) ) mstore( 0x1e80, - addmod(mload(0xa80), 2172714605620835577584512920345000002290498335720267221011697692214475814582, f_q) + mulmod( + mload(0x1220), 15233875724801927436678555222002139405060841628305391430751578735629430475003, f_q + ) ) mstore( 0x1ea0, - mulmod( - mload(0x1240), 15161189183906287273290738379431332336600234154579306802151507052820126345529, f_q - ) + addmod(mload(0xa80), 6654367147037347785567850523255135683487522772110642912946625450946378020614, f_q) ) mstore( 0x1ec0, - addmod(mload(0xa80), 6727053687932987948955667365825942751948130245836727541546697133755682150088, f_q) + mulmod( + mload(0x1220), 12662796367122493153085459582914902083443981635312477834616629373139110863873, f_q + ) ) mstore( 0x1ee0, - mulmod( - mload(0x1240), 12456424076401232823832128238027368612265814450984711658287606686035629293382, f_q - ) + addmod(mload(0xa80), 9225446504716782069160946162342373005104382765103556509081574813436697631744, f_q) ) mstore( 0x1f00, - addmod(mload(0xa80), 9431818795438042398414277507229906476282549949431322685410597500540179202235, f_q) + mulmod(mload(0x1220), 9228489335593836417731216695316971397516686186585289059470421738439643366942, f_q) ) mstore( 0x1f20, - mulmod(mload(0x1240), 557567375339945239933617516585967620814823575807691402619711360028043331811, f_q) + addmod(mload(0xa80), 12659753536245438804515189049940303691031678213830745284227782448136165128675, f_q) ) mstore( 0x1f40, - addmod(mload(0xa80), 21330675496499329982312788228671307467733540824608342941078492826547765163806, f_q) + mulmod(mload(0x1220), 6904960663187367776878651408524770307710353971752548687936010869699798414796, f_q) ) mstore( 0x1f60, - mulmod(mload(0x1240), 3675353143102618619098608207619541954347747556257261634661810167705798540391, f_q) - ) - mstore( - 0x1f80, - addmod(mload(0xa80), 18212889728736656603147797537637733134200616844158772709036394018870009955226, f_q) + addmod(mload(0xa80), 14983282208651907445367754336732504780838010428663485655762193316876010080821, f_q) ) { - let prod := mload(0x1280) + let prod := mload(0x1260) - prod := mulmod(mload(0x12c0), prod, f_q) + prod := mulmod(mload(0x12a0), prod, f_q) + mstore(0x1f80, prod) + + prod := mulmod(mload(0x12e0), prod, f_q) mstore(0x1fa0, prod) - prod := mulmod(mload(0x1300), prod, f_q) + prod := mulmod(mload(0x1320), prod, f_q) mstore(0x1fc0, prod) - prod := mulmod(mload(0x1340), prod, f_q) + prod := mulmod(mload(0x1360), prod, f_q) mstore(0x1fe0, prod) - prod := mulmod(mload(0x1380), prod, f_q) + prod := mulmod(mload(0x13a0), prod, f_q) mstore(0x2000, prod) - prod := mulmod(mload(0x13c0), prod, f_q) + prod := mulmod(mload(0x13e0), prod, f_q) mstore(0x2020, prod) - prod := mulmod(mload(0x1400), prod, f_q) + prod := mulmod(mload(0x1420), prod, f_q) mstore(0x2040, prod) - prod := mulmod(mload(0x1440), prod, f_q) + prod := mulmod(mload(0x1460), prod, f_q) mstore(0x2060, prod) - prod := mulmod(mload(0x1480), prod, f_q) + prod := mulmod(mload(0x14a0), prod, f_q) mstore(0x2080, prod) - prod := mulmod(mload(0x14c0), prod, f_q) + prod := mulmod(mload(0x14e0), prod, f_q) mstore(0x20a0, prod) - prod := mulmod(mload(0x1500), prod, f_q) + prod := mulmod(mload(0x1520), prod, f_q) mstore(0x20c0, prod) - prod := mulmod(mload(0x1540), prod, f_q) + prod := mulmod(mload(0x1560), prod, f_q) mstore(0x20e0, prod) - prod := mulmod(mload(0x1580), prod, f_q) + prod := mulmod(mload(0x15a0), prod, f_q) mstore(0x2100, prod) - prod := mulmod(mload(0x15c0), prod, f_q) + prod := mulmod(mload(0x15e0), prod, f_q) mstore(0x2120, prod) - prod := mulmod(mload(0x1600), prod, f_q) + prod := mulmod(mload(0x1620), prod, f_q) mstore(0x2140, prod) - prod := mulmod(mload(0x1640), prod, f_q) + prod := mulmod(mload(0x1660), prod, f_q) mstore(0x2160, prod) - prod := mulmod(mload(0x1680), prod, f_q) + prod := mulmod(mload(0x16a0), prod, f_q) mstore(0x2180, prod) - prod := mulmod(mload(0x16c0), prod, f_q) + prod := mulmod(mload(0x16e0), prod, f_q) mstore(0x21a0, prod) - prod := mulmod(mload(0x1700), prod, f_q) + prod := mulmod(mload(0x1720), prod, f_q) mstore(0x21c0, prod) - prod := mulmod(mload(0x1740), prod, f_q) + prod := mulmod(mload(0x1760), prod, f_q) mstore(0x21e0, prod) - prod := mulmod(mload(0x1780), prod, f_q) + prod := mulmod(mload(0x17a0), prod, f_q) mstore(0x2200, prod) - prod := mulmod(mload(0x17c0), prod, f_q) + prod := mulmod(mload(0x17e0), prod, f_q) mstore(0x2220, prod) - prod := mulmod(mload(0x1800), prod, f_q) + prod := mulmod(mload(0x1820), prod, f_q) mstore(0x2240, prod) - prod := mulmod(mload(0x1840), prod, f_q) + prod := mulmod(mload(0x1860), prod, f_q) mstore(0x2260, prod) - prod := mulmod(mload(0x1880), prod, f_q) + prod := mulmod(mload(0x18a0), prod, f_q) mstore(0x2280, prod) - prod := mulmod(mload(0x18c0), prod, f_q) + prod := mulmod(mload(0x18e0), prod, f_q) mstore(0x22a0, prod) - prod := mulmod(mload(0x1900), prod, f_q) + prod := mulmod(mload(0x1920), prod, f_q) mstore(0x22c0, prod) - prod := mulmod(mload(0x1940), prod, f_q) + prod := mulmod(mload(0x1960), prod, f_q) mstore(0x22e0, prod) - prod := mulmod(mload(0x1980), prod, f_q) + prod := mulmod(mload(0x19a0), prod, f_q) mstore(0x2300, prod) - prod := mulmod(mload(0x19c0), prod, f_q) + prod := mulmod(mload(0x19e0), prod, f_q) mstore(0x2320, prod) - prod := mulmod(mload(0x1a00), prod, f_q) + prod := mulmod(mload(0x1a20), prod, f_q) mstore(0x2340, prod) - prod := mulmod(mload(0x1a40), prod, f_q) + prod := mulmod(mload(0x1a60), prod, f_q) mstore(0x2360, prod) - prod := mulmod(mload(0x1a80), prod, f_q) + prod := mulmod(mload(0x1aa0), prod, f_q) mstore(0x2380, prod) - prod := mulmod(mload(0x1ac0), prod, f_q) + prod := mulmod(mload(0x1ae0), prod, f_q) mstore(0x23a0, prod) - prod := mulmod(mload(0x1b00), prod, f_q) + prod := mulmod(mload(0x1b20), prod, f_q) mstore(0x23c0, prod) - prod := mulmod(mload(0x1b40), prod, f_q) + prod := mulmod(mload(0x1b60), prod, f_q) mstore(0x23e0, prod) - prod := mulmod(mload(0x1b80), prod, f_q) + prod := mulmod(mload(0x1ba0), prod, f_q) mstore(0x2400, prod) - prod := mulmod(mload(0x1bc0), prod, f_q) + prod := mulmod(mload(0x1be0), prod, f_q) mstore(0x2420, prod) - prod := mulmod(mload(0x1c00), prod, f_q) + prod := mulmod(mload(0x1c20), prod, f_q) mstore(0x2440, prod) - prod := mulmod(mload(0x1c40), prod, f_q) + prod := mulmod(mload(0x1c60), prod, f_q) mstore(0x2460, prod) - prod := mulmod(mload(0x1c80), prod, f_q) + prod := mulmod(mload(0x1ca0), prod, f_q) mstore(0x2480, prod) - prod := mulmod(mload(0x1cc0), prod, f_q) + prod := mulmod(mload(0x1ce0), prod, f_q) mstore(0x24a0, prod) - prod := mulmod(mload(0x1d00), prod, f_q) + prod := mulmod(mload(0x1d20), prod, f_q) mstore(0x24c0, prod) - prod := mulmod(mload(0x1d40), prod, f_q) + prod := mulmod(mload(0x1d60), prod, f_q) mstore(0x24e0, prod) - prod := mulmod(mload(0x1d80), prod, f_q) + prod := mulmod(mload(0x1da0), prod, f_q) mstore(0x2500, prod) - prod := mulmod(mload(0x1dc0), prod, f_q) + prod := mulmod(mload(0x1de0), prod, f_q) mstore(0x2520, prod) - prod := mulmod(mload(0x1e00), prod, f_q) + prod := mulmod(mload(0x1e20), prod, f_q) mstore(0x2540, prod) - prod := mulmod(mload(0x1e40), prod, f_q) + prod := mulmod(mload(0x1e60), prod, f_q) mstore(0x2560, prod) - prod := mulmod(mload(0x1e80), prod, f_q) + prod := mulmod(mload(0x1ea0), prod, f_q) mstore(0x2580, prod) - prod := mulmod(mload(0x1ec0), prod, f_q) + prod := mulmod(mload(0x1ee0), prod, f_q) mstore(0x25a0, prod) - prod := mulmod(mload(0x1f00), prod, f_q) + prod := mulmod(mload(0x1f20), prod, f_q) mstore(0x25c0, prod) - prod := mulmod(mload(0x1f40), prod, f_q) + prod := mulmod(mload(0x1f60), prod, f_q) mstore(0x25e0, prod) - prod := mulmod(mload(0x1f80), prod, f_q) + prod := mulmod(mload(0x1200), prod, f_q) mstore(0x2600, prod) - - prod := mulmod(mload(0x1220), prod, f_q) - mstore(0x2620, prod) } + mstore(0x2640, 32) mstore(0x2660, 32) mstore(0x2680, 32) - mstore(0x26a0, 32) - mstore(0x26c0, mload(0x2620)) - mstore(0x26e0, 21888242871839275222246405745257275088548364400416034343698204186575808495615) - mstore(0x2700, 21888242871839275222246405745257275088548364400416034343698204186575808495617) - success := and(eq(staticcall(gas(), 0x5, 0x2660, 0xc0, 0x2640, 0x20), 1), success) + mstore(0x26a0, mload(0x2600)) + mstore(0x26c0, 21888242871839275222246405745257275088548364400416034343698204186575808495615) + mstore(0x26e0, 21888242871839275222246405745257275088548364400416034343698204186575808495617) + success := and(eq(staticcall(gas(), 0x5, 0x2640, 0xc0, 0x2620, 0x20), 1), success) { - let inv := mload(0x2640) + let inv := mload(0x2620) let v - v := mload(0x1220) - mstore(4640, mulmod(mload(0x2600), inv, f_q)) + v := mload(0x1200) + mstore(4608, mulmod(mload(0x25e0), inv, f_q)) inv := mulmod(v, inv, f_q) - v := mload(0x1f80) - mstore(8064, mulmod(mload(0x25e0), inv, f_q)) + v := mload(0x1f60) + mstore(8032, mulmod(mload(0x25c0), inv, f_q)) inv := mulmod(v, inv, f_q) - v := mload(0x1f40) - mstore(8000, mulmod(mload(0x25c0), inv, f_q)) + v := mload(0x1f20) + mstore(7968, mulmod(mload(0x25a0), inv, f_q)) inv := mulmod(v, inv, f_q) - v := mload(0x1f00) - mstore(7936, mulmod(mload(0x25a0), inv, f_q)) + v := mload(0x1ee0) + mstore(7904, mulmod(mload(0x2580), inv, f_q)) inv := mulmod(v, inv, f_q) - v := mload(0x1ec0) - mstore(7872, mulmod(mload(0x2580), inv, f_q)) + v := mload(0x1ea0) + mstore(7840, mulmod(mload(0x2560), inv, f_q)) inv := mulmod(v, inv, f_q) - v := mload(0x1e80) - mstore(7808, mulmod(mload(0x2560), inv, f_q)) + v := mload(0x1e60) + mstore(7776, mulmod(mload(0x2540), inv, f_q)) inv := mulmod(v, inv, f_q) - v := mload(0x1e40) - mstore(7744, mulmod(mload(0x2540), inv, f_q)) + v := mload(0x1e20) + mstore(7712, mulmod(mload(0x2520), inv, f_q)) inv := mulmod(v, inv, f_q) - v := mload(0x1e00) - mstore(7680, mulmod(mload(0x2520), inv, f_q)) + v := mload(0x1de0) + mstore(7648, mulmod(mload(0x2500), inv, f_q)) inv := mulmod(v, inv, f_q) - v := mload(0x1dc0) - mstore(7616, mulmod(mload(0x2500), inv, f_q)) + v := mload(0x1da0) + mstore(7584, mulmod(mload(0x24e0), inv, f_q)) inv := mulmod(v, inv, f_q) - v := mload(0x1d80) - mstore(7552, mulmod(mload(0x24e0), inv, f_q)) + v := mload(0x1d60) + mstore(7520, mulmod(mload(0x24c0), inv, f_q)) inv := mulmod(v, inv, f_q) - v := mload(0x1d40) - mstore(7488, mulmod(mload(0x24c0), inv, f_q)) + v := mload(0x1d20) + mstore(7456, mulmod(mload(0x24a0), inv, f_q)) inv := mulmod(v, inv, f_q) - v := mload(0x1d00) - mstore(7424, mulmod(mload(0x24a0), inv, f_q)) + v := mload(0x1ce0) + mstore(7392, mulmod(mload(0x2480), inv, f_q)) inv := mulmod(v, inv, f_q) - v := mload(0x1cc0) - mstore(7360, mulmod(mload(0x2480), inv, f_q)) + v := mload(0x1ca0) + mstore(7328, mulmod(mload(0x2460), inv, f_q)) inv := mulmod(v, inv, f_q) - v := mload(0x1c80) - mstore(7296, mulmod(mload(0x2460), inv, f_q)) + v := mload(0x1c60) + mstore(7264, mulmod(mload(0x2440), inv, f_q)) inv := mulmod(v, inv, f_q) - v := mload(0x1c40) - mstore(7232, mulmod(mload(0x2440), inv, f_q)) + v := mload(0x1c20) + mstore(7200, mulmod(mload(0x2420), inv, f_q)) inv := mulmod(v, inv, f_q) - v := mload(0x1c00) - mstore(7168, mulmod(mload(0x2420), inv, f_q)) + v := mload(0x1be0) + mstore(7136, mulmod(mload(0x2400), inv, f_q)) inv := mulmod(v, inv, f_q) - v := mload(0x1bc0) - mstore(7104, mulmod(mload(0x2400), inv, f_q)) + v := mload(0x1ba0) + mstore(7072, mulmod(mload(0x23e0), inv, f_q)) inv := mulmod(v, inv, f_q) - v := mload(0x1b80) - mstore(7040, mulmod(mload(0x23e0), inv, f_q)) + v := mload(0x1b60) + mstore(7008, mulmod(mload(0x23c0), inv, f_q)) inv := mulmod(v, inv, f_q) - v := mload(0x1b40) - mstore(6976, mulmod(mload(0x23c0), inv, f_q)) + v := mload(0x1b20) + mstore(6944, mulmod(mload(0x23a0), inv, f_q)) inv := mulmod(v, inv, f_q) - v := mload(0x1b00) - mstore(6912, mulmod(mload(0x23a0), inv, f_q)) + v := mload(0x1ae0) + mstore(6880, mulmod(mload(0x2380), inv, f_q)) inv := mulmod(v, inv, f_q) - v := mload(0x1ac0) - mstore(6848, mulmod(mload(0x2380), inv, f_q)) + v := mload(0x1aa0) + mstore(6816, mulmod(mload(0x2360), inv, f_q)) inv := mulmod(v, inv, f_q) - v := mload(0x1a80) - mstore(6784, mulmod(mload(0x2360), inv, f_q)) + v := mload(0x1a60) + mstore(6752, mulmod(mload(0x2340), inv, f_q)) inv := mulmod(v, inv, f_q) - v := mload(0x1a40) - mstore(6720, mulmod(mload(0x2340), inv, f_q)) + v := mload(0x1a20) + mstore(6688, mulmod(mload(0x2320), inv, f_q)) inv := mulmod(v, inv, f_q) - v := mload(0x1a00) - mstore(6656, mulmod(mload(0x2320), inv, f_q)) + v := mload(0x19e0) + mstore(6624, mulmod(mload(0x2300), inv, f_q)) inv := mulmod(v, inv, f_q) - v := mload(0x19c0) - mstore(6592, mulmod(mload(0x2300), inv, f_q)) + v := mload(0x19a0) + mstore(6560, mulmod(mload(0x22e0), inv, f_q)) inv := mulmod(v, inv, f_q) - v := mload(0x1980) - mstore(6528, mulmod(mload(0x22e0), inv, f_q)) + v := mload(0x1960) + mstore(6496, mulmod(mload(0x22c0), inv, f_q)) inv := mulmod(v, inv, f_q) - v := mload(0x1940) - mstore(6464, mulmod(mload(0x22c0), inv, f_q)) + v := mload(0x1920) + mstore(6432, mulmod(mload(0x22a0), inv, f_q)) inv := mulmod(v, inv, f_q) - v := mload(0x1900) - mstore(6400, mulmod(mload(0x22a0), inv, f_q)) + v := mload(0x18e0) + mstore(6368, mulmod(mload(0x2280), inv, f_q)) inv := mulmod(v, inv, f_q) - v := mload(0x18c0) - mstore(6336, mulmod(mload(0x2280), inv, f_q)) + v := mload(0x18a0) + mstore(6304, mulmod(mload(0x2260), inv, f_q)) inv := mulmod(v, inv, f_q) - v := mload(0x1880) - mstore(6272, mulmod(mload(0x2260), inv, f_q)) + v := mload(0x1860) + mstore(6240, mulmod(mload(0x2240), inv, f_q)) inv := mulmod(v, inv, f_q) - v := mload(0x1840) - mstore(6208, mulmod(mload(0x2240), inv, f_q)) + v := mload(0x1820) + mstore(6176, mulmod(mload(0x2220), inv, f_q)) inv := mulmod(v, inv, f_q) - v := mload(0x1800) - mstore(6144, mulmod(mload(0x2220), inv, f_q)) + v := mload(0x17e0) + mstore(6112, mulmod(mload(0x2200), inv, f_q)) inv := mulmod(v, inv, f_q) - v := mload(0x17c0) - mstore(6080, mulmod(mload(0x2200), inv, f_q)) + v := mload(0x17a0) + mstore(6048, mulmod(mload(0x21e0), inv, f_q)) inv := mulmod(v, inv, f_q) - v := mload(0x1780) - mstore(6016, mulmod(mload(0x21e0), inv, f_q)) + v := mload(0x1760) + mstore(5984, mulmod(mload(0x21c0), inv, f_q)) inv := mulmod(v, inv, f_q) - v := mload(0x1740) - mstore(5952, mulmod(mload(0x21c0), inv, f_q)) + v := mload(0x1720) + mstore(5920, mulmod(mload(0x21a0), inv, f_q)) inv := mulmod(v, inv, f_q) - v := mload(0x1700) - mstore(5888, mulmod(mload(0x21a0), inv, f_q)) + v := mload(0x16e0) + mstore(5856, mulmod(mload(0x2180), inv, f_q)) inv := mulmod(v, inv, f_q) - v := mload(0x16c0) - mstore(5824, mulmod(mload(0x2180), inv, f_q)) + v := mload(0x16a0) + mstore(5792, mulmod(mload(0x2160), inv, f_q)) inv := mulmod(v, inv, f_q) - v := mload(0x1680) - mstore(5760, mulmod(mload(0x2160), inv, f_q)) + v := mload(0x1660) + mstore(5728, mulmod(mload(0x2140), inv, f_q)) inv := mulmod(v, inv, f_q) - v := mload(0x1640) - mstore(5696, mulmod(mload(0x2140), inv, f_q)) + v := mload(0x1620) + mstore(5664, mulmod(mload(0x2120), inv, f_q)) inv := mulmod(v, inv, f_q) - v := mload(0x1600) - mstore(5632, mulmod(mload(0x2120), inv, f_q)) + v := mload(0x15e0) + mstore(5600, mulmod(mload(0x2100), inv, f_q)) inv := mulmod(v, inv, f_q) - v := mload(0x15c0) - mstore(5568, mulmod(mload(0x2100), inv, f_q)) + v := mload(0x15a0) + mstore(5536, mulmod(mload(0x20e0), inv, f_q)) inv := mulmod(v, inv, f_q) - v := mload(0x1580) - mstore(5504, mulmod(mload(0x20e0), inv, f_q)) + v := mload(0x1560) + mstore(5472, mulmod(mload(0x20c0), inv, f_q)) inv := mulmod(v, inv, f_q) - v := mload(0x1540) - mstore(5440, mulmod(mload(0x20c0), inv, f_q)) + v := mload(0x1520) + mstore(5408, mulmod(mload(0x20a0), inv, f_q)) inv := mulmod(v, inv, f_q) - v := mload(0x1500) - mstore(5376, mulmod(mload(0x20a0), inv, f_q)) + v := mload(0x14e0) + mstore(5344, mulmod(mload(0x2080), inv, f_q)) inv := mulmod(v, inv, f_q) - v := mload(0x14c0) - mstore(5312, mulmod(mload(0x2080), inv, f_q)) + v := mload(0x14a0) + mstore(5280, mulmod(mload(0x2060), inv, f_q)) inv := mulmod(v, inv, f_q) - v := mload(0x1480) - mstore(5248, mulmod(mload(0x2060), inv, f_q)) + v := mload(0x1460) + mstore(5216, mulmod(mload(0x2040), inv, f_q)) inv := mulmod(v, inv, f_q) - v := mload(0x1440) - mstore(5184, mulmod(mload(0x2040), inv, f_q)) + v := mload(0x1420) + mstore(5152, mulmod(mload(0x2020), inv, f_q)) inv := mulmod(v, inv, f_q) - v := mload(0x1400) - mstore(5120, mulmod(mload(0x2020), inv, f_q)) + v := mload(0x13e0) + mstore(5088, mulmod(mload(0x2000), inv, f_q)) inv := mulmod(v, inv, f_q) - v := mload(0x13c0) - mstore(5056, mulmod(mload(0x2000), inv, f_q)) + v := mload(0x13a0) + mstore(5024, mulmod(mload(0x1fe0), inv, f_q)) inv := mulmod(v, inv, f_q) - v := mload(0x1380) - mstore(4992, mulmod(mload(0x1fe0), inv, f_q)) + v := mload(0x1360) + mstore(4960, mulmod(mload(0x1fc0), inv, f_q)) inv := mulmod(v, inv, f_q) - v := mload(0x1340) - mstore(4928, mulmod(mload(0x1fc0), inv, f_q)) + v := mload(0x1320) + mstore(4896, mulmod(mload(0x1fa0), inv, f_q)) inv := mulmod(v, inv, f_q) - v := mload(0x1300) - mstore(4864, mulmod(mload(0x1fa0), inv, f_q)) + v := mload(0x12e0) + mstore(4832, mulmod(mload(0x1f80), inv, f_q)) inv := mulmod(v, inv, f_q) - v := mload(0x12c0) - mstore(4800, mulmod(mload(0x1280), inv, f_q)) + v := mload(0x12a0) + mstore(4768, mulmod(mload(0x1260), inv, f_q)) inv := mulmod(v, inv, f_q) - mstore(0x1280, inv) + mstore(0x1260, inv) } - mstore(0x2720, mulmod(mload(0x1260), mload(0x1280), f_q)) - mstore(0x2740, mulmod(mload(0x12a0), mload(0x12c0), f_q)) - mstore(0x2760, mulmod(mload(0x12e0), mload(0x1300), f_q)) - mstore(0x2780, mulmod(mload(0x1320), mload(0x1340), f_q)) - mstore(0x27a0, mulmod(mload(0x1360), mload(0x1380), f_q)) - mstore(0x27c0, mulmod(mload(0x13a0), mload(0x13c0), f_q)) - mstore(0x27e0, mulmod(mload(0x13e0), mload(0x1400), f_q)) - mstore(0x2800, mulmod(mload(0x1420), mload(0x1440), f_q)) - mstore(0x2820, mulmod(mload(0x1460), mload(0x1480), f_q)) - mstore(0x2840, mulmod(mload(0x14a0), mload(0x14c0), f_q)) - mstore(0x2860, mulmod(mload(0x14e0), mload(0x1500), f_q)) - mstore(0x2880, mulmod(mload(0x1520), mload(0x1540), f_q)) - mstore(0x28a0, mulmod(mload(0x1560), mload(0x1580), f_q)) - mstore(0x28c0, mulmod(mload(0x15a0), mload(0x15c0), f_q)) - mstore(0x28e0, mulmod(mload(0x15e0), mload(0x1600), f_q)) - mstore(0x2900, mulmod(mload(0x1620), mload(0x1640), f_q)) - mstore(0x2920, mulmod(mload(0x1660), mload(0x1680), f_q)) - mstore(0x2940, mulmod(mload(0x16a0), mload(0x16c0), f_q)) - mstore(0x2960, mulmod(mload(0x16e0), mload(0x1700), f_q)) - mstore(0x2980, mulmod(mload(0x1720), mload(0x1740), f_q)) - mstore(0x29a0, mulmod(mload(0x1760), mload(0x1780), f_q)) - mstore(0x29c0, mulmod(mload(0x17a0), mload(0x17c0), f_q)) - mstore(0x29e0, mulmod(mload(0x17e0), mload(0x1800), f_q)) - mstore(0x2a00, mulmod(mload(0x1820), mload(0x1840), f_q)) - mstore(0x2a20, mulmod(mload(0x1860), mload(0x1880), f_q)) - mstore(0x2a40, mulmod(mload(0x18a0), mload(0x18c0), f_q)) - mstore(0x2a60, mulmod(mload(0x18e0), mload(0x1900), f_q)) - mstore(0x2a80, mulmod(mload(0x1920), mload(0x1940), f_q)) - mstore(0x2aa0, mulmod(mload(0x1960), mload(0x1980), f_q)) - mstore(0x2ac0, mulmod(mload(0x19a0), mload(0x19c0), f_q)) - mstore(0x2ae0, mulmod(mload(0x19e0), mload(0x1a00), f_q)) - mstore(0x2b00, mulmod(mload(0x1a20), mload(0x1a40), f_q)) - mstore(0x2b20, mulmod(mload(0x1a60), mload(0x1a80), f_q)) - mstore(0x2b40, mulmod(mload(0x1aa0), mload(0x1ac0), f_q)) - mstore(0x2b60, mulmod(mload(0x1ae0), mload(0x1b00), f_q)) - mstore(0x2b80, mulmod(mload(0x1b20), mload(0x1b40), f_q)) - mstore(0x2ba0, mulmod(mload(0x1b60), mload(0x1b80), f_q)) - mstore(0x2bc0, mulmod(mload(0x1ba0), mload(0x1bc0), f_q)) - mstore(0x2be0, mulmod(mload(0x1be0), mload(0x1c00), f_q)) - mstore(0x2c00, mulmod(mload(0x1c20), mload(0x1c40), f_q)) - mstore(0x2c20, mulmod(mload(0x1c60), mload(0x1c80), f_q)) - mstore(0x2c40, mulmod(mload(0x1ca0), mload(0x1cc0), f_q)) - mstore(0x2c60, mulmod(mload(0x1ce0), mload(0x1d00), f_q)) - mstore(0x2c80, mulmod(mload(0x1d20), mload(0x1d40), f_q)) - mstore(0x2ca0, mulmod(mload(0x1d60), mload(0x1d80), f_q)) - mstore(0x2cc0, mulmod(mload(0x1da0), mload(0x1dc0), f_q)) - mstore(0x2ce0, mulmod(mload(0x1de0), mload(0x1e00), f_q)) - mstore(0x2d00, mulmod(mload(0x1e20), mload(0x1e40), f_q)) - mstore(0x2d20, mulmod(mload(0x1e60), mload(0x1e80), f_q)) - mstore(0x2d40, mulmod(mload(0x1ea0), mload(0x1ec0), f_q)) - mstore(0x2d60, mulmod(mload(0x1ee0), mload(0x1f00), f_q)) - mstore(0x2d80, mulmod(mload(0x1f20), mload(0x1f40), f_q)) - mstore(0x2da0, mulmod(mload(0x1f60), mload(0x1f80), f_q)) + mstore(0x2700, mulmod(mload(0x1240), mload(0x1260), f_q)) + mstore(0x2720, mulmod(mload(0x1280), mload(0x12a0), f_q)) + mstore(0x2740, mulmod(mload(0x12c0), mload(0x12e0), f_q)) + mstore(0x2760, mulmod(mload(0x1300), mload(0x1320), f_q)) + mstore(0x2780, mulmod(mload(0x1340), mload(0x1360), f_q)) + mstore(0x27a0, mulmod(mload(0x1380), mload(0x13a0), f_q)) + mstore(0x27c0, mulmod(mload(0x13c0), mload(0x13e0), f_q)) + mstore(0x27e0, mulmod(mload(0x1400), mload(0x1420), f_q)) + mstore(0x2800, mulmod(mload(0x1440), mload(0x1460), f_q)) + mstore(0x2820, mulmod(mload(0x1480), mload(0x14a0), f_q)) + mstore(0x2840, mulmod(mload(0x14c0), mload(0x14e0), f_q)) + mstore(0x2860, mulmod(mload(0x1500), mload(0x1520), f_q)) + mstore(0x2880, mulmod(mload(0x1540), mload(0x1560), f_q)) + mstore(0x28a0, mulmod(mload(0x1580), mload(0x15a0), f_q)) + mstore(0x28c0, mulmod(mload(0x15c0), mload(0x15e0), f_q)) + mstore(0x28e0, mulmod(mload(0x1600), mload(0x1620), f_q)) + mstore(0x2900, mulmod(mload(0x1640), mload(0x1660), f_q)) + mstore(0x2920, mulmod(mload(0x1680), mload(0x16a0), f_q)) + mstore(0x2940, mulmod(mload(0x16c0), mload(0x16e0), f_q)) + mstore(0x2960, mulmod(mload(0x1700), mload(0x1720), f_q)) + mstore(0x2980, mulmod(mload(0x1740), mload(0x1760), f_q)) + mstore(0x29a0, mulmod(mload(0x1780), mload(0x17a0), f_q)) + mstore(0x29c0, mulmod(mload(0x17c0), mload(0x17e0), f_q)) + mstore(0x29e0, mulmod(mload(0x1800), mload(0x1820), f_q)) + mstore(0x2a00, mulmod(mload(0x1840), mload(0x1860), f_q)) + mstore(0x2a20, mulmod(mload(0x1880), mload(0x18a0), f_q)) + mstore(0x2a40, mulmod(mload(0x18c0), mload(0x18e0), f_q)) + mstore(0x2a60, mulmod(mload(0x1900), mload(0x1920), f_q)) + mstore(0x2a80, mulmod(mload(0x1940), mload(0x1960), f_q)) + mstore(0x2aa0, mulmod(mload(0x1980), mload(0x19a0), f_q)) + mstore(0x2ac0, mulmod(mload(0x19c0), mload(0x19e0), f_q)) + mstore(0x2ae0, mulmod(mload(0x1a00), mload(0x1a20), f_q)) + mstore(0x2b00, mulmod(mload(0x1a40), mload(0x1a60), f_q)) + mstore(0x2b20, mulmod(mload(0x1a80), mload(0x1aa0), f_q)) + mstore(0x2b40, mulmod(mload(0x1ac0), mload(0x1ae0), f_q)) + mstore(0x2b60, mulmod(mload(0x1b00), mload(0x1b20), f_q)) + mstore(0x2b80, mulmod(mload(0x1b40), mload(0x1b60), f_q)) + mstore(0x2ba0, mulmod(mload(0x1b80), mload(0x1ba0), f_q)) + mstore(0x2bc0, mulmod(mload(0x1bc0), mload(0x1be0), f_q)) + mstore(0x2be0, mulmod(mload(0x1c00), mload(0x1c20), f_q)) + mstore(0x2c00, mulmod(mload(0x1c40), mload(0x1c60), f_q)) + mstore(0x2c20, mulmod(mload(0x1c80), mload(0x1ca0), f_q)) + mstore(0x2c40, mulmod(mload(0x1cc0), mload(0x1ce0), f_q)) + mstore(0x2c60, mulmod(mload(0x1d00), mload(0x1d20), f_q)) + mstore(0x2c80, mulmod(mload(0x1d40), mload(0x1d60), f_q)) + mstore(0x2ca0, mulmod(mload(0x1d80), mload(0x1da0), f_q)) + mstore(0x2cc0, mulmod(mload(0x1dc0), mload(0x1de0), f_q)) + mstore(0x2ce0, mulmod(mload(0x1e00), mload(0x1e20), f_q)) + mstore(0x2d00, mulmod(mload(0x1e40), mload(0x1e60), f_q)) + mstore(0x2d20, mulmod(mload(0x1e80), mload(0x1ea0), f_q)) + mstore(0x2d40, mulmod(mload(0x1ec0), mload(0x1ee0), f_q)) + mstore(0x2d60, mulmod(mload(0x1f00), mload(0x1f20), f_q)) + mstore(0x2d80, mulmod(mload(0x1f40), mload(0x1f60), f_q)) { - let result := mulmod(mload(0x2800), mload(0xa0), f_q) - result := addmod(mulmod(mload(0x2820), mload(0xc0), f_q), result, f_q) - result := addmod(mulmod(mload(0x2840), mload(0xe0), f_q), result, f_q) - result := addmod(mulmod(mload(0x2860), mload(0x100), f_q), result, f_q) - result := addmod(mulmod(mload(0x2880), mload(0x120), f_q), result, f_q) - result := addmod(mulmod(mload(0x28a0), mload(0x140), f_q), result, f_q) - result := addmod(mulmod(mload(0x28c0), mload(0x160), f_q), result, f_q) - result := addmod(mulmod(mload(0x28e0), mload(0x180), f_q), result, f_q) - result := addmod(mulmod(mload(0x2900), mload(0x1a0), f_q), result, f_q) - result := addmod(mulmod(mload(0x2920), mload(0x1c0), f_q), result, f_q) - result := addmod(mulmod(mload(0x2940), mload(0x1e0), f_q), result, f_q) - result := addmod(mulmod(mload(0x2960), mload(0x200), f_q), result, f_q) - result := addmod(mulmod(mload(0x2980), mload(0x220), f_q), result, f_q) - result := addmod(mulmod(mload(0x29a0), mload(0x240), f_q), result, f_q) - result := addmod(mulmod(mload(0x29c0), mload(0x260), f_q), result, f_q) - result := addmod(mulmod(mload(0x29e0), mload(0x280), f_q), result, f_q) - result := addmod(mulmod(mload(0x2a00), mload(0x2a0), f_q), result, f_q) - result := addmod(mulmod(mload(0x2a20), mload(0x2c0), f_q), result, f_q) - result := addmod(mulmod(mload(0x2a40), mload(0x2e0), f_q), result, f_q) - result := addmod(mulmod(mload(0x2a60), mload(0x300), f_q), result, f_q) - result := addmod(mulmod(mload(0x2a80), mload(0x320), f_q), result, f_q) - result := addmod(mulmod(mload(0x2aa0), mload(0x340), f_q), result, f_q) - result := addmod(mulmod(mload(0x2ac0), mload(0x360), f_q), result, f_q) - result := addmod(mulmod(mload(0x2ae0), mload(0x380), f_q), result, f_q) - result := addmod(mulmod(mload(0x2b00), mload(0x3a0), f_q), result, f_q) - result := addmod(mulmod(mload(0x2b20), mload(0x3c0), f_q), result, f_q) - result := addmod(mulmod(mload(0x2b40), mload(0x3e0), f_q), result, f_q) - result := addmod(mulmod(mload(0x2b60), mload(0x400), f_q), result, f_q) - result := addmod(mulmod(mload(0x2b80), mload(0x420), f_q), result, f_q) - result := addmod(mulmod(mload(0x2ba0), mload(0x440), f_q), result, f_q) - result := addmod(mulmod(mload(0x2bc0), mload(0x460), f_q), result, f_q) - result := addmod(mulmod(mload(0x2be0), mload(0x480), f_q), result, f_q) - result := addmod(mulmod(mload(0x2c00), mload(0x4a0), f_q), result, f_q) - result := addmod(mulmod(mload(0x2c20), mload(0x4c0), f_q), result, f_q) - result := addmod(mulmod(mload(0x2c40), mload(0x4e0), f_q), result, f_q) - result := addmod(mulmod(mload(0x2c60), mload(0x500), f_q), result, f_q) - result := addmod(mulmod(mload(0x2c80), mload(0x520), f_q), result, f_q) - result := addmod(mulmod(mload(0x2ca0), mload(0x540), f_q), result, f_q) - result := addmod(mulmod(mload(0x2cc0), mload(0x560), f_q), result, f_q) - result := addmod(mulmod(mload(0x2ce0), mload(0x580), f_q), result, f_q) - result := addmod(mulmod(mload(0x2d00), mload(0x5a0), f_q), result, f_q) - result := addmod(mulmod(mload(0x2d20), mload(0x5c0), f_q), result, f_q) - result := addmod(mulmod(mload(0x2d40), mload(0x5e0), f_q), result, f_q) - result := addmod(mulmod(mload(0x2d60), mload(0x600), f_q), result, f_q) - result := addmod(mulmod(mload(0x2d80), mload(0x620), f_q), result, f_q) - result := addmod(mulmod(mload(0x2da0), mload(0x640), f_q), result, f_q) - mstore(11712, result) + let result := mulmod(mload(0x27e0), mload(0xa0), f_q) + result := addmod(mulmod(mload(0x2800), mload(0xc0), f_q), result, f_q) + result := addmod(mulmod(mload(0x2820), mload(0xe0), f_q), result, f_q) + result := addmod(mulmod(mload(0x2840), mload(0x100), f_q), result, f_q) + result := addmod(mulmod(mload(0x2860), mload(0x120), f_q), result, f_q) + result := addmod(mulmod(mload(0x2880), mload(0x140), f_q), result, f_q) + result := addmod(mulmod(mload(0x28a0), mload(0x160), f_q), result, f_q) + result := addmod(mulmod(mload(0x28c0), mload(0x180), f_q), result, f_q) + result := addmod(mulmod(mload(0x28e0), mload(0x1a0), f_q), result, f_q) + result := addmod(mulmod(mload(0x2900), mload(0x1c0), f_q), result, f_q) + result := addmod(mulmod(mload(0x2920), mload(0x1e0), f_q), result, f_q) + result := addmod(mulmod(mload(0x2940), mload(0x200), f_q), result, f_q) + result := addmod(mulmod(mload(0x2960), mload(0x220), f_q), result, f_q) + result := addmod(mulmod(mload(0x2980), mload(0x240), f_q), result, f_q) + result := addmod(mulmod(mload(0x29a0), mload(0x260), f_q), result, f_q) + result := addmod(mulmod(mload(0x29c0), mload(0x280), f_q), result, f_q) + result := addmod(mulmod(mload(0x29e0), mload(0x2a0), f_q), result, f_q) + result := addmod(mulmod(mload(0x2a00), mload(0x2c0), f_q), result, f_q) + result := addmod(mulmod(mload(0x2a20), mload(0x2e0), f_q), result, f_q) + result := addmod(mulmod(mload(0x2a40), mload(0x300), f_q), result, f_q) + result := addmod(mulmod(mload(0x2a60), mload(0x320), f_q), result, f_q) + result := addmod(mulmod(mload(0x2a80), mload(0x340), f_q), result, f_q) + result := addmod(mulmod(mload(0x2aa0), mload(0x360), f_q), result, f_q) + result := addmod(mulmod(mload(0x2ac0), mload(0x380), f_q), result, f_q) + result := addmod(mulmod(mload(0x2ae0), mload(0x3a0), f_q), result, f_q) + result := addmod(mulmod(mload(0x2b00), mload(0x3c0), f_q), result, f_q) + result := addmod(mulmod(mload(0x2b20), mload(0x3e0), f_q), result, f_q) + result := addmod(mulmod(mload(0x2b40), mload(0x400), f_q), result, f_q) + result := addmod(mulmod(mload(0x2b60), mload(0x420), f_q), result, f_q) + result := addmod(mulmod(mload(0x2b80), mload(0x440), f_q), result, f_q) + result := addmod(mulmod(mload(0x2ba0), mload(0x460), f_q), result, f_q) + result := addmod(mulmod(mload(0x2bc0), mload(0x480), f_q), result, f_q) + result := addmod(mulmod(mload(0x2be0), mload(0x4a0), f_q), result, f_q) + result := addmod(mulmod(mload(0x2c00), mload(0x4c0), f_q), result, f_q) + result := addmod(mulmod(mload(0x2c20), mload(0x4e0), f_q), result, f_q) + result := addmod(mulmod(mload(0x2c40), mload(0x500), f_q), result, f_q) + result := addmod(mulmod(mload(0x2c60), mload(0x520), f_q), result, f_q) + result := addmod(mulmod(mload(0x2c80), mload(0x540), f_q), result, f_q) + result := addmod(mulmod(mload(0x2ca0), mload(0x560), f_q), result, f_q) + result := addmod(mulmod(mload(0x2cc0), mload(0x580), f_q), result, f_q) + result := addmod(mulmod(mload(0x2ce0), mload(0x5a0), f_q), result, f_q) + result := addmod(mulmod(mload(0x2d00), mload(0x5c0), f_q), result, f_q) + result := addmod(mulmod(mload(0x2d20), mload(0x5e0), f_q), result, f_q) + result := addmod(mulmod(mload(0x2d40), mload(0x600), f_q), result, f_q) + result := addmod(mulmod(mload(0x2d60), mload(0x620), f_q), result, f_q) + result := addmod(mulmod(mload(0x2d80), mload(0x640), f_q), result, f_q) + mstore(11680, result) } - mstore(0x2de0, mulmod(mload(0xb00), mload(0xae0), f_q)) - mstore(0x2e00, addmod(mload(0xac0), mload(0x2de0), f_q)) - mstore(0x2e20, addmod(mload(0x2e00), sub(f_q, mload(0xb20)), f_q)) - mstore(0x2e40, mulmod(mload(0x2e20), mload(0xb80), f_q)) - mstore(0x2e60, mulmod(mload(0x920), mload(0x2e40), f_q)) - mstore(0x2e80, addmod(1, sub(f_q, mload(0xc40)), f_q)) - mstore(0x2ea0, mulmod(mload(0x2e80), mload(0x2800), f_q)) - mstore(0x2ec0, addmod(mload(0x2e60), mload(0x2ea0), f_q)) - mstore(0x2ee0, mulmod(mload(0x920), mload(0x2ec0), f_q)) - mstore(0x2f00, mulmod(mload(0xc40), mload(0xc40), f_q)) - mstore(0x2f20, addmod(mload(0x2f00), sub(f_q, mload(0xc40)), f_q)) - mstore(0x2f40, mulmod(mload(0x2f20), mload(0x2720), f_q)) - mstore(0x2f60, addmod(mload(0x2ee0), mload(0x2f40), f_q)) - mstore(0x2f80, mulmod(mload(0x920), mload(0x2f60), f_q)) - mstore(0x2fa0, addmod(1, sub(f_q, mload(0x2720)), f_q)) - mstore(0x2fc0, addmod(mload(0x2740), mload(0x2760), f_q)) + mstore(0x2dc0, mulmod(mload(0xb00), mload(0xae0), f_q)) + mstore(0x2de0, addmod(mload(0xac0), mload(0x2dc0), f_q)) + mstore(0x2e00, addmod(mload(0x2de0), sub(f_q, mload(0xb20)), f_q)) + mstore(0x2e20, mulmod(mload(0x2e00), mload(0xb80), f_q)) + mstore(0x2e40, mulmod(mload(0x920), mload(0x2e20), f_q)) + mstore(0x2e60, addmod(1, sub(f_q, mload(0xc40)), f_q)) + mstore(0x2e80, mulmod(mload(0x2e60), mload(0x27e0), f_q)) + mstore(0x2ea0, addmod(mload(0x2e40), mload(0x2e80), f_q)) + mstore(0x2ec0, mulmod(mload(0x920), mload(0x2ea0), f_q)) + mstore(0x2ee0, mulmod(mload(0xc40), mload(0xc40), f_q)) + mstore(0x2f00, addmod(mload(0x2ee0), sub(f_q, mload(0xc40)), f_q)) + mstore(0x2f20, mulmod(mload(0x2f00), mload(0x2700), f_q)) + mstore(0x2f40, addmod(mload(0x2ec0), mload(0x2f20), f_q)) + mstore(0x2f60, mulmod(mload(0x920), mload(0x2f40), f_q)) + mstore(0x2f80, addmod(1, sub(f_q, mload(0x2700)), f_q)) + mstore(0x2fa0, addmod(mload(0x2720), mload(0x2740), f_q)) + mstore(0x2fc0, addmod(mload(0x2fa0), mload(0x2760), f_q)) mstore(0x2fe0, addmod(mload(0x2fc0), mload(0x2780), f_q)) mstore(0x3000, addmod(mload(0x2fe0), mload(0x27a0), f_q)) mstore(0x3020, addmod(mload(0x3000), mload(0x27c0), f_q)) - mstore(0x3040, addmod(mload(0x3020), mload(0x27e0), f_q)) - mstore(0x3060, addmod(mload(0x2fa0), sub(f_q, mload(0x3040)), f_q)) - mstore(0x3080, mulmod(mload(0xbe0), mload(0x7a0), f_q)) - mstore(0x30a0, addmod(mload(0xb40), mload(0x3080), f_q)) - mstore(0x30c0, addmod(mload(0x30a0), mload(0x800), f_q)) - mstore(0x30e0, mulmod(mload(0xc00), mload(0x7a0), f_q)) - mstore(0x3100, addmod(mload(0xac0), mload(0x30e0), f_q)) - mstore(0x3120, addmod(mload(0x3100), mload(0x800), f_q)) - mstore(0x3140, mulmod(mload(0x3120), mload(0x30c0), f_q)) - mstore(0x3160, mulmod(mload(0xc20), mload(0x7a0), f_q)) - mstore(0x3180, addmod(mload(0x2dc0), mload(0x3160), f_q)) - mstore(0x31a0, addmod(mload(0x3180), mload(0x800), f_q)) - mstore(0x31c0, mulmod(mload(0x31a0), mload(0x3140), f_q)) - mstore(0x31e0, mulmod(mload(0x31c0), mload(0xc60), f_q)) - mstore(0x3200, mulmod(1, mload(0x7a0), f_q)) - mstore(0x3220, mulmod(mload(0xa80), mload(0x3200), f_q)) - mstore(0x3240, addmod(mload(0xb40), mload(0x3220), f_q)) - mstore(0x3260, addmod(mload(0x3240), mload(0x800), f_q)) - mstore( - 0x3280, + mstore(0x3040, addmod(mload(0x2f80), sub(f_q, mload(0x3020)), f_q)) + mstore(0x3060, mulmod(mload(0xbe0), mload(0x7a0), f_q)) + mstore(0x3080, addmod(mload(0xb40), mload(0x3060), f_q)) + mstore(0x30a0, addmod(mload(0x3080), mload(0x800), f_q)) + mstore(0x30c0, mulmod(mload(0xc00), mload(0x7a0), f_q)) + mstore(0x30e0, addmod(mload(0xac0), mload(0x30c0), f_q)) + mstore(0x3100, addmod(mload(0x30e0), mload(0x800), f_q)) + mstore(0x3120, mulmod(mload(0x3100), mload(0x30a0), f_q)) + mstore(0x3140, mulmod(mload(0xc20), mload(0x7a0), f_q)) + mstore(0x3160, addmod(mload(0x2da0), mload(0x3140), f_q)) + mstore(0x3180, addmod(mload(0x3160), mload(0x800), f_q)) + mstore(0x31a0, mulmod(mload(0x3180), mload(0x3120), f_q)) + mstore(0x31c0, mulmod(mload(0x31a0), mload(0xc60), f_q)) + mstore(0x31e0, mulmod(1, mload(0x7a0), f_q)) + mstore(0x3200, mulmod(mload(0xa80), mload(0x31e0), f_q)) + mstore(0x3220, addmod(mload(0xb40), mload(0x3200), f_q)) + mstore(0x3240, addmod(mload(0x3220), mload(0x800), f_q)) + mstore( + 0x3260, mulmod(4131629893567559867359510883348571134090853742863529169391034518566172092834, mload(0x7a0), f_q) ) - mstore(0x32a0, mulmod(mload(0xa80), mload(0x3280), f_q)) - mstore(0x32c0, addmod(mload(0xac0), mload(0x32a0), f_q)) - mstore(0x32e0, addmod(mload(0x32c0), mload(0x800), f_q)) - mstore(0x3300, mulmod(mload(0x32e0), mload(0x3260), f_q)) + mstore(0x3280, mulmod(mload(0xa80), mload(0x3260), f_q)) + mstore(0x32a0, addmod(mload(0xac0), mload(0x3280), f_q)) + mstore(0x32c0, addmod(mload(0x32a0), mload(0x800), f_q)) + mstore(0x32e0, mulmod(mload(0x32c0), mload(0x3240), f_q)) mstore( - 0x3320, + 0x3300, mulmod(8910878055287538404433155982483128285667088683464058436815641868457422632747, mload(0x7a0), f_q) ) - mstore(0x3340, mulmod(mload(0xa80), mload(0x3320), f_q)) - mstore(0x3360, addmod(mload(0x2dc0), mload(0x3340), f_q)) - mstore(0x3380, addmod(mload(0x3360), mload(0x800), f_q)) - mstore(0x33a0, mulmod(mload(0x3380), mload(0x3300), f_q)) - mstore(0x33c0, mulmod(mload(0x33a0), mload(0xc40), f_q)) - mstore(0x33e0, addmod(mload(0x31e0), sub(f_q, mload(0x33c0)), f_q)) - mstore(0x3400, mulmod(mload(0x33e0), mload(0x3060), f_q)) - mstore(0x3420, addmod(mload(0x2f80), mload(0x3400), f_q)) - mstore(0x3440, mulmod(mload(0x920), mload(0x3420), f_q)) - mstore(0x3460, addmod(1, sub(f_q, mload(0xc80)), f_q)) - mstore(0x3480, mulmod(mload(0x3460), mload(0x2800), f_q)) - mstore(0x34a0, addmod(mload(0x3440), mload(0x3480), f_q)) - mstore(0x34c0, mulmod(mload(0x920), mload(0x34a0), f_q)) - mstore(0x34e0, mulmod(mload(0xc80), mload(0xc80), f_q)) - mstore(0x3500, addmod(mload(0x34e0), sub(f_q, mload(0xc80)), f_q)) - mstore(0x3520, mulmod(mload(0x3500), mload(0x2720), f_q)) - mstore(0x3540, addmod(mload(0x34c0), mload(0x3520), f_q)) - mstore(0x3560, mulmod(mload(0x920), mload(0x3540), f_q)) - mstore(0x3580, addmod(mload(0xcc0), mload(0x7a0), f_q)) - mstore(0x35a0, mulmod(mload(0x3580), mload(0xca0), f_q)) - mstore(0x35c0, addmod(mload(0xd00), mload(0x800), f_q)) - mstore(0x35e0, mulmod(mload(0x35c0), mload(0x35a0), f_q)) - mstore(0x3600, mulmod(mload(0xac0), mload(0xba0), f_q)) - mstore(0x3620, addmod(mload(0x3600), mload(0x7a0), f_q)) - mstore(0x3640, mulmod(mload(0x3620), mload(0xc80), f_q)) - mstore(0x3660, addmod(mload(0xb60), mload(0x800), f_q)) - mstore(0x3680, mulmod(mload(0x3660), mload(0x3640), f_q)) - mstore(0x36a0, addmod(mload(0x35e0), sub(f_q, mload(0x3680)), f_q)) - mstore(0x36c0, mulmod(mload(0x36a0), mload(0x3060), f_q)) - mstore(0x36e0, addmod(mload(0x3560), mload(0x36c0), f_q)) - mstore(0x3700, mulmod(mload(0x920), mload(0x36e0), f_q)) - mstore(0x3720, addmod(mload(0xcc0), sub(f_q, mload(0xd00)), f_q)) - mstore(0x3740, mulmod(mload(0x3720), mload(0x2800), f_q)) - mstore(0x3760, addmod(mload(0x3700), mload(0x3740), f_q)) - mstore(0x3780, mulmod(mload(0x920), mload(0x3760), f_q)) - mstore(0x37a0, mulmod(mload(0x3720), mload(0x3060), f_q)) - mstore(0x37c0, addmod(mload(0xcc0), sub(f_q, mload(0xce0)), f_q)) - mstore(0x37e0, mulmod(mload(0x37c0), mload(0x37a0), f_q)) - mstore(0x3800, addmod(mload(0x3780), mload(0x37e0), f_q)) - mstore(0x3820, mulmod(mload(0x1200), mload(0x1200), f_q)) - mstore(0x3840, mulmod(mload(0x3820), mload(0x1200), f_q)) - mstore(0x3860, mulmod(mload(0x3840), mload(0x1200), f_q)) - mstore(0x3880, mulmod(1, mload(0x1200), f_q)) + mstore(0x3320, mulmod(mload(0xa80), mload(0x3300), f_q)) + mstore(0x3340, addmod(mload(0x2da0), mload(0x3320), f_q)) + mstore(0x3360, addmod(mload(0x3340), mload(0x800), f_q)) + mstore(0x3380, mulmod(mload(0x3360), mload(0x32e0), f_q)) + mstore(0x33a0, mulmod(mload(0x3380), mload(0xc40), f_q)) + mstore(0x33c0, addmod(mload(0x31c0), sub(f_q, mload(0x33a0)), f_q)) + mstore(0x33e0, mulmod(mload(0x33c0), mload(0x3040), f_q)) + mstore(0x3400, addmod(mload(0x2f60), mload(0x33e0), f_q)) + mstore(0x3420, mulmod(mload(0x920), mload(0x3400), f_q)) + mstore(0x3440, addmod(1, sub(f_q, mload(0xc80)), f_q)) + mstore(0x3460, mulmod(mload(0x3440), mload(0x27e0), f_q)) + mstore(0x3480, addmod(mload(0x3420), mload(0x3460), f_q)) + mstore(0x34a0, mulmod(mload(0x920), mload(0x3480), f_q)) + mstore(0x34c0, mulmod(mload(0xc80), mload(0xc80), f_q)) + mstore(0x34e0, addmod(mload(0x34c0), sub(f_q, mload(0xc80)), f_q)) + mstore(0x3500, mulmod(mload(0x34e0), mload(0x2700), f_q)) + mstore(0x3520, addmod(mload(0x34a0), mload(0x3500), f_q)) + mstore(0x3540, mulmod(mload(0x920), mload(0x3520), f_q)) + mstore(0x3560, addmod(mload(0xcc0), mload(0x7a0), f_q)) + mstore(0x3580, mulmod(mload(0x3560), mload(0xca0), f_q)) + mstore(0x35a0, addmod(mload(0xd00), mload(0x800), f_q)) + mstore(0x35c0, mulmod(mload(0x35a0), mload(0x3580), f_q)) + mstore(0x35e0, mulmod(mload(0xac0), mload(0xba0), f_q)) + mstore(0x3600, addmod(mload(0x35e0), mload(0x7a0), f_q)) + mstore(0x3620, mulmod(mload(0x3600), mload(0xc80), f_q)) + mstore(0x3640, addmod(mload(0xb60), mload(0x800), f_q)) + mstore(0x3660, mulmod(mload(0x3640), mload(0x3620), f_q)) + mstore(0x3680, addmod(mload(0x35c0), sub(f_q, mload(0x3660)), f_q)) + mstore(0x36a0, mulmod(mload(0x3680), mload(0x3040), f_q)) + mstore(0x36c0, addmod(mload(0x3540), mload(0x36a0), f_q)) + mstore(0x36e0, mulmod(mload(0x920), mload(0x36c0), f_q)) + mstore(0x3700, addmod(mload(0xcc0), sub(f_q, mload(0xd00)), f_q)) + mstore(0x3720, mulmod(mload(0x3700), mload(0x27e0), f_q)) + mstore(0x3740, addmod(mload(0x36e0), mload(0x3720), f_q)) + mstore(0x3760, mulmod(mload(0x920), mload(0x3740), f_q)) + mstore(0x3780, mulmod(mload(0x3700), mload(0x3040), f_q)) + mstore(0x37a0, addmod(mload(0xcc0), sub(f_q, mload(0xce0)), f_q)) + mstore(0x37c0, mulmod(mload(0x37a0), mload(0x3780), f_q)) + mstore(0x37e0, addmod(mload(0x3760), mload(0x37c0), f_q)) + mstore(0x3800, mulmod(mload(0x11e0), mload(0x11e0), f_q)) + mstore(0x3820, mulmod(mload(0x3800), mload(0x11e0), f_q)) + mstore(0x3840, mulmod(mload(0x3820), mload(0x11e0), f_q)) + mstore(0x3860, mulmod(1, mload(0x11e0), f_q)) + mstore(0x3880, mulmod(1, mload(0x3800), f_q)) mstore(0x38a0, mulmod(1, mload(0x3820), f_q)) - mstore(0x38c0, mulmod(1, mload(0x3840), f_q)) - mstore(0x38e0, mulmod(mload(0x3800), mload(0x1220), f_q)) - mstore(0x3900, mulmod(mload(0xf40), mload(0xa80), f_q)) - mstore(0x3920, mulmod(mload(0x3900), mload(0xa80), f_q)) + mstore(0x38c0, mulmod(mload(0x37e0), mload(0x1200), f_q)) + mstore(0x38e0, mulmod(mload(0xf40), mload(0xa80), f_q)) + mstore(0x3900, mulmod(mload(0x38e0), mload(0xa80), f_q)) mstore( - 0x3940, - mulmod(mload(0xa80), 9741553891420464328295280489650144566903017206473301385034033384879943874347, f_q) + 0x3920, + mulmod(mload(0xa80), 8734126352828345679573237859165904705806588461301144420590422589042130041188, f_q) ) - mstore(0x3960, addmod(mload(0xe40), sub(f_q, mload(0x3940)), f_q)) - mstore(0x3980, mulmod(mload(0xa80), 1, f_q)) - mstore(0x39a0, addmod(mload(0xe40), sub(f_q, mload(0x3980)), f_q)) + mstore(0x3940, addmod(mload(0xe40), sub(f_q, mload(0x3920)), f_q)) + mstore(0x3960, mulmod(mload(0xa80), 1, f_q)) + mstore(0x3980, addmod(mload(0xe40), sub(f_q, mload(0x3960)), f_q)) mstore( - 0x39c0, - mulmod(mload(0xa80), 8374374965308410102411073611984011876711565317741801500439755773472076597347, f_q) + 0x39a0, + mulmod(mload(0xa80), 11211301017135681023579411905410872569206244553457844956874280139879520583390, f_q) ) - mstore(0x39e0, addmod(mload(0xe40), sub(f_q, mload(0x39c0)), f_q)) + mstore(0x39c0, addmod(mload(0xe40), sub(f_q, mload(0x39a0)), f_q)) mstore( - 0x3a00, - mulmod(mload(0xa80), 11211301017135681023579411905410872569206244553457844956874280139879520583390, f_q) + 0x39e0, + mulmod(mload(0xa80), 1426404432721484388505361748317961535523355871255605456897797744433766488507, f_q) ) - mstore(0x3a20, addmod(mload(0xe40), sub(f_q, mload(0x3a00)), f_q)) + mstore(0x3a00, addmod(mload(0xe40), sub(f_q, mload(0x39e0)), f_q)) mstore( - 0x3a40, - mulmod(mload(0xa80), 3615478808282855240548287271348143516886772452944084747768312988864436725401, f_q) + 0x3a20, + mulmod(mload(0xa80), 12619617507853212586156872920672483948819476989779550311307282715684870266992, f_q) ) - mstore(0x3a60, addmod(mload(0xe40), sub(f_q, mload(0x3a40)), f_q)) + mstore(0x3a40, addmod(mload(0xe40), sub(f_q, mload(0x3a20)), f_q)) mstore( - 0x3a80, - mulmod( - 13213688729882003894512633350385593288217014177373218494356903340348818451480, mload(0x3900), f_q - ) + 0x3a60, + mulmod(3544324119167359571073009690693121464267965232733679586767649244433889388945, mload(0x38e0), f_q) ) - mstore(0x3aa0, mulmod(mload(0x3a80), 1, f_q)) + mstore(0x3a80, mulmod(mload(0x3a60), 1, f_q)) { - let result := mulmod(mload(0xe40), mload(0x3a80), f_q) - result := addmod(mulmod(mload(0xa80), sub(f_q, mload(0x3aa0)), f_q), result, f_q) - mstore(15040, result) + let result := mulmod(mload(0xe40), mload(0x3a60), f_q) + result := addmod(mulmod(mload(0xa80), sub(f_q, mload(0x3a80)), f_q), result, f_q) + mstore(15008, result) } mstore( - 0x3ae0, - mulmod(8207090019724696496350398458716998472718344609680392612601596849934418295470, mload(0x3900), f_q) + 0x3ac0, + mulmod(3860370625838117017501327045244227871206764201116468958063324100051382735289, mload(0x38e0), f_q) ) mstore( - 0x3b00, - mulmod(mload(0x3ae0), 8374374965308410102411073611984011876711565317741801500439755773472076597347, f_q) + 0x3ae0, + mulmod( + mload(0x3ac0), 11211301017135681023579411905410872569206244553457844956874280139879520583390, f_q + ) ) { - let result := mulmod(mload(0xe40), mload(0x3ae0), f_q) - result := addmod(mulmod(mload(0xa80), sub(f_q, mload(0x3b00)), f_q), result, f_q) - mstore(15136, result) + let result := mulmod(mload(0xe40), mload(0x3ac0), f_q) + result := addmod(mulmod(mload(0xa80), sub(f_q, mload(0x3ae0)), f_q), result, f_q) + mstore(15104, result) } mstore( - 0x3b40, - mulmod(7391709068497399131897422873231908718558236401035363928063603272120120747483, mload(0x3900), f_q) - ) - mstore( - 0x3b60, + 0x3b20, mulmod( - mload(0x3b40), 11211301017135681023579411905410872569206244553457844956874280139879520583390, f_q + 21616901807277407275624036604424346159916096890712898844034238973395610537327, mload(0x38e0), f_q ) ) + mstore( + 0x3b40, + mulmod(mload(0x3b20), 1426404432721484388505361748317961535523355871255605456897797744433766488507, f_q) + ) { - let result := mulmod(mload(0xe40), mload(0x3b40), f_q) - result := addmod(mulmod(mload(0xa80), sub(f_q, mload(0x3b60)), f_q), result, f_q) - mstore(15232, result) + let result := mulmod(mload(0xe40), mload(0x3b20), f_q) + result := addmod(mulmod(mload(0xa80), sub(f_q, mload(0x3b40)), f_q), result, f_q) + mstore(15200, result) } + mstore( + 0x3b80, + mulmod(3209408481237076479025468386201293941554240476766691830436732310949352383503, mload(0x38e0), f_q) + ) mstore( 0x3ba0, mulmod( - 19036273796805830823244991598792794567595348772040298280440552631112242221017, mload(0x3900), f_q + mload(0x3b80), 12619617507853212586156872920672483948819476989779550311307282715684870266992, f_q ) ) - mstore( - 0x3bc0, - mulmod(mload(0x3ba0), 3615478808282855240548287271348143516886772452944084747768312988864436725401, f_q) - ) { - let result := mulmod(mload(0xe40), mload(0x3ba0), f_q) - result := addmod(mulmod(mload(0xa80), sub(f_q, mload(0x3bc0)), f_q), result, f_q) - mstore(15328, result) + let result := mulmod(mload(0xe40), mload(0x3b80), f_q) + result := addmod(mulmod(mload(0xa80), sub(f_q, mload(0x3ba0)), f_q), result, f_q) + mstore(15296, result) } - mstore(0x3c00, mulmod(1, mload(0x39a0), f_q)) - mstore(0x3c20, mulmod(mload(0x3c00), mload(0x39e0), f_q)) - mstore(0x3c40, mulmod(mload(0x3c20), mload(0x3a20), f_q)) - mstore(0x3c60, mulmod(mload(0x3c40), mload(0x3a60), f_q)) + mstore(0x3be0, mulmod(1, mload(0x3980), f_q)) + mstore(0x3c00, mulmod(mload(0x3be0), mload(0x39c0), f_q)) + mstore(0x3c20, mulmod(mload(0x3c00), mload(0x3a00), f_q)) + mstore(0x3c40, mulmod(mload(0x3c20), mload(0x3a40), f_q)) mstore( - 0x3c80, - mulmod(13513867906530865119835332133273263211836799082674232843258448413103731898271, mload(0xa80), f_q) + 0x3c60, + mulmod(10676941854703594198666993839846402519342119846958189386823924046696287912228, mload(0xa80), f_q) ) - mstore(0x3ca0, mulmod(mload(0x3c80), 1, f_q)) + mstore(0x3c80, mulmod(mload(0x3c60), 1, f_q)) { - let result := mulmod(mload(0xe40), mload(0x3c80), f_q) - result := addmod(mulmod(mload(0xa80), sub(f_q, mload(0x3ca0)), f_q), result, f_q) - mstore(15552, result) + let result := mulmod(mload(0xe40), mload(0x3c60), f_q) + result := addmod(mulmod(mload(0xa80), sub(f_q, mload(0x3c80)), f_q), result, f_q) + mstore(15520, result) } mstore( - 0x3ce0, - mulmod(8374374965308410102411073611984011876711565317741801500439755773472076597346, mload(0xa80), f_q) + 0x3cc0, + mulmod(11211301017135681023579411905410872569206244553457844956874280139879520583389, mload(0xa80), f_q) ) mstore( - 0x3d00, - mulmod(mload(0x3ce0), 8374374965308410102411073611984011876711565317741801500439755773472076597347, f_q) + 0x3ce0, + mulmod( + mload(0x3cc0), 11211301017135681023579411905410872569206244553457844956874280139879520583390, f_q + ) ) { - let result := mulmod(mload(0xe40), mload(0x3ce0), f_q) - result := addmod(mulmod(mload(0xa80), sub(f_q, mload(0x3d00)), f_q), result, f_q) - mstore(15648, result) + let result := mulmod(mload(0xe40), mload(0x3cc0), f_q) + result := addmod(mulmod(mload(0xa80), sub(f_q, mload(0x3ce0)), f_q), result, f_q) + mstore(15616, result) } mstore( - 0x3d40, - mulmod(12146688980418810893951125255607130521645347193942732958664170801695864621271, mload(0xa80), f_q) + 0x3d20, + mulmod(13154116519010929542673167886091370382741775939114889923107781597533678454430, mload(0xa80), f_q) ) - mstore(0x3d60, mulmod(mload(0x3d40), 1, f_q)) + mstore(0x3d40, mulmod(mload(0x3d20), 1, f_q)) { - let result := mulmod(mload(0xe40), mload(0x3d40), f_q) - result := addmod(mulmod(mload(0xa80), sub(f_q, mload(0x3d60)), f_q), result, f_q) - mstore(15744, result) + let result := mulmod(mload(0xe40), mload(0x3d20), f_q) + result := addmod(mulmod(mload(0xa80), sub(f_q, mload(0x3d40)), f_q), result, f_q) + mstore(15712, result) } mstore( - 0x3da0, - mulmod(9741553891420464328295280489650144566903017206473301385034033384879943874346, mload(0xa80), f_q) + 0x3d80, + mulmod(8734126352828345679573237859165904705806588461301144420590422589042130041187, mload(0xa80), f_q) ) mstore( - 0x3dc0, - mulmod(mload(0x3da0), 9741553891420464328295280489650144566903017206473301385034033384879943874347, f_q) + 0x3da0, + mulmod(mload(0x3d80), 8734126352828345679573237859165904705806588461301144420590422589042130041188, f_q) ) { - let result := mulmod(mload(0xe40), mload(0x3da0), f_q) - result := addmod(mulmod(mload(0xa80), sub(f_q, mload(0x3dc0)), f_q), result, f_q) - mstore(15840, result) + let result := mulmod(mload(0xe40), mload(0x3d80), f_q) + result := addmod(mulmod(mload(0xa80), sub(f_q, mload(0x3da0)), f_q), result, f_q) + mstore(15808, result) } - mstore(0x3e00, mulmod(mload(0x3c00), mload(0x3960), f_q)) + mstore(0x3de0, mulmod(mload(0x3be0), mload(0x3940), f_q)) { let result := mulmod(mload(0xe40), 1, f_q) result := @@ -1494,30 +1503,33 @@ contract Halo2Verifier { result, f_q ) - mstore(15904, result) + mstore(15872, result) } { - let prod := mload(0x3ac0) + let prod := mload(0x3aa0) - prod := mulmod(mload(0x3b20), prod, f_q) + prod := mulmod(mload(0x3b00), prod, f_q) + mstore(0x3e20, prod) + + prod := mulmod(mload(0x3b60), prod, f_q) mstore(0x3e40, prod) - prod := mulmod(mload(0x3b80), prod, f_q) + prod := mulmod(mload(0x3bc0), prod, f_q) mstore(0x3e60, prod) - prod := mulmod(mload(0x3be0), prod, f_q) + prod := mulmod(mload(0x3ca0), prod, f_q) mstore(0x3e80, prod) - prod := mulmod(mload(0x3cc0), prod, f_q) + prod := mulmod(mload(0x3d00), prod, f_q) mstore(0x3ea0, prod) - prod := mulmod(mload(0x3d20), prod, f_q) + prod := mulmod(mload(0x3c00), prod, f_q) mstore(0x3ec0, prod) - prod := mulmod(mload(0x3c20), prod, f_q) + prod := mulmod(mload(0x3d60), prod, f_q) mstore(0x3ee0, prod) - prod := mulmod(mload(0x3d80), prod, f_q) + prod := mulmod(mload(0x3dc0), prod, f_q) mstore(0x3f00, prod) prod := mulmod(mload(0x3de0), prod, f_q) @@ -1526,29 +1538,22 @@ contract Halo2Verifier { prod := mulmod(mload(0x3e00), prod, f_q) mstore(0x3f40, prod) - prod := mulmod(mload(0x3e20), prod, f_q) + prod := mulmod(mload(0x3be0), prod, f_q) mstore(0x3f60, prod) - - prod := mulmod(mload(0x3c00), prod, f_q) - mstore(0x3f80, prod) } + mstore(0x3fa0, 32) mstore(0x3fc0, 32) mstore(0x3fe0, 32) - mstore(0x4000, 32) - mstore(0x4020, mload(0x3f80)) - mstore(0x4040, 21888242871839275222246405745257275088548364400416034343698204186575808495615) - mstore(0x4060, 21888242871839275222246405745257275088548364400416034343698204186575808495617) - success := and(eq(staticcall(gas(), 0x5, 0x3fc0, 0xc0, 0x3fa0, 0x20), 1), success) + mstore(0x4000, mload(0x3f60)) + mstore(0x4020, 21888242871839275222246405745257275088548364400416034343698204186575808495615) + mstore(0x4040, 21888242871839275222246405745257275088548364400416034343698204186575808495617) + success := and(eq(staticcall(gas(), 0x5, 0x3fa0, 0xc0, 0x3f80, 0x20), 1), success) { - let inv := mload(0x3fa0) + let inv := mload(0x3f80) let v - v := mload(0x3c00) - mstore(15360, mulmod(mload(0x3f60), inv, f_q)) - inv := mulmod(v, inv, f_q) - - v := mload(0x3e20) - mstore(15904, mulmod(mload(0x3f40), inv, f_q)) + v := mload(0x3be0) + mstore(15328, mulmod(mload(0x3f40), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(0x3e00) @@ -1559,99 +1564,104 @@ contract Halo2Verifier { mstore(15840, mulmod(mload(0x3f00), inv, f_q)) inv := mulmod(v, inv, f_q) - v := mload(0x3d80) - mstore(15744, mulmod(mload(0x3ee0), inv, f_q)) + v := mload(0x3dc0) + mstore(15808, mulmod(mload(0x3ee0), inv, f_q)) inv := mulmod(v, inv, f_q) - v := mload(0x3c20) - mstore(15392, mulmod(mload(0x3ec0), inv, f_q)) + v := mload(0x3d60) + mstore(15712, mulmod(mload(0x3ec0), inv, f_q)) inv := mulmod(v, inv, f_q) - v := mload(0x3d20) - mstore(15648, mulmod(mload(0x3ea0), inv, f_q)) + v := mload(0x3c00) + mstore(15360, mulmod(mload(0x3ea0), inv, f_q)) inv := mulmod(v, inv, f_q) - v := mload(0x3cc0) - mstore(15552, mulmod(mload(0x3e80), inv, f_q)) + v := mload(0x3d00) + mstore(15616, mulmod(mload(0x3e80), inv, f_q)) inv := mulmod(v, inv, f_q) - v := mload(0x3be0) - mstore(15328, mulmod(mload(0x3e60), inv, f_q)) + v := mload(0x3ca0) + mstore(15520, mulmod(mload(0x3e60), inv, f_q)) + inv := mulmod(v, inv, f_q) + + v := mload(0x3bc0) + mstore(15296, mulmod(mload(0x3e40), inv, f_q)) inv := mulmod(v, inv, f_q) - v := mload(0x3b80) - mstore(15232, mulmod(mload(0x3e40), inv, f_q)) + v := mload(0x3b60) + mstore(15200, mulmod(mload(0x3e20), inv, f_q)) inv := mulmod(v, inv, f_q) - v := mload(0x3b20) - mstore(15136, mulmod(mload(0x3ac0), inv, f_q)) + v := mload(0x3b00) + mstore(15104, mulmod(mload(0x3aa0), inv, f_q)) inv := mulmod(v, inv, f_q) - mstore(0x3ac0, inv) + mstore(0x3aa0, inv) } { - let result := mload(0x3ac0) - result := addmod(mload(0x3b20), result, f_q) - result := addmod(mload(0x3b80), result, f_q) - result := addmod(mload(0x3be0), result, f_q) - mstore(16512, result) + let result := mload(0x3aa0) + result := addmod(mload(0x3b00), result, f_q) + result := addmod(mload(0x3b60), result, f_q) + result := addmod(mload(0x3bc0), result, f_q) + mstore(16480, result) } - mstore(0x40a0, mulmod(mload(0x3c60), mload(0x3c20), f_q)) + mstore(0x4080, mulmod(mload(0x3c40), mload(0x3c00), f_q)) { - let result := mload(0x3cc0) - result := addmod(mload(0x3d20), result, f_q) - mstore(16576, result) + let result := mload(0x3ca0) + result := addmod(mload(0x3d00), result, f_q) + mstore(16544, result) } - mstore(0x40e0, mulmod(mload(0x3c60), mload(0x3e00), f_q)) + mstore(0x40c0, mulmod(mload(0x3c40), mload(0x3de0), f_q)) { - let result := mload(0x3d80) - result := addmod(mload(0x3de0), result, f_q) - mstore(16640, result) + let result := mload(0x3d60) + result := addmod(mload(0x3dc0), result, f_q) + mstore(16608, result) } - mstore(0x4120, mulmod(mload(0x3c60), mload(0x3c00), f_q)) + mstore(0x4100, mulmod(mload(0x3c40), mload(0x3be0), f_q)) { - let result := mload(0x3e20) - mstore(16704, result) + let result := mload(0x3e00) + mstore(16672, result) } { - let prod := mload(0x4080) + let prod := mload(0x4060) + + prod := mulmod(mload(0x40a0), prod, f_q) + mstore(0x4140, prod) - prod := mulmod(mload(0x40c0), prod, f_q) + prod := mulmod(mload(0x40e0), prod, f_q) mstore(0x4160, prod) - prod := mulmod(mload(0x4100), prod, f_q) + prod := mulmod(mload(0x4120), prod, f_q) mstore(0x4180, prod) - - prod := mulmod(mload(0x4140), prod, f_q) - mstore(0x41a0, prod) } + mstore(0x41c0, 32) mstore(0x41e0, 32) mstore(0x4200, 32) - mstore(0x4220, 32) - mstore(0x4240, mload(0x41a0)) - mstore(0x4260, 21888242871839275222246405745257275088548364400416034343698204186575808495615) - mstore(0x4280, 21888242871839275222246405745257275088548364400416034343698204186575808495617) - success := and(eq(staticcall(gas(), 0x5, 0x41e0, 0xc0, 0x41c0, 0x20), 1), success) + mstore(0x4220, mload(0x4180)) + mstore(0x4240, 21888242871839275222246405745257275088548364400416034343698204186575808495615) + mstore(0x4260, 21888242871839275222246405745257275088548364400416034343698204186575808495617) + success := and(eq(staticcall(gas(), 0x5, 0x41c0, 0xc0, 0x41a0, 0x20), 1), success) { - let inv := mload(0x41c0) + let inv := mload(0x41a0) let v - v := mload(0x4140) - mstore(16704, mulmod(mload(0x4180), inv, f_q)) + v := mload(0x4120) + mstore(16672, mulmod(mload(0x4160), inv, f_q)) inv := mulmod(v, inv, f_q) - v := mload(0x4100) - mstore(16640, mulmod(mload(0x4160), inv, f_q)) + v := mload(0x40e0) + mstore(16608, mulmod(mload(0x4140), inv, f_q)) inv := mulmod(v, inv, f_q) - v := mload(0x40c0) - mstore(16576, mulmod(mload(0x4080), inv, f_q)) + v := mload(0x40a0) + mstore(16544, mulmod(mload(0x4060), inv, f_q)) inv := mulmod(v, inv, f_q) - mstore(0x4080, inv) + mstore(0x4060, inv) } - mstore(0x42a0, mulmod(mload(0x40a0), mload(0x40c0), f_q)) - mstore(0x42c0, mulmod(mload(0x40e0), mload(0x4100), f_q)) - mstore(0x42e0, mulmod(mload(0x4120), mload(0x4140), f_q)) - mstore(0x4300, mulmod(mload(0xd40), mload(0xd40), f_q)) + mstore(0x4280, mulmod(mload(0x4080), mload(0x40a0), f_q)) + mstore(0x42a0, mulmod(mload(0x40c0), mload(0x40e0), f_q)) + mstore(0x42c0, mulmod(mload(0x4100), mload(0x4120), f_q)) + mstore(0x42e0, mulmod(mload(0xd40), mload(0xd40), f_q)) + mstore(0x4300, mulmod(mload(0x42e0), mload(0xd40), f_q)) mstore(0x4320, mulmod(mload(0x4300), mload(0xd40), f_q)) mstore(0x4340, mulmod(mload(0x4320), mload(0xd40), f_q)) mstore(0x4360, mulmod(mload(0x4340), mload(0xd40), f_q)) @@ -1659,372 +1669,371 @@ contract Halo2Verifier { mstore(0x43a0, mulmod(mload(0x4380), mload(0xd40), f_q)) mstore(0x43c0, mulmod(mload(0x43a0), mload(0xd40), f_q)) mstore(0x43e0, mulmod(mload(0x43c0), mload(0xd40), f_q)) - mstore(0x4400, mulmod(mload(0x43e0), mload(0xd40), f_q)) - mstore(0x4420, mulmod(mload(0xda0), mload(0xda0), f_q)) + mstore(0x4400, mulmod(mload(0xda0), mload(0xda0), f_q)) + mstore(0x4420, mulmod(mload(0x4400), mload(0xda0), f_q)) mstore(0x4440, mulmod(mload(0x4420), mload(0xda0), f_q)) - mstore(0x4460, mulmod(mload(0x4440), mload(0xda0), f_q)) { - let result := mulmod(mload(0xac0), mload(0x3ac0), f_q) - result := addmod(mulmod(mload(0xae0), mload(0x3b20), f_q), result, f_q) - result := addmod(mulmod(mload(0xb00), mload(0x3b80), f_q), result, f_q) - result := addmod(mulmod(mload(0xb20), mload(0x3be0), f_q), result, f_q) - mstore(17536, result) + let result := mulmod(mload(0xac0), mload(0x3aa0), f_q) + result := addmod(mulmod(mload(0xae0), mload(0x3b00), f_q), result, f_q) + result := addmod(mulmod(mload(0xb00), mload(0x3b60), f_q), result, f_q) + result := addmod(mulmod(mload(0xb20), mload(0x3bc0), f_q), result, f_q) + mstore(17504, result) } - mstore(0x44a0, mulmod(mload(0x4480), mload(0x4080), f_q)) - mstore(0x44c0, mulmod(sub(f_q, mload(0x44a0)), 1, f_q)) - mstore(0x44e0, mulmod(mload(0x44c0), 1, f_q)) - mstore(0x4500, mulmod(1, mload(0x40a0), f_q)) + mstore(0x4480, mulmod(mload(0x4460), mload(0x4060), f_q)) + mstore(0x44a0, mulmod(sub(f_q, mload(0x4480)), 1, f_q)) + mstore(0x44c0, mulmod(mload(0x44a0), 1, f_q)) + mstore(0x44e0, mulmod(1, mload(0x4080), f_q)) { - let result := mulmod(mload(0xc40), mload(0x3cc0), f_q) - result := addmod(mulmod(mload(0xc60), mload(0x3d20), f_q), result, f_q) - mstore(17696, result) + let result := mulmod(mload(0xc40), mload(0x3ca0), f_q) + result := addmod(mulmod(mload(0xc60), mload(0x3d00), f_q), result, f_q) + mstore(17664, result) } - mstore(0x4540, mulmod(mload(0x4520), mload(0x42a0), f_q)) - mstore(0x4560, mulmod(sub(f_q, mload(0x4540)), 1, f_q)) - mstore(0x4580, mulmod(mload(0x4500), 1, f_q)) + mstore(0x4520, mulmod(mload(0x4500), mload(0x4280), f_q)) + mstore(0x4540, mulmod(sub(f_q, mload(0x4520)), 1, f_q)) + mstore(0x4560, mulmod(mload(0x44e0), 1, f_q)) { - let result := mulmod(mload(0xc80), mload(0x3cc0), f_q) - result := addmod(mulmod(mload(0xca0), mload(0x3d20), f_q), result, f_q) - mstore(17824, result) + let result := mulmod(mload(0xc80), mload(0x3ca0), f_q) + result := addmod(mulmod(mload(0xca0), mload(0x3d00), f_q), result, f_q) + mstore(17792, result) } - mstore(0x45c0, mulmod(mload(0x45a0), mload(0x42a0), f_q)) - mstore(0x45e0, mulmod(sub(f_q, mload(0x45c0)), mload(0xd40), f_q)) - mstore(0x4600, mulmod(mload(0x4500), mload(0xd40), f_q)) - mstore(0x4620, addmod(mload(0x4560), mload(0x45e0), f_q)) - mstore(0x4640, mulmod(mload(0x4620), mload(0xda0), f_q)) - mstore(0x4660, mulmod(mload(0x4580), mload(0xda0), f_q)) - mstore(0x4680, mulmod(mload(0x4600), mload(0xda0), f_q)) - mstore(0x46a0, addmod(mload(0x44e0), mload(0x4640), f_q)) - mstore(0x46c0, mulmod(1, mload(0x40e0), f_q)) + mstore(0x45a0, mulmod(mload(0x4580), mload(0x4280), f_q)) + mstore(0x45c0, mulmod(sub(f_q, mload(0x45a0)), mload(0xd40), f_q)) + mstore(0x45e0, mulmod(mload(0x44e0), mload(0xd40), f_q)) + mstore(0x4600, addmod(mload(0x4540), mload(0x45c0), f_q)) + mstore(0x4620, mulmod(mload(0x4600), mload(0xda0), f_q)) + mstore(0x4640, mulmod(mload(0x4560), mload(0xda0), f_q)) + mstore(0x4660, mulmod(mload(0x45e0), mload(0xda0), f_q)) + mstore(0x4680, addmod(mload(0x44c0), mload(0x4620), f_q)) + mstore(0x46a0, mulmod(1, mload(0x40c0), f_q)) { - let result := mulmod(mload(0xcc0), mload(0x3d80), f_q) - result := addmod(mulmod(mload(0xce0), mload(0x3de0), f_q), result, f_q) - mstore(18144, result) + let result := mulmod(mload(0xcc0), mload(0x3d60), f_q) + result := addmod(mulmod(mload(0xce0), mload(0x3dc0), f_q), result, f_q) + mstore(18112, result) } - mstore(0x4700, mulmod(mload(0x46e0), mload(0x42c0), f_q)) - mstore(0x4720, mulmod(sub(f_q, mload(0x4700)), 1, f_q)) - mstore(0x4740, mulmod(mload(0x46c0), 1, f_q)) - mstore(0x4760, mulmod(mload(0x4720), mload(0x4420), f_q)) - mstore(0x4780, mulmod(mload(0x4740), mload(0x4420), f_q)) - mstore(0x47a0, addmod(mload(0x46a0), mload(0x4760), f_q)) - mstore(0x47c0, mulmod(1, mload(0x4120), f_q)) + mstore(0x46e0, mulmod(mload(0x46c0), mload(0x42a0), f_q)) + mstore(0x4700, mulmod(sub(f_q, mload(0x46e0)), 1, f_q)) + mstore(0x4720, mulmod(mload(0x46a0), 1, f_q)) + mstore(0x4740, mulmod(mload(0x4700), mload(0x4400), f_q)) + mstore(0x4760, mulmod(mload(0x4720), mload(0x4400), f_q)) + mstore(0x4780, addmod(mload(0x4680), mload(0x4740), f_q)) + mstore(0x47a0, mulmod(1, mload(0x4100), f_q)) { - let result := mulmod(mload(0xd00), mload(0x3e20), f_q) - mstore(18400, result) + let result := mulmod(mload(0xd00), mload(0x3e00), f_q) + mstore(18368, result) } - mstore(0x4800, mulmod(mload(0x47e0), mload(0x42e0), f_q)) - mstore(0x4820, mulmod(sub(f_q, mload(0x4800)), 1, f_q)) - mstore(0x4840, mulmod(mload(0x47c0), 1, f_q)) + mstore(0x47e0, mulmod(mload(0x47c0), mload(0x42c0), f_q)) + mstore(0x4800, mulmod(sub(f_q, mload(0x47e0)), 1, f_q)) + mstore(0x4820, mulmod(mload(0x47a0), 1, f_q)) { - let result := mulmod(mload(0xb40), mload(0x3e20), f_q) - mstore(18528, result) + let result := mulmod(mload(0xb40), mload(0x3e00), f_q) + mstore(18496, result) } - mstore(0x4880, mulmod(mload(0x4860), mload(0x42e0), f_q)) - mstore(0x48a0, mulmod(sub(f_q, mload(0x4880)), mload(0xd40), f_q)) - mstore(0x48c0, mulmod(mload(0x47c0), mload(0xd40), f_q)) - mstore(0x48e0, addmod(mload(0x4820), mload(0x48a0), f_q)) + mstore(0x4860, mulmod(mload(0x4840), mload(0x42c0), f_q)) + mstore(0x4880, mulmod(sub(f_q, mload(0x4860)), mload(0xd40), f_q)) + mstore(0x48a0, mulmod(mload(0x47a0), mload(0xd40), f_q)) + mstore(0x48c0, addmod(mload(0x4800), mload(0x4880), f_q)) { - let result := mulmod(mload(0xb60), mload(0x3e20), f_q) - mstore(18688, result) + let result := mulmod(mload(0xb60), mload(0x3e00), f_q) + mstore(18656, result) } - mstore(0x4920, mulmod(mload(0x4900), mload(0x42e0), f_q)) - mstore(0x4940, mulmod(sub(f_q, mload(0x4920)), mload(0x4300), f_q)) - mstore(0x4960, mulmod(mload(0x47c0), mload(0x4300), f_q)) - mstore(0x4980, addmod(mload(0x48e0), mload(0x4940), f_q)) + mstore(0x4900, mulmod(mload(0x48e0), mload(0x42c0), f_q)) + mstore(0x4920, mulmod(sub(f_q, mload(0x4900)), mload(0x42e0), f_q)) + mstore(0x4940, mulmod(mload(0x47a0), mload(0x42e0), f_q)) + mstore(0x4960, addmod(mload(0x48c0), mload(0x4920), f_q)) { - let result := mulmod(mload(0xb80), mload(0x3e20), f_q) - mstore(18848, result) + let result := mulmod(mload(0xb80), mload(0x3e00), f_q) + mstore(18816, result) } - mstore(0x49c0, mulmod(mload(0x49a0), mload(0x42e0), f_q)) - mstore(0x49e0, mulmod(sub(f_q, mload(0x49c0)), mload(0x4320), f_q)) - mstore(0x4a00, mulmod(mload(0x47c0), mload(0x4320), f_q)) - mstore(0x4a20, addmod(mload(0x4980), mload(0x49e0), f_q)) + mstore(0x49a0, mulmod(mload(0x4980), mload(0x42c0), f_q)) + mstore(0x49c0, mulmod(sub(f_q, mload(0x49a0)), mload(0x4300), f_q)) + mstore(0x49e0, mulmod(mload(0x47a0), mload(0x4300), f_q)) + mstore(0x4a00, addmod(mload(0x4960), mload(0x49c0), f_q)) { - let result := mulmod(mload(0xba0), mload(0x3e20), f_q) - mstore(19008, result) + let result := mulmod(mload(0xba0), mload(0x3e00), f_q) + mstore(18976, result) } - mstore(0x4a60, mulmod(mload(0x4a40), mload(0x42e0), f_q)) - mstore(0x4a80, mulmod(sub(f_q, mload(0x4a60)), mload(0x4340), f_q)) - mstore(0x4aa0, mulmod(mload(0x47c0), mload(0x4340), f_q)) - mstore(0x4ac0, addmod(mload(0x4a20), mload(0x4a80), f_q)) + mstore(0x4a40, mulmod(mload(0x4a20), mload(0x42c0), f_q)) + mstore(0x4a60, mulmod(sub(f_q, mload(0x4a40)), mload(0x4320), f_q)) + mstore(0x4a80, mulmod(mload(0x47a0), mload(0x4320), f_q)) + mstore(0x4aa0, addmod(mload(0x4a00), mload(0x4a60), f_q)) { - let result := mulmod(mload(0xbe0), mload(0x3e20), f_q) - mstore(19168, result) + let result := mulmod(mload(0xbe0), mload(0x3e00), f_q) + mstore(19136, result) } - mstore(0x4b00, mulmod(mload(0x4ae0), mload(0x42e0), f_q)) - mstore(0x4b20, mulmod(sub(f_q, mload(0x4b00)), mload(0x4360), f_q)) - mstore(0x4b40, mulmod(mload(0x47c0), mload(0x4360), f_q)) - mstore(0x4b60, addmod(mload(0x4ac0), mload(0x4b20), f_q)) + mstore(0x4ae0, mulmod(mload(0x4ac0), mload(0x42c0), f_q)) + mstore(0x4b00, mulmod(sub(f_q, mload(0x4ae0)), mload(0x4340), f_q)) + mstore(0x4b20, mulmod(mload(0x47a0), mload(0x4340), f_q)) + mstore(0x4b40, addmod(mload(0x4aa0), mload(0x4b00), f_q)) { - let result := mulmod(mload(0xc00), mload(0x3e20), f_q) - mstore(19328, result) + let result := mulmod(mload(0xc00), mload(0x3e00), f_q) + mstore(19296, result) } - mstore(0x4ba0, mulmod(mload(0x4b80), mload(0x42e0), f_q)) - mstore(0x4bc0, mulmod(sub(f_q, mload(0x4ba0)), mload(0x4380), f_q)) - mstore(0x4be0, mulmod(mload(0x47c0), mload(0x4380), f_q)) - mstore(0x4c00, addmod(mload(0x4b60), mload(0x4bc0), f_q)) + mstore(0x4b80, mulmod(mload(0x4b60), mload(0x42c0), f_q)) + mstore(0x4ba0, mulmod(sub(f_q, mload(0x4b80)), mload(0x4360), f_q)) + mstore(0x4bc0, mulmod(mload(0x47a0), mload(0x4360), f_q)) + mstore(0x4be0, addmod(mload(0x4b40), mload(0x4ba0), f_q)) { - let result := mulmod(mload(0xc20), mload(0x3e20), f_q) - mstore(19488, result) + let result := mulmod(mload(0xc20), mload(0x3e00), f_q) + mstore(19456, result) } - mstore(0x4c40, mulmod(mload(0x4c20), mload(0x42e0), f_q)) - mstore(0x4c60, mulmod(sub(f_q, mload(0x4c40)), mload(0x43a0), f_q)) - mstore(0x4c80, mulmod(mload(0x47c0), mload(0x43a0), f_q)) - mstore(0x4ca0, addmod(mload(0x4c00), mload(0x4c60), f_q)) - mstore(0x4cc0, mulmod(mload(0x3880), mload(0x4120), f_q)) - mstore(0x4ce0, mulmod(mload(0x38a0), mload(0x4120), f_q)) - mstore(0x4d00, mulmod(mload(0x38c0), mload(0x4120), f_q)) + mstore(0x4c20, mulmod(mload(0x4c00), mload(0x42c0), f_q)) + mstore(0x4c40, mulmod(sub(f_q, mload(0x4c20)), mload(0x4380), f_q)) + mstore(0x4c60, mulmod(mload(0x47a0), mload(0x4380), f_q)) + mstore(0x4c80, addmod(mload(0x4be0), mload(0x4c40), f_q)) + mstore(0x4ca0, mulmod(mload(0x3860), mload(0x4100), f_q)) + mstore(0x4cc0, mulmod(mload(0x3880), mload(0x4100), f_q)) + mstore(0x4ce0, mulmod(mload(0x38a0), mload(0x4100), f_q)) { - let result := mulmod(mload(0x38e0), mload(0x3e20), f_q) - mstore(19744, result) + let result := mulmod(mload(0x38c0), mload(0x3e00), f_q) + mstore(19712, result) } - mstore(0x4d40, mulmod(mload(0x4d20), mload(0x42e0), f_q)) - mstore(0x4d60, mulmod(sub(f_q, mload(0x4d40)), mload(0x43c0), f_q)) - mstore(0x4d80, mulmod(mload(0x47c0), mload(0x43c0), f_q)) - mstore(0x4da0, mulmod(mload(0x4cc0), mload(0x43c0), f_q)) - mstore(0x4dc0, mulmod(mload(0x4ce0), mload(0x43c0), f_q)) - mstore(0x4de0, mulmod(mload(0x4d00), mload(0x43c0), f_q)) - mstore(0x4e00, addmod(mload(0x4ca0), mload(0x4d60), f_q)) + mstore(0x4d20, mulmod(mload(0x4d00), mload(0x42c0), f_q)) + mstore(0x4d40, mulmod(sub(f_q, mload(0x4d20)), mload(0x43a0), f_q)) + mstore(0x4d60, mulmod(mload(0x47a0), mload(0x43a0), f_q)) + mstore(0x4d80, mulmod(mload(0x4ca0), mload(0x43a0), f_q)) + mstore(0x4da0, mulmod(mload(0x4cc0), mload(0x43a0), f_q)) + mstore(0x4dc0, mulmod(mload(0x4ce0), mload(0x43a0), f_q)) + mstore(0x4de0, addmod(mload(0x4c80), mload(0x4d40), f_q)) { - let result := mulmod(mload(0xbc0), mload(0x3e20), f_q) - mstore(20000, result) + let result := mulmod(mload(0xbc0), mload(0x3e00), f_q) + mstore(19968, result) } - mstore(0x4e40, mulmod(mload(0x4e20), mload(0x42e0), f_q)) - mstore(0x4e60, mulmod(sub(f_q, mload(0x4e40)), mload(0x43e0), f_q)) - mstore(0x4e80, mulmod(mload(0x47c0), mload(0x43e0), f_q)) - mstore(0x4ea0, addmod(mload(0x4e00), mload(0x4e60), f_q)) - mstore(0x4ec0, mulmod(mload(0x4ea0), mload(0x4440), f_q)) - mstore(0x4ee0, mulmod(mload(0x4840), mload(0x4440), f_q)) - mstore(0x4f00, mulmod(mload(0x48c0), mload(0x4440), f_q)) - mstore(0x4f20, mulmod(mload(0x4960), mload(0x4440), f_q)) - mstore(0x4f40, mulmod(mload(0x4a00), mload(0x4440), f_q)) - mstore(0x4f60, mulmod(mload(0x4aa0), mload(0x4440), f_q)) - mstore(0x4f80, mulmod(mload(0x4b40), mload(0x4440), f_q)) - mstore(0x4fa0, mulmod(mload(0x4be0), mload(0x4440), f_q)) - mstore(0x4fc0, mulmod(mload(0x4c80), mload(0x4440), f_q)) - mstore(0x4fe0, mulmod(mload(0x4d80), mload(0x4440), f_q)) - mstore(0x5000, mulmod(mload(0x4da0), mload(0x4440), f_q)) - mstore(0x5020, mulmod(mload(0x4dc0), mload(0x4440), f_q)) - mstore(0x5040, mulmod(mload(0x4de0), mload(0x4440), f_q)) - mstore(0x5060, mulmod(mload(0x4e80), mload(0x4440), f_q)) - mstore(0x5080, addmod(mload(0x47a0), mload(0x4ec0), f_q)) - mstore(0x50a0, mulmod(1, mload(0x3c60), f_q)) - mstore(0x50c0, mulmod(1, mload(0xe40), f_q)) - mstore(0x50e0, 0x0000000000000000000000000000000000000000000000000000000000000001) - mstore(0x5100, 0x0000000000000000000000000000000000000000000000000000000000000002) - mstore(0x5120, mload(0x5080)) - success := and(eq(staticcall(gas(), 0x7, 0x50e0, 0x60, 0x50e0, 0x40), 1), success) + mstore(0x4e20, mulmod(mload(0x4e00), mload(0x42c0), f_q)) + mstore(0x4e40, mulmod(sub(f_q, mload(0x4e20)), mload(0x43c0), f_q)) + mstore(0x4e60, mulmod(mload(0x47a0), mload(0x43c0), f_q)) + mstore(0x4e80, addmod(mload(0x4de0), mload(0x4e40), f_q)) + mstore(0x4ea0, mulmod(mload(0x4e80), mload(0x4420), f_q)) + mstore(0x4ec0, mulmod(mload(0x4820), mload(0x4420), f_q)) + mstore(0x4ee0, mulmod(mload(0x48a0), mload(0x4420), f_q)) + mstore(0x4f00, mulmod(mload(0x4940), mload(0x4420), f_q)) + mstore(0x4f20, mulmod(mload(0x49e0), mload(0x4420), f_q)) + mstore(0x4f40, mulmod(mload(0x4a80), mload(0x4420), f_q)) + mstore(0x4f60, mulmod(mload(0x4b20), mload(0x4420), f_q)) + mstore(0x4f80, mulmod(mload(0x4bc0), mload(0x4420), f_q)) + mstore(0x4fa0, mulmod(mload(0x4c60), mload(0x4420), f_q)) + mstore(0x4fc0, mulmod(mload(0x4d60), mload(0x4420), f_q)) + mstore(0x4fe0, mulmod(mload(0x4d80), mload(0x4420), f_q)) + mstore(0x5000, mulmod(mload(0x4da0), mload(0x4420), f_q)) + mstore(0x5020, mulmod(mload(0x4dc0), mload(0x4420), f_q)) + mstore(0x5040, mulmod(mload(0x4e60), mload(0x4420), f_q)) + mstore(0x5060, addmod(mload(0x4780), mload(0x4ea0), f_q)) + mstore(0x5080, mulmod(1, mload(0x3c40), f_q)) + mstore(0x50a0, mulmod(1, mload(0xe40), f_q)) + mstore(0x50c0, 0x0000000000000000000000000000000000000000000000000000000000000001) + mstore(0x50e0, 0x0000000000000000000000000000000000000000000000000000000000000002) + mstore(0x5100, mload(0x5060)) + success := and(eq(staticcall(gas(), 0x7, 0x50c0, 0x60, 0x50c0, 0x40), 1), success) + mstore(0x5120, mload(0x50c0)) mstore(0x5140, mload(0x50e0)) - mstore(0x5160, mload(0x5100)) - mstore(0x5180, mload(0x660)) - mstore(0x51a0, mload(0x680)) - success := and(eq(staticcall(gas(), 0x6, 0x5140, 0x80, 0x5140, 0x40), 1), success) - mstore(0x51c0, mload(0x840)) - mstore(0x51e0, mload(0x860)) - mstore(0x5200, mload(0x4660)) - success := and(eq(staticcall(gas(), 0x7, 0x51c0, 0x60, 0x51c0, 0x40), 1), success) + mstore(0x5160, mload(0x660)) + mstore(0x5180, mload(0x680)) + success := and(eq(staticcall(gas(), 0x6, 0x5120, 0x80, 0x5120, 0x40), 1), success) + mstore(0x51a0, mload(0x840)) + mstore(0x51c0, mload(0x860)) + mstore(0x51e0, mload(0x4640)) + success := and(eq(staticcall(gas(), 0x7, 0x51a0, 0x60, 0x51a0, 0x40), 1), success) + mstore(0x5200, mload(0x5120)) mstore(0x5220, mload(0x5140)) - mstore(0x5240, mload(0x5160)) + mstore(0x5240, mload(0x51a0)) mstore(0x5260, mload(0x51c0)) - mstore(0x5280, mload(0x51e0)) - success := and(eq(staticcall(gas(), 0x6, 0x5220, 0x80, 0x5220, 0x40), 1), success) - mstore(0x52a0, mload(0x880)) - mstore(0x52c0, mload(0x8a0)) - mstore(0x52e0, mload(0x4680)) - success := and(eq(staticcall(gas(), 0x7, 0x52a0, 0x60, 0x52a0, 0x40), 1), success) + success := and(eq(staticcall(gas(), 0x6, 0x5200, 0x80, 0x5200, 0x40), 1), success) + mstore(0x5280, mload(0x880)) + mstore(0x52a0, mload(0x8a0)) + mstore(0x52c0, mload(0x4660)) + success := and(eq(staticcall(gas(), 0x7, 0x5280, 0x60, 0x5280, 0x40), 1), success) + mstore(0x52e0, mload(0x5200)) mstore(0x5300, mload(0x5220)) - mstore(0x5320, mload(0x5240)) + mstore(0x5320, mload(0x5280)) mstore(0x5340, mload(0x52a0)) - mstore(0x5360, mload(0x52c0)) - success := and(eq(staticcall(gas(), 0x6, 0x5300, 0x80, 0x5300, 0x40), 1), success) - mstore(0x5380, mload(0x700)) - mstore(0x53a0, mload(0x720)) - mstore(0x53c0, mload(0x4780)) - success := and(eq(staticcall(gas(), 0x7, 0x5380, 0x60, 0x5380, 0x40), 1), success) + success := and(eq(staticcall(gas(), 0x6, 0x52e0, 0x80, 0x52e0, 0x40), 1), success) + mstore(0x5360, mload(0x700)) + mstore(0x5380, mload(0x720)) + mstore(0x53a0, mload(0x4760)) + success := and(eq(staticcall(gas(), 0x7, 0x5360, 0x60, 0x5360, 0x40), 1), success) + mstore(0x53c0, mload(0x52e0)) mstore(0x53e0, mload(0x5300)) - mstore(0x5400, mload(0x5320)) + mstore(0x5400, mload(0x5360)) mstore(0x5420, mload(0x5380)) - mstore(0x5440, mload(0x53a0)) - success := and(eq(staticcall(gas(), 0x6, 0x53e0, 0x80, 0x53e0, 0x40), 1), success) - mstore(0x5460, mload(0x740)) - mstore(0x5480, mload(0x760)) - mstore(0x54a0, mload(0x4ee0)) - success := and(eq(staticcall(gas(), 0x7, 0x5460, 0x60, 0x5460, 0x40), 1), success) + success := and(eq(staticcall(gas(), 0x6, 0x53c0, 0x80, 0x53c0, 0x40), 1), success) + mstore(0x5440, mload(0x740)) + mstore(0x5460, mload(0x760)) + mstore(0x5480, mload(0x4ec0)) + success := and(eq(staticcall(gas(), 0x7, 0x5440, 0x60, 0x5440, 0x40), 1), success) + mstore(0x54a0, mload(0x53c0)) mstore(0x54c0, mload(0x53e0)) - mstore(0x54e0, mload(0x5400)) + mstore(0x54e0, mload(0x5440)) mstore(0x5500, mload(0x5460)) - mstore(0x5520, mload(0x5480)) - success := and(eq(staticcall(gas(), 0x6, 0x54c0, 0x80, 0x54c0, 0x40), 1), success) - mstore(0x5540, 0x04633090806662534335356654f3ee6430f215f4f010ae32ae068a900596d598) - mstore(0x5560, 0x2559e379146d41a440431d5bcb5ebdf2f978e08999ccf6cfff2586402050780f) - mstore(0x5580, mload(0x4f00)) - success := and(eq(staticcall(gas(), 0x7, 0x5540, 0x60, 0x5540, 0x40), 1), success) + success := and(eq(staticcall(gas(), 0x6, 0x54a0, 0x80, 0x54a0, 0x40), 1), success) + mstore(0x5520, 0x215365efc7b867c1204aab35fb060db538521b93b08872e3a9700c7ee4a285c2) + mstore(0x5540, 0x26da76077e618e9351d4e53058afcb50f9ecb808ef537ffed4c95f1e964a8c58) + mstore(0x5560, mload(0x4ee0)) + success := and(eq(staticcall(gas(), 0x7, 0x5520, 0x60, 0x5520, 0x40), 1), success) + mstore(0x5580, mload(0x54a0)) mstore(0x55a0, mload(0x54c0)) - mstore(0x55c0, mload(0x54e0)) + mstore(0x55c0, mload(0x5520)) mstore(0x55e0, mload(0x5540)) - mstore(0x5600, mload(0x5560)) - success := and(eq(staticcall(gas(), 0x6, 0x55a0, 0x80, 0x55a0, 0x40), 1), success) - mstore(0x5620, 0x2eb40e2b0c13a6f4b989cffa9dbc452447bfd9f04a79f6379aefea8c9850a550) - mstore(0x5640, 0x0efe5496541e2bd648d490f11ad542e1dec3127f818b8065843d0dd81358416c) - mstore(0x5660, mload(0x4f20)) - success := and(eq(staticcall(gas(), 0x7, 0x5620, 0x60, 0x5620, 0x40), 1), success) + success := and(eq(staticcall(gas(), 0x6, 0x5580, 0x80, 0x5580, 0x40), 1), success) + mstore(0x5600, 0x21c6ea7d6dbcd767ffb9d9beeb4f9c2f8243bc65290f2d75a59aea4f65ba8f3d) + mstore(0x5620, 0x24d0a0acb031c9a5687da08cdaf96650aae5c60435739bda8bbd574eb962622c) + mstore(0x5640, mload(0x4f00)) + success := and(eq(staticcall(gas(), 0x7, 0x5600, 0x60, 0x5600, 0x40), 1), success) + mstore(0x5660, mload(0x5580)) mstore(0x5680, mload(0x55a0)) - mstore(0x56a0, mload(0x55c0)) + mstore(0x56a0, mload(0x5600)) mstore(0x56c0, mload(0x5620)) - mstore(0x56e0, mload(0x5640)) - success := and(eq(staticcall(gas(), 0x6, 0x5680, 0x80, 0x5680, 0x40), 1), success) - mstore(0x5700, 0x18dca54423b6fa7932c92beff56ce260a3c726e3613c92fe0843d86b92199bfd) - mstore(0x5720, 0x0f6641ca942a4541625b14adb25ab0fd978060c98d01eb1b036fcdb1b8f77be1) - mstore(0x5740, mload(0x4f40)) - success := and(eq(staticcall(gas(), 0x7, 0x5700, 0x60, 0x5700, 0x40), 1), success) + success := and(eq(staticcall(gas(), 0x6, 0x5660, 0x80, 0x5660, 0x40), 1), success) + mstore(0x56e0, 0x289feda4952fe4464c9716d071e291bbecdcd5432356042dc79b76ed38cbbb0d) + mstore(0x5700, 0x07f3ca14a8801fa413462ad72ea448da5d7cf8c5218534cdc39bb23779b70bb9) + mstore(0x5720, mload(0x4f20)) + success := and(eq(staticcall(gas(), 0x7, 0x56e0, 0x60, 0x56e0, 0x40), 1), success) + mstore(0x5740, mload(0x5660)) mstore(0x5760, mload(0x5680)) - mstore(0x5780, mload(0x56a0)) + mstore(0x5780, mload(0x56e0)) mstore(0x57a0, mload(0x5700)) - mstore(0x57c0, mload(0x5720)) - success := and(eq(staticcall(gas(), 0x6, 0x5760, 0x80, 0x5760, 0x40), 1), success) - mstore(0x57e0, 0x23809cc9d17a8cb32381764c6234d3038148b8bec5d8573fb3470486feedd968) - mstore(0x5800, 0x1debabb870ec20dc2c4df55cbd88205b6dd234ad5805faf3a72e14b6f934f238) - mstore(0x5820, mload(0x4f60)) - success := and(eq(staticcall(gas(), 0x7, 0x57e0, 0x60, 0x57e0, 0x40), 1), success) + success := and(eq(staticcall(gas(), 0x6, 0x5740, 0x80, 0x5740, 0x40), 1), success) + mstore(0x57c0, 0x259670bd2f2f6fce3b18100f92a2e59874da3b66a9ddd61e163eb4b071e24a97) + mstore(0x57e0, 0x097f07272f7ca89070ad9c06d9a3da1bb6e91d0e69bf7872f44cc5d332291eb5) + mstore(0x5800, mload(0x4f40)) + success := and(eq(staticcall(gas(), 0x7, 0x57c0, 0x60, 0x57c0, 0x40), 1), success) + mstore(0x5820, mload(0x5740)) mstore(0x5840, mload(0x5760)) - mstore(0x5860, mload(0x5780)) + mstore(0x5860, mload(0x57c0)) mstore(0x5880, mload(0x57e0)) - mstore(0x58a0, mload(0x5800)) - success := and(eq(staticcall(gas(), 0x6, 0x5840, 0x80, 0x5840, 0x40), 1), success) - mstore(0x58c0, 0x10ff9174af9a7540d6335a6dad3dd0fe0c3943b24b706ba111c73534218c8d99) - mstore(0x58e0, 0x07769bf2a7e819b8b069c49481451ca34b9cfe9cf4ab6c03709a3b33aa9f25f9) - mstore(0x5900, mload(0x4f80)) - success := and(eq(staticcall(gas(), 0x7, 0x58c0, 0x60, 0x58c0, 0x40), 1), success) + success := and(eq(staticcall(gas(), 0x6, 0x5820, 0x80, 0x5820, 0x40), 1), success) + mstore(0x58a0, 0x1e9efbe537998d8260c28c8e2ca8d83118f378f1e83daed033c2ae772806280a) + mstore(0x58c0, 0x15e04128b5f6b9bb6c758886eda92c27e8414c25809bd547e4987c332c38a430) + mstore(0x58e0, mload(0x4f60)) + success := and(eq(staticcall(gas(), 0x7, 0x58a0, 0x60, 0x58a0, 0x40), 1), success) + mstore(0x5900, mload(0x5820)) mstore(0x5920, mload(0x5840)) - mstore(0x5940, mload(0x5860)) + mstore(0x5940, mload(0x58a0)) mstore(0x5960, mload(0x58c0)) - mstore(0x5980, mload(0x58e0)) - success := and(eq(staticcall(gas(), 0x6, 0x5920, 0x80, 0x5920, 0x40), 1), success) - mstore(0x59a0, 0x2347cc725aa8ab0c70557e7effada9a02cba0277f8aca1785f986430d8b63ad4) - mstore(0x59c0, 0x2f7f8f66561183dd0a7c6cf12a1fa248b80509334c8e87dbdcf192301a3c6a4d) - mstore(0x59e0, mload(0x4fa0)) - success := and(eq(staticcall(gas(), 0x7, 0x59a0, 0x60, 0x59a0, 0x40), 1), success) + success := and(eq(staticcall(gas(), 0x6, 0x5900, 0x80, 0x5900, 0x40), 1), success) + mstore(0x5980, 0x2db56ede49a6f38ee215d1fa9557ac54cb085bbb6170e9a2cda8db3c996c496e) + mstore(0x59a0, 0x017bd7af014917e84cda777f32c3b586cf6de90f0d649cbbce320ee837513cb8) + mstore(0x59c0, mload(0x4f80)) + success := and(eq(staticcall(gas(), 0x7, 0x5980, 0x60, 0x5980, 0x40), 1), success) + mstore(0x59e0, mload(0x5900)) mstore(0x5a00, mload(0x5920)) - mstore(0x5a20, mload(0x5940)) + mstore(0x5a20, mload(0x5980)) mstore(0x5a40, mload(0x59a0)) - mstore(0x5a60, mload(0x59c0)) - success := and(eq(staticcall(gas(), 0x6, 0x5a00, 0x80, 0x5a00, 0x40), 1), success) - mstore(0x5a80, 0x23eb59f4643a8f86f1bb54ebc274b4810126c9c2fae5d8de472ef0566afaa14c) - mstore(0x5aa0, 0x13b28c9220c717cac368247913075f4bb8da09cd9d0145c1292810854089c39c) - mstore(0x5ac0, mload(0x4fc0)) - success := and(eq(staticcall(gas(), 0x7, 0x5a80, 0x60, 0x5a80, 0x40), 1), success) + success := and(eq(staticcall(gas(), 0x6, 0x59e0, 0x80, 0x59e0, 0x40), 1), success) + mstore(0x5a60, 0x0f76818adad3c635f139fde306f33aba7249952bdbbf72cf477a51f9d84f3ccc) + mstore(0x5a80, 0x23f89f9896b1cc39de92659098ea839186ff2e997ffa3413c1a7af4f31abe4ce) + mstore(0x5aa0, mload(0x4fa0)) + success := and(eq(staticcall(gas(), 0x7, 0x5a60, 0x60, 0x5a60, 0x40), 1), success) + mstore(0x5ac0, mload(0x59e0)) mstore(0x5ae0, mload(0x5a00)) - mstore(0x5b00, mload(0x5a20)) + mstore(0x5b00, mload(0x5a60)) mstore(0x5b20, mload(0x5a80)) - mstore(0x5b40, mload(0x5aa0)) - success := and(eq(staticcall(gas(), 0x6, 0x5ae0, 0x80, 0x5ae0, 0x40), 1), success) - mstore(0x5b60, mload(0x960)) - mstore(0x5b80, mload(0x980)) - mstore(0x5ba0, mload(0x4fe0)) - success := and(eq(staticcall(gas(), 0x7, 0x5b60, 0x60, 0x5b60, 0x40), 1), success) + success := and(eq(staticcall(gas(), 0x6, 0x5ac0, 0x80, 0x5ac0, 0x40), 1), success) + mstore(0x5b40, mload(0x960)) + mstore(0x5b60, mload(0x980)) + mstore(0x5b80, mload(0x4fc0)) + success := and(eq(staticcall(gas(), 0x7, 0x5b40, 0x60, 0x5b40, 0x40), 1), success) + mstore(0x5ba0, mload(0x5ac0)) mstore(0x5bc0, mload(0x5ae0)) - mstore(0x5be0, mload(0x5b00)) + mstore(0x5be0, mload(0x5b40)) mstore(0x5c00, mload(0x5b60)) - mstore(0x5c20, mload(0x5b80)) - success := and(eq(staticcall(gas(), 0x6, 0x5bc0, 0x80, 0x5bc0, 0x40), 1), success) - mstore(0x5c40, mload(0x9a0)) - mstore(0x5c60, mload(0x9c0)) - mstore(0x5c80, mload(0x5000)) - success := and(eq(staticcall(gas(), 0x7, 0x5c40, 0x60, 0x5c40, 0x40), 1), success) + success := and(eq(staticcall(gas(), 0x6, 0x5ba0, 0x80, 0x5ba0, 0x40), 1), success) + mstore(0x5c20, mload(0x9a0)) + mstore(0x5c40, mload(0x9c0)) + mstore(0x5c60, mload(0x4fe0)) + success := and(eq(staticcall(gas(), 0x7, 0x5c20, 0x60, 0x5c20, 0x40), 1), success) + mstore(0x5c80, mload(0x5ba0)) mstore(0x5ca0, mload(0x5bc0)) - mstore(0x5cc0, mload(0x5be0)) + mstore(0x5cc0, mload(0x5c20)) mstore(0x5ce0, mload(0x5c40)) - mstore(0x5d00, mload(0x5c60)) - success := and(eq(staticcall(gas(), 0x6, 0x5ca0, 0x80, 0x5ca0, 0x40), 1), success) - mstore(0x5d20, mload(0x9e0)) - mstore(0x5d40, mload(0xa00)) - mstore(0x5d60, mload(0x5020)) - success := and(eq(staticcall(gas(), 0x7, 0x5d20, 0x60, 0x5d20, 0x40), 1), success) + success := and(eq(staticcall(gas(), 0x6, 0x5c80, 0x80, 0x5c80, 0x40), 1), success) + mstore(0x5d00, mload(0x9e0)) + mstore(0x5d20, mload(0xa00)) + mstore(0x5d40, mload(0x5000)) + success := and(eq(staticcall(gas(), 0x7, 0x5d00, 0x60, 0x5d00, 0x40), 1), success) + mstore(0x5d60, mload(0x5c80)) mstore(0x5d80, mload(0x5ca0)) - mstore(0x5da0, mload(0x5cc0)) + mstore(0x5da0, mload(0x5d00)) mstore(0x5dc0, mload(0x5d20)) - mstore(0x5de0, mload(0x5d40)) - success := and(eq(staticcall(gas(), 0x6, 0x5d80, 0x80, 0x5d80, 0x40), 1), success) - mstore(0x5e00, mload(0xa20)) - mstore(0x5e20, mload(0xa40)) - mstore(0x5e40, mload(0x5040)) - success := and(eq(staticcall(gas(), 0x7, 0x5e00, 0x60, 0x5e00, 0x40), 1), success) + success := and(eq(staticcall(gas(), 0x6, 0x5d60, 0x80, 0x5d60, 0x40), 1), success) + mstore(0x5de0, mload(0xa20)) + mstore(0x5e00, mload(0xa40)) + mstore(0x5e20, mload(0x5020)) + success := and(eq(staticcall(gas(), 0x7, 0x5de0, 0x60, 0x5de0, 0x40), 1), success) + mstore(0x5e40, mload(0x5d60)) mstore(0x5e60, mload(0x5d80)) - mstore(0x5e80, mload(0x5da0)) + mstore(0x5e80, mload(0x5de0)) mstore(0x5ea0, mload(0x5e00)) - mstore(0x5ec0, mload(0x5e20)) - success := and(eq(staticcall(gas(), 0x6, 0x5e60, 0x80, 0x5e60, 0x40), 1), success) - mstore(0x5ee0, mload(0x8c0)) - mstore(0x5f00, mload(0x8e0)) - mstore(0x5f20, mload(0x5060)) - success := and(eq(staticcall(gas(), 0x7, 0x5ee0, 0x60, 0x5ee0, 0x40), 1), success) + success := and(eq(staticcall(gas(), 0x6, 0x5e40, 0x80, 0x5e40, 0x40), 1), success) + mstore(0x5ec0, mload(0x8c0)) + mstore(0x5ee0, mload(0x8e0)) + mstore(0x5f00, mload(0x5040)) + success := and(eq(staticcall(gas(), 0x7, 0x5ec0, 0x60, 0x5ec0, 0x40), 1), success) + mstore(0x5f20, mload(0x5e40)) mstore(0x5f40, mload(0x5e60)) - mstore(0x5f60, mload(0x5e80)) + mstore(0x5f60, mload(0x5ec0)) mstore(0x5f80, mload(0x5ee0)) - mstore(0x5fa0, mload(0x5f00)) - success := and(eq(staticcall(gas(), 0x6, 0x5f40, 0x80, 0x5f40, 0x40), 1), success) - mstore(0x5fc0, mload(0xde0)) - mstore(0x5fe0, mload(0xe00)) - mstore(0x6000, sub(f_q, mload(0x50a0))) - success := and(eq(staticcall(gas(), 0x7, 0x5fc0, 0x60, 0x5fc0, 0x40), 1), success) + success := and(eq(staticcall(gas(), 0x6, 0x5f20, 0x80, 0x5f20, 0x40), 1), success) + mstore(0x5fa0, mload(0xde0)) + mstore(0x5fc0, mload(0xe00)) + mstore(0x5fe0, sub(f_q, mload(0x5080))) + success := and(eq(staticcall(gas(), 0x7, 0x5fa0, 0x60, 0x5fa0, 0x40), 1), success) + mstore(0x6000, mload(0x5f20)) mstore(0x6020, mload(0x5f40)) - mstore(0x6040, mload(0x5f60)) + mstore(0x6040, mload(0x5fa0)) mstore(0x6060, mload(0x5fc0)) - mstore(0x6080, mload(0x5fe0)) - success := and(eq(staticcall(gas(), 0x6, 0x6020, 0x80, 0x6020, 0x40), 1), success) - mstore(0x60a0, mload(0xe80)) - mstore(0x60c0, mload(0xea0)) - mstore(0x60e0, mload(0x50c0)) - success := and(eq(staticcall(gas(), 0x7, 0x60a0, 0x60, 0x60a0, 0x40), 1), success) + success := and(eq(staticcall(gas(), 0x6, 0x6000, 0x80, 0x6000, 0x40), 1), success) + mstore(0x6080, mload(0xe80)) + mstore(0x60a0, mload(0xea0)) + mstore(0x60c0, mload(0x50a0)) + success := and(eq(staticcall(gas(), 0x7, 0x6080, 0x60, 0x6080, 0x40), 1), success) + mstore(0x60e0, mload(0x6000)) mstore(0x6100, mload(0x6020)) - mstore(0x6120, mload(0x6040)) + mstore(0x6120, mload(0x6080)) mstore(0x6140, mload(0x60a0)) - mstore(0x6160, mload(0x60c0)) - success := and(eq(staticcall(gas(), 0x6, 0x6100, 0x80, 0x6100, 0x40), 1), success) + success := and(eq(staticcall(gas(), 0x6, 0x60e0, 0x80, 0x60e0, 0x40), 1), success) + mstore(0x6160, mload(0x60e0)) mstore(0x6180, mload(0x6100)) - mstore(0x61a0, mload(0x6120)) - mstore(0x61c0, mload(0xe80)) - mstore(0x61e0, mload(0xea0)) - mstore(0x6200, mload(0xec0)) - mstore(0x6220, mload(0xee0)) - mstore(0x6240, mload(0xf00)) - mstore(0x6260, mload(0xf20)) - mstore(0x6280, keccak256(0x6180, 256)) - mstore(25248, mod(mload(25216), f_q)) - mstore(0x62c0, mulmod(mload(0x62a0), mload(0x62a0), f_q)) - mstore(0x62e0, mulmod(1, mload(0x62a0), f_q)) + mstore(0x61a0, mload(0xe80)) + mstore(0x61c0, mload(0xea0)) + mstore(0x61e0, mload(0xec0)) + mstore(0x6200, mload(0xee0)) + mstore(0x6220, mload(0xf00)) + mstore(0x6240, mload(0xf20)) + mstore(0x6260, keccak256(0x6160, 256)) + mstore(25216, mod(mload(25184), f_q)) + mstore(0x62a0, mulmod(mload(0x6280), mload(0x6280), f_q)) + mstore(0x62c0, mulmod(1, mload(0x6280), f_q)) + mstore(0x62e0, mload(0x61e0)) mstore(0x6300, mload(0x6200)) - mstore(0x6320, mload(0x6220)) - mstore(0x6340, mload(0x62e0)) - success := and(eq(staticcall(gas(), 0x7, 0x6300, 0x60, 0x6300, 0x40), 1), success) + mstore(0x6320, mload(0x62c0)) + success := and(eq(staticcall(gas(), 0x7, 0x62e0, 0x60, 0x62e0, 0x40), 1), success) + mstore(0x6340, mload(0x6160)) mstore(0x6360, mload(0x6180)) - mstore(0x6380, mload(0x61a0)) + mstore(0x6380, mload(0x62e0)) mstore(0x63a0, mload(0x6300)) - mstore(0x63c0, mload(0x6320)) - success := and(eq(staticcall(gas(), 0x6, 0x6360, 0x80, 0x6360, 0x40), 1), success) + success := and(eq(staticcall(gas(), 0x6, 0x6340, 0x80, 0x6340, 0x40), 1), success) + mstore(0x63c0, mload(0x6220)) mstore(0x63e0, mload(0x6240)) - mstore(0x6400, mload(0x6260)) - mstore(0x6420, mload(0x62e0)) - success := and(eq(staticcall(gas(), 0x7, 0x63e0, 0x60, 0x63e0, 0x40), 1), success) + mstore(0x6400, mload(0x62c0)) + success := and(eq(staticcall(gas(), 0x7, 0x63c0, 0x60, 0x63c0, 0x40), 1), success) + mstore(0x6420, mload(0x61a0)) mstore(0x6440, mload(0x61c0)) - mstore(0x6460, mload(0x61e0)) + mstore(0x6460, mload(0x63c0)) mstore(0x6480, mload(0x63e0)) - mstore(0x64a0, mload(0x6400)) - success := and(eq(staticcall(gas(), 0x6, 0x6440, 0x80, 0x6440, 0x40), 1), success) + success := and(eq(staticcall(gas(), 0x6, 0x6420, 0x80, 0x6420, 0x40), 1), success) + mstore(0x64a0, mload(0x6340)) mstore(0x64c0, mload(0x6360)) - mstore(0x64e0, mload(0x6380)) - mstore(0x6500, 0x198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c2) - mstore(0x6520, 0x1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed) - mstore(0x6540, 0x090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b) - mstore(0x6560, 0x12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa) + mstore(0x64e0, 0x198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c2) + mstore(0x6500, 0x1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed) + mstore(0x6520, 0x090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b) + mstore(0x6540, 0x12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa) + mstore(0x6560, mload(0x6420)) mstore(0x6580, mload(0x6440)) - mstore(0x65a0, mload(0x6460)) - mstore(0x65c0, 0x172aa93c41f16e1e04d62ac976a5d945f4be0acab990c6dc19ac4a7cf68bf77b) - mstore(0x65e0, 0x2ae0c8c3a090f7200ff398ee9845bbae8f8c1445ae7b632212775f60a0e21600) - mstore(0x6600, 0x190fa476a5b352809ed41d7a0d7fe12b8f685e3c12a6d83855dba27aaf469643) - mstore(0x6620, 0x1c0a500618907df9e4273d5181e31088deb1f05132de037cbfe73888f97f77c9) - success := and(eq(staticcall(gas(), 0x8, 0x64c0, 0x180, 0x64c0, 0x20), 1), success) - success := and(eq(mload(0x64c0), 1), success) + mstore(0x65a0, 0x172aa93c41f16e1e04d62ac976a5d945f4be0acab990c6dc19ac4a7cf68bf77b) + mstore(0x65c0, 0x2ae0c8c3a090f7200ff398ee9845bbae8f8c1445ae7b632212775f60a0e21600) + mstore(0x65e0, 0x190fa476a5b352809ed41d7a0d7fe12b8f685e3c12a6d83855dba27aaf469643) + mstore(0x6600, 0x1c0a500618907df9e4273d5181e31088deb1f05132de037cbfe73888f97f77c9) + success := and(eq(staticcall(gas(), 0x8, 0x64a0, 0x180, 0x64a0, 0x20), 1), success) + success := and(eq(mload(0x64a0), 1), success) // Revert if anything fails if iszero(success) { revert(0, 0) }